概要
複数のサーバ証明書を作成する前提で、次の自己署名のルート証明書・サーバ証明書をコピペで作成する手順を紹介します。
実行環境として、Windows 11のWSL2で動作するUbuntu24.04.3 LTS(OpenSSL 3.0.13)を使用しています。
| ファイル名 | 説明 |
| rootca.key | ルート証明書の鍵 |
| rootca.crt | ルート証明書 |
| ${SERVER}.key | サーバ証明書の鍵 |
| ${SERVER}.crt | サーバ証明書 |
| ${SERVER}.pfx | サーバ証明書・鍵ペア(PKCS#12形式) |
手順
各手順のコマンドをコピペして、ターミナルに張り付けて実行してください。
- ルート証明書と鍵を生成します。1234567891011121314151617181920212223242526272829303132mkdir -p ~/testcertscd ~/testcerts/# ルート証明書の設定cat > rootca.cnf <<EOF[ req ]default_bits = 4096prompt = nodefault_md = sha256distinguished_name = dnx509_extensions = v3_ca[ dn ]C = JPST = TokyoL = ChiyodaO = Dev Root CAOU = DevelopmentCN = Dev Root CA[ v3_ca ]basicConstraints = critical, CA:truekeyUsage = critical, keyCertSign, cRLSignsubjectKeyIdentifier = hashauthorityKeyIdentifier = keyid:always,issuerEOF# ルート証明書の鍵を生成(パスフレーズなし)openssl genrsa -out rootca.key 4096# ルート証明書を生成openssl req -x509 -new -key rootca.key -days 10950 -out rootca.crt -config rootca.cnf
- サーバ証明書を作成するためのパラメータ(環境変数)を定義します。
追加でサーバ証明書を作成する場合、以降の手順を繰り返してください。1234SERVER=server # ファイル名に使用FQDN=www.example.comKEY_PASS=secret # 記号を含むとエラーの場合ありPFX_PASS=password # PFXファイル未使用時は適当な値で良い - サーバ証明書を作成します。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950# サーバ証明書の鍵を生成(パスフレーズあり))openssl genrsa -aes256 -passout pass:${KEY_PASS} -out ${SERVER}.key 4096# サーバ証明書の設定cat > server.cnf <<EOF[ req ]default_bits = 4096prompt = nodefault_md = sha256distinguished_name = dnreq_extensions = req_ext[ dn ]C = JPST = TokyoL = ChiyodaO = Dev ServerOU = DevelopmentCN = ${FQDN}[ req_ext ]subjectAltName = @alt_names[ alt_names ]DNS.1 = ${FQDN}EOF# CSRの生成openssl req -new -key ${SERVER}.key -out ${SERVER}.csr -config ${SERVER}.cnf -passin pass:${KEY_PASS}# CAでのCSR署名の設定cat > ${SERVER}_ext.cnf <<EOFbasicConstraints = CA:falsekeyUsage = critical, digitalSignature, keyEnciphermentextendedKeyUsage = serverAuthsubjectAltName = @alt_names[ alt_names ]DNS.1 = ${FQDN}EOF# CAによるサーバ証明書への署名openssl x509 -req -in ${SERVER}.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial \-out ${SERVER}.crt -days 10950 -sha256 -extfile ${SERVER}_ext.cnf# サーバ証明書と鍵をpfx(PKCS12)に纏めるopenssl pkcs12 -export -out ${SERVER}.pfx -inkey ${SERVER}.key -in ${SERVER}.crt \-passin pass:${KEY_PASS} -passout pass:${PFX_PASS}
動作確認
証明書の確認方法
次のコマンドでルート証明書の内容を確認できます。
1 2 3 4 5 6 7 | openssl x509 -in rootca.crt -text -noout # サーバ証明書の内容の確認 openssl x509 -in ${SERVER}.crt -text -noout # サーバ証明書の内容の確認(PFX版) openssl pkcs12 -info -in ${SERVER}.pfx -nodes |
ルート証明書の場合は次のように出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Certificate: Data: Version: 3 (0x2) Serial Number: ... Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:e9:e0:d9:5e:f6:08:ea:9f:62:e2:fd:67:80:c1: ... X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Certificate Sign, CRL Sign ... |
クライアントでの証明書エラーの解消
作成したルート証明書を「信頼されたルート証明機関」にインポートします。
※クライアントとして、Windowsを想定。
- エクスプローラにて、rootca.crtをダブルクリックします。
- 「全般」タブの「証明書のインストール」をクリックします。
- 「保存場所」で「現在のユーザー」を選択して、「次へ」をクリックします。
- 「証明書をすべて次のストアに配置する」の「証明書ストア」として「信頼されたルート証明機関」を選択し、「次へ」をクリックします。
- 「完了」をクリックします。
- 「この証明書をインストールしますか?」では「はい」をクリックします。
- エクスプローラにて、再度rootca.crtをダブルクリックします。証明書のエラーが表示されないことを確認します。
参考
- ルート証明書を作成する必要性
- Webサーバ用に自己署名のサーバ証明書を作成する場合、それぞれのサーバ証明書をクライアントの「信頼されたルート証明機関」にインポートする必要があります。
- 多数のWebサーバを使用する場合、それぞれのサーバ証明書を同様にインポートする必要があります。また、開発者が複数になると、さらに大きな負担になります。
- 各サーバ証明書をルート証明書で署名することで、このような負担を軽減できます。(ルート証明書のみのインポートで、複数のサーバ証明書のエラーを解消できます。)
- 各ファイルの用途
- 複数のサーバ証明書を作成する場合、同じrootca.key, rootca.crtを使用します。
- ブラウザで「信頼するサーバ証明書」とするために、rootca.crtをクライアントの「信頼されたルート証明機関」にインポートします。
- Apache HTTP ServerやNGINXなどでは、${SERVER}.key, ${SERVER}.crtを使用します。
- Java実行環境、Windows(IIS, Azure)などでは、${SERVER}.pfxを使用します。