How can I create TLS certificates with OpenSSL? (Server only / CA-signed / mTLS)
You can prepare TLS certificates for ObjectDeliverer using OpenSSL.
This page shows minimal steps for three common patterns.
Prerequisites:
- OpenSSL available on your environment (macOS / Linux / WSL, etc.)
- SAN (
subjectAltName) must match the hostname/IP you pass toInitializeTls(...)
1. Server certificate only (self-signed)
Use this for development with self-signed cert + public key pinning.
mkdir -p tls/pattern1 && cd tls/pattern1
# 1) Server private key
openssl genrsa -out server.key 2048
# 2) Certificate config (SAN: localhost / 127.0.0.1)
cat > server.cnf <<'EOF'
[req]
distinguished_name = dn
x509_extensions = v3_req
prompt = no
[dn]
C = JP
O = ObjectDeliverer
CN = localhost
[v3_req]
subjectAltName = @alt_names
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1
EOF
# 3) Self-signed server certificate
openssl req -x509 -new -key server.key -sha256 -days 365 \
-out server.crt -config server.cnf
# 4) Public key hash (for WithPinnedPublicKeyFromFile)
openssl x509 -in server.crt -pubkey -noout \
| openssl pkey -pubin -outform DER \
| openssl dgst -sha256 -binary \
| xxd -p -c 32 \
| sed 's/../&:/g; s/:$//' > server.pubkey.txt
ObjectDeliverer setup:
- Server:
server.crt+server.key - Client:
WithCertificateVerification()WithAllowSelfSignedCertificates(true)WithPinnedPublicKeyFromFile(".../server.pubkey.txt")
2. CA certificate + server certificate (CA-signed)
Common setup for production/private networks.
mkdir -p tls/pattern2 && cd tls/pattern2
# 1) CA (self-signed root)
openssl genrsa -out ca.key 4096
openssl req -x509 -new -key ca.key -sha256 -days 3650 \
-out ca.crt -subj "/C=JP/O=ObjectDeliverer/CN=ObjectDeliverer Test CA"
# 2) Server key + CSR
openssl genrsa -out server.key 2048
cat > server.cnf <<'EOF'
[req]
distinguished_name = dn
prompt = no
[dn]
C = JP
O = ObjectDeliverer
CN = localhost
EOF
openssl req -new -key server.key -out server.csr -config server.cnf
# 3) Sign with CA (with SAN and EKU)
cat > server.ext <<'EOF'
basicConstraints=CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names
[alt_names]
DNS.1=localhost
IP.1=127.0.0.1
EOF
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 825 -sha256 -extfile server.ext
ObjectDeliverer setup:
- Server:
server.crt+server.key - Client:
WithCertificateVerification()WithTrustedCaCertificate(".../ca.crt")
3. CA + server certificate + mTLS client certificate
Use this for mutual TLS where the server also authenticates clients.
mkdir -p tls/pattern3 && cd tls/pattern3
# 1) CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -key ca.key -sha256 -days 3650 \
-out ca.crt -subj "/C=JP/O=ObjectDeliverer/CN=ObjectDeliverer Test CA"
# 2) Server certificate (serverAuth)
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr \
-subj "/C=JP/O=ObjectDeliverer/CN=localhost"
cat > server.ext <<'EOF'
basicConstraints=CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names
[alt_names]
DNS.1=localhost
IP.1=127.0.0.1
EOF
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 825 -sha256 -extfile server.ext
# 3) Client certificate (clientAuth)
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr \
-subj "/C=JP/O=ObjectDeliverer/CN=od-client-01"
cat > client.ext <<'EOF'
basicConstraints=CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=clientAuth
EOF
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out client.crt -days 825 -sha256 -extfile client.ext
ObjectDeliverer setup:
- Server:
CreateProtocolTcpIpServerTls(..., server.crt, server.key, ...)WithClientAuthMode(Required)(orOptional)WithClientCaBundle(".../ca.crt")
- Client:
WithCertificateVerification()WithTrustedCaCertificate(".../ca.crt")WithClientCertificate(".../client.crt", ".../client.key")
Minimal validation commands
# Check SAN / EKU in server cert
openssl x509 -in server.crt -noout -text | grep -E "Subject:|DNS:|IP Address|Extended Key Usage"
# Verify CA chain (pattern 2/3)
openssl verify -CAfile ca.crt server.crt
openssl verify -CAfile ca.crt client.crt
Notes:
- Do not run pattern 1 (self-signed) without pinning.
- In production, define key storage, permissions, and rotation procedures.