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 なしで運用しないでください。
  • 本番では秘密鍵の保管・権限管理・ローテーション手順を必ず定義してください。