SSLサーバ証明書の発行/更新時のチェック方法のメモです。
今まではissuerとsubjectのハッシュ値が同じことを確認していましたが、より確実な方法を調べました。
前提
Let's Encryptのように、証明書と中間証明書が結合されている状態の証明書です。
コマンド
openssl crl2pkcs7 -nocrl -certfile /etc/certs/hoge.example.com.crt | openssl pkcs7 -print_certs -outform PEM | awk 'BEGIN {c=0;} /BEGIN CERTIFICATE/ {c++} { print > "cert" c ".pem"}' && openssl verify -CAfile cert2.pem cert1.pem
/etc/certs/hoge.example.com.crt
は、サーバにある証明書をフルパスで指定します。
- 証明書をCRL(証明書失効リスト)を含めずにPKCS#7形式に変換。
- PKCS#7形式からPEM形式で出力。
- awkによって証明書と中間証明書に分解。
- サーバ証明書と中間証明書を分割。
を含めています。
実行結果
openssl verify -CAfile cert2.pem cert1.pem
cert1.pem: OK
と出れば、cert1.pem(サーバ証明書)がcert2.pem(中間証明書)によって正しく署名されていることを示しています。
主なエラーの意味と対策
unable to get local issuer certificate
- 意味:中間証明書またはルート証明書が見つからないか、信頼されていない。
- 対策:CAファイルに必要な中間証明書とルート証明書が含まれていることを確認します。
certificate signature failure
- 意味:証明書の署名が無効であるか、改ざんされている可能性がある。
- 対策:証明書が正しく署名されていることを確認し、証明書ファイルが改ざんされていないかチェックします。
unable to verify the first certificate
- 意味:証明書チェーンの最初の証明書(通常はサーバ証明書)が検証できない。
- 対策:CAファイルに正しい中間証明書とルート証明書が含まれていることを確認します。
self signed certificate in certificate chain
- 意味:自己署名証明書が証明書チェーンに含まれている。
- 対策:自己署名証明書が適切に信頼されているか確認します。