OpenSSLでTLS証明書を作るには?(サーバーのみ / CA署名 / mTLS)
ObjectDeliverer の TLS 通信で使う証明書は、OpenSSL でも作成できます。
ここでは、用途別に3パターンの最小手順をまとめます。
前提:
- OpenSSL が使える環境(macOS / Linux / WSL など)
InitializeTls(...)で使うホスト名/IP と、証明書の SAN(subjectAltName)を一致させること
1. サーバー証明書のみ作成(自己署名)
開発環境で「自己署名 + 公開鍵ピンニング」を使う想定です。
mkdir -p tls/pattern1 && cd tls/pattern1
# 1) サーバー秘密鍵
openssl genrsa -out server.key 2048
# 2) 証明書設定(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) 自己署名サーバー証明書
openssl req -x509 -new -key server.key -sha256 -days 365 \
-out server.crt -config server.cnf
# 4) 公開鍵ハッシュ(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 設定例:
- サーバー:
server.crt+server.key - クライアント:
WithCertificateVerification()WithAllowSelfSignedCertificates(true)WithPinnedPublicKeyFromFile(".../server.pubkey.txt")
2. CA証明書とサーバー証明書を作成(CA署名)
本番/社内環境でよく使う構成です。
mkdir -p tls/pattern2 && cd tls/pattern2
# 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) サーバー鍵と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) SAN/用途付きでCA署名
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 設定例:
- サーバー:
server.crt+server.key - クライアント:
WithCertificateVerification()WithTrustedCaCertificate(".../ca.crt")
3. CA証明書 + サーバー証明書 + mTLS用クライアント証明書
相互認証(mTLS)でクライアントも証明書認証したい場合です。
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) サーバー証明書(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) クライアント証明書(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 設定例:
- サーバー:
CreateProtocolTcpIpServerTls(..., server.crt, server.key, ...)WithClientAuthMode(Required)(またはOptional)WithClientCaBundle(".../ca.crt")
- クライアント:
WithCertificateVerification()WithTrustedCaCertificate(".../ca.crt")WithClientCertificate(".../client.crt", ".../client.key")
最低限の確認コマンド
# サーバー証明書のSAN/用途
openssl x509 -in server.crt -noout -text | grep -E "Subject:|DNS:|IP Address|Extended Key Usage"
# CA署名チェーン確認(パターン2/3)
openssl verify -CAfile ca.crt server.crt
openssl verify -CAfile ca.crt client.crt
補足:
- 自己署名(パターン1)は pinning なしで運用しないでください。
- 本番では秘密鍵の保管・権限管理・ローテーション手順を必ず定義してください。