#!/usr/bin/env bash # generate_certificate.sh — Create a self-signed X.509 certificate for # open62541 OPC UA applications. Outputs DER-encoded certificate and # private-key files suitable for the demo programs in this project. # # Arguments: # $1 certs_dir — output directory for generated files (created if missing) # $2 name — identity name (e.g. "ServerLDS", "Client") # $3 uri — (optional) application URI; defaults to urn:localhost:bobink: # # Options: # -p — encrypt the private key with the given passphrase # # Produces: # /_cert.der — DER-encoded X.509 certificate # /_cert.pem — PEM-encoded X.509 certificate # /_key.der — DER-encoded RSA private key # /_key.pem — PEM-encoded RSA private key # /.cnf — OpenSSL config (intermediate, kept for reference) set -euo pipefail # Fail fast; no unset vars; catch pipe failures. passphrase="" while getopts "p:" opt; do case "$opt" in p) passphrase="$OPTARG" ;; *) echo "Usage: generate_certificate.sh [-p passphrase] [uri]" >&2 exit 1 ;; esac done shift $((OPTIND - 1)) if [ $# -lt 2 ] || [ $# -gt 3 ]; then echo "Usage: generate_certificate.sh [-p passphrase] [uri]" >&2 exit 1 fi certs_dir="$1" name="$2" cn="${name}@localhost" uri="${3:-urn:localhost:bobink:${name}}" mkdir -p "$certs_dir" cnf="$certs_dir/${name}.cnf" cat >"$cnf" </dev/null openssl x509 -in "$certs_dir/${name}_cert.pem" -outform der \ -out "$certs_dir/${name}_cert.der" if [ -n "$passphrase" ]; then openssl pkcs8 -topk8 -in "$certs_dir/${name}_key.pem" -outform der \ -out "$certs_dir/${name}_key.der" \ -passin "pass:$passphrase" -passout "pass:$passphrase" else openssl rsa -in "$certs_dir/${name}_key.pem" -outform der \ -out "$certs_dir/${name}_key.der" 2>/dev/null fi echo "Generated certificate '$name' (CN=$cn, URI=$uri):" echo " $certs_dir/${name}_cert.der" echo " $certs_dir/${name}_cert.pem" echo " $certs_dir/${name}_key.der" echo " $certs_dir/${name}_key.pem"