概要
複数のサーバ証明書を作成する前提で、次の自己署名のルート証明書・サーバ証明書をコピペで作成する手順を紹介します。
実行環境として、Windows 11のWSL2で動作するUbuntu24.04.3 LTS(OpenSSL 3.0.13)を使用しています。
| ファイル名 | 説明 |
| rootca.key | ルート証明書の鍵 |
| rootca.crt | ルート証明書 |
| ${SERVER}.key | サーバ証明書の鍵 |
| ${SERVER}.crt | サーバ証明書 |
| ${SERVER}.pfx | サーバ証明書・鍵ペア(PKCS#12形式) |
手順
各手順のコマンドをコピペして、ターミナルに張り付けて実行してください。
- ルート証明書と鍵を生成します。
mkdir -p ~/testcerts cd ~/testcerts/ # ルート証明書の設定 cat > rootca.cnf <<EOF [ req ] default_bits = 4096 prompt = no default_md = sha256 distinguished_name = dn x509_extensions = v3_ca [ dn ] C = JP ST = Tokyo L = Chiyoda O = Dev Root CA OU = Development CN = Dev Root CA [ v3_ca ] basicConstraints = critical, CA:true keyUsage = critical, keyCertSign, cRLSign subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer EOF # ルート証明書の鍵を生成(パスフレーズなし) openssl genrsa -out rootca.key 4096 # ルート証明書を生成 openssl req -x509 -new -key rootca.key -days 10950 -out rootca.crt -config rootca.cnf - サーバ証明書を作成するためのパラメータ(環境変数)を定義します。
追加でサーバ証明書を作成する場合、以降の手順を繰り返してください。SERVER=server # ファイル名に使用 FQDN=www.example.com KEY_PASS=secret # 記号を含むとエラーの場合あり PFX_PASS=password # PFXファイル未使用時は適当な値で良い - サーバ証明書を作成します。
# サーバ証明書の鍵を生成(パスフレーズあり)) openssl genrsa -aes256 -passout pass:${KEY_PASS} -out ${SERVER}.key 4096 # サーバ証明書の設定 cat > server.cnf <<EOF [ req ] default_bits = 4096 prompt = no default_md = sha256 distinguished_name = dn req_extensions = req_ext [ dn ] C = JP ST = Tokyo L = Chiyoda O = Dev Server OU = Development CN = ${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 <<EOF basicConstraints = CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @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}
動作確認
証明書の確認方法
次のコマンドでルート証明書の内容を確認できます。
openssl x509 -in rootca.crt -text -noout
# サーバ証明書の内容の確認
openssl x509 -in ${SERVER}.crt -text -noout
# サーバ証明書の内容の確認(PFX版)
openssl pkcs12 -info -in ${SERVER}.pfx -nodesルート証明書の場合は次のように出力されます。
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を使用します。