みなさん、こんにちは。エンジニアの坂口です。
Webサーバを構築すると、やはりSSL証明書を設定して https://なんちゃら〜 でアクセスさせたいですよね。
しかし、SSL証明書を本番サーバへインストールする前に、こんな不安はありませんか?
- 証明書と秘密鍵は本当にペアになっているのか?
- 中間CA証明書は正しいものが渡されているのか?
- TLSバージョンやCipher設定に問題はないか?
これらを本番サーバでいきなり検証するのは、少し怖いですよね。
そこで今回は、openssl を使って本番投入前に最低限チェックしておきたいポイントをまとめます。
なお、証明書は「先方(エンドユーザーや外部ベンダー)から支給されるケース」を想定しています。
想定するファイル構成
- サーバ証明書:
cert.pem - 秘密鍵:
privkey.pem - 中間CA証明書:
chain.pem
① 証明書と秘密鍵が正しいペアか確認する
まず最初に確認したいのが 「証明書と秘密鍵が本当に対応しているか」です。
これは modulus(公開鍵の値)をハッシュ化して比較することで確認できます。
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in privkey.pem | openssl md5
チェックポイント
出力される MD5ハッシュが一致していればOK 一致しない場合、その証明書と秘密鍵はペアではありません。
本番で Apache / Nginx を再起動したらエラー、という悲劇を防ぐためにも最優先でやるチェックです。
② 実サーバを立てずに HTTPS 接続テストをする
次に、ローカル環境で簡易HTTPSサーバを立てて接続テストを行います。
ローカルで簡易HTTPSサーバを起動
openssl s_server -accept 4433 \
-cert cert.pem \
-key privkey.pem \
-CAfile chain.pem
これで、ポート 4433 でHTTPSサーバが起動します。
別ターミナルから接続
openssl s_client -connect localhost:4433 -servername example.com
※ example.com は SNI確認用のサンプルドメインです。
この方法で確認できること
openssl s_client の出力から、以下のような情報をまとめて確認できます。
- TLSバージョン(TLS1.2 / TLS1.3 など)
- Cipher Suite
- SNI(Server Name Indication)
- 証明書チェーン(中間CA含む)
- 有効期限(NotBefore / NotAfter)
- Verify return code(検証結果)
つまり、 「先方から渡されたSSL証明書一式が、本当にこのドメイン・構成で問題ないか?」 を、本番サーバにアップロードする前にローカルMacのターミナルだけで検証できます。
サンプル案件での検証例
※ 実在案件・実ドメインは使用せず、すべてサンプル名に置き換えています。
使用したファイル
- サーバ証明書:
server.crt - 秘密鍵:
sample.key - 中間CA証明書:
ca.crt - サンプルドメイン:
sample-example.com
① 証明書と秘密鍵の一致確認
openssl x509 -noout -modulus -in server.crt | openssl md5
MD5(stdin)= c79bd358860a271c4a6d5877f3647e13
openssl rsa -noout -modulus -in sample.key | openssl md5
MD5(stdin)= c79bd358860a271c4a6d5877f3647e13
→ ハッシュが一致しているため問題なし
② 実サーバを立てずに HTTPS 接続テスト
ローカルHTTPSサーバを起動
openssl s_server -accept 4433 \
-cert server.crt \
-key sample.key \
-CAfile ca.crt
クライアント接続テスト
別ターミナルから実行します。
openssl s_client -connect localhost:4433 -servername sample-example.com
接続結果(抜粋)
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Verify return code: 0 (ok)
- TLS1.3 で接続できている
- Cipher も問題なし
- 証明書検証エラーなし
証明書の有効期限
NotBefore: Nov 6 00:00:00 2025 GMT
NotAfter : Nov 21 23:59:59 2026 GMT
→ 有効期限も問題ありません。
Apache での設定例(参考)ssl.conf
SSLCertificateFile /etc/pki/tls/server.crt
SSLCertificateKeyFile /etc/pki/tls/sample.key
SSLCertificateChainFile /etc/pki/tls/ca.crt
まとめ
opensslを使えば 実サーバ不要でSSL証明書の事前検証が可能- 証明書と秘密鍵の不一致は事前に確実に検出できる
- TLS / Cipher / SNI / 有効期限までまとめて確認できる
- 先方支給の証明書チェックに特に有効
「とりあえずサーバに入れてみる」ではなく、 入れる前にローカルで一度確認することで、トラブルを大幅に減らせます。
証明書を発行手続した人と、実際に導入する人が異なる場合は、特に事前チェックが大事だったりますので、よかったら実際にやってみてください!