SSL証明書をサーバに入れる前にやっておきたい事前チェックまとめ

みなさん、こんにちは。エンジニアの坂口です。
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 / 有効期限までまとめて確認できる
  • 先方支給の証明書チェックに特に有効

「とりあえずサーバに入れてみる」ではなく、 入れる前にローカルで一度確認することで、トラブルを大幅に減らせます。

証明書を発行手続した人と、実際に導入する人が異なる場合は、特に事前チェックが大事だったりますので、よかったら実際にやってみてください! 

  • このエントリーをはてなブックマークに追加

AUTHOR

坂口 昌己

坂口 昌己 シニアエンジニア

PHPとかCakePHPとかで色々作ってます。
今はbaserCMSとかEC-CUBEとかやってます!

こんな記事も書いています