ページ更新日:2026/06/11
openssl s_client は、SSL/TLS接続をコマンドラインから診断できる OpenSSL のサブコマンドです。
証明書チェーンの確認・有効期限のチェック・TLSバージョンのテスト・メールサーバーのSSL診断など、SSL証明書の運用に欠かせない使い方を実例つきで解説します。
openssl s_client -connect www.example.com:443 -servername www.example.com
-connect ホスト名:ポート で接続先を指定します。HTTPSの診断ではポート443を指定します。
-servername(SNI指定)は明示指定を推奨します。OpenSSL 1.1.1 以降は -connect のホスト名がDNS名であれば SNI に自動設定されますが、旧バージョン(1.1.1未満)や -connect にIPアドレスを指定した場合は SNI が送信されません。現在のWebサーバーの多くは1つのIPアドレスで複数ドメインの証明書を運用(SNI: Server Name Indication)しており、SNI なしの接続ではデフォルト証明書(別ドメインの証明書)が返されて「証明書が違う」と誤診断する原因になります。互換性と誤診断防止のため、常に明示しておくのが安全です。
注意:-servername は「サーバーにどの証明書を要求するか」の指定であって、返された証明書のホスト名(SAN/CN)が接続先と一致するかの検証は行いません。
s_client は既定では証明書チェーンの検証のみを行うため、チェーンが正しければ別ドメインの証明書でも Verify return code: 0 (ok) になります。ホスト名の一致まで検証するには -verify_hostname(OpenSSL 1.1.0以降)を、検証失敗時に接続を中断させるには -verify_return_error をあわせて指定します。
# ホスト名検証つきの接続テスト(SAN/CN 不一致なら verify エラーで停止) openssl s_client -connect www.example.com:443 -servername www.example.com -verify_hostname www.example.com -verify_return_error
接続後は対話状態になるため、Q を入力するか、ワンライナーでは echo を標準入力に渡してすぐ切断します。
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null
openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts 2>/dev/null
-showcerts を付けると、サーバーが送信する証明書チェーン(サーバー証明書+中間証明書)がすべてPEM形式で表示されます。
出力冒頭の Certificate chain セクションで、チェーンの階層を確認できます。
Certificate chain 0 s:CN = www.example.com i:C = US, O = DigiCert Inc, CN = RapidSSL TLS RSA CA G1 1 s:C = US, O = DigiCert Inc, CN = RapidSSL TLS RSA CA G1 i:C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
0 番(サーバー証明書)しか表示されない場合は中間証明書がインストールされていません。一部の環境で証明書エラーが発生する典型的な原因です。
中間証明書のインストール方法は 中間証明書のインストール をご参照ください。
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -dates
s_client の出力を openssl x509 にパイプすると、証明書の内容を整形して取り出せます。-dates で有効期間(notBefore / notAfter)を表示します。
# 発行者・サブジェクト・有効期限をまとめて確認 echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates # SAN(サブジェクト代替名)を確認 echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -ext subjectAltName
# TLS 1.3 で接続できるか確認 openssl s_client -connect www.example.com:443 -servername www.example.com -tls1_3 # TLS 1.2 で接続できるか確認 openssl s_client -connect www.example.com:443 -servername www.example.com -tls1_2 # 旧バージョン(TLS 1.1)が無効化されているか確認(接続失敗が正常) openssl s_client -connect www.example.com:443 -servername www.example.com -tls1_1
接続に成功すると出力末尾の Protocol と Cipher でネゴシエートされたTLSバージョンと暗号スイートを確認できます。
旧バージョン(TLS 1.0/1.1)の無効化設定は TLSバージョンの確認・設定方法 をご参照ください。
SMTP・IMAP・POP3 のメールサーバーは、平文接続から STARTTLS コマンドでTLSに切り替える方式が一般的です。-starttls オプションでプロトコルを指定して診断できます。
# SMTP(ポート25/587) openssl s_client -connect mail.example.com:587 -starttls smtp # IMAP(ポート143) openssl s_client -connect mail.example.com:143 -starttls imap # POP3(ポート110) openssl s_client -connect mail.example.com:110 -starttls pop3 # SMTPS / IMAPS / POP3S(最初からTLSのポート)は -starttls 不要 openssl s_client -connect mail.example.com:465 openssl s_client -connect mail.example.com:993
メールサーバーの証明書有効期限の確認にも、上記の | openssl x509 -noout -dates パイプがそのまま使えます。
s_client の出力には証明書検証の結果(Verify return code)が表示されます。代表的なエラーと原因は次のとおりです。
| エラー表示 | 原因と対処 |
unable to get local issuer certificate (20) |
中間証明書がサーバーに未インストール、またはクライアント側にルート証明書ストアがない。-showcerts でチェーンを確認し、中間証明書をインストール。 |
certificate has expired (10) |
証明書の有効期限切れ。証明書の更新 が必要。 |
self signed certificate (18) |
自己署名証明書が返されている。SNI未指定でデフォルト証明書が返っている場合もあるため -servername を確認。 |
Hostname mismatch (62) |
証明書のコモンネーム/SANと接続ホスト名が不一致。このエラーは -verify_hostname ホスト名 を指定した場合のみ検出されます(既定の s_client はホスト名を検証しないため、不一致でも 0 (ok) になります)。-ext subjectAltName でSANを確認。 |
Verify return code: 0 (ok) |
検証成功(正常)。 |
※ ブラウザに表示される証明書エラーの対処は SSL証明書エラーの原因と対処 もご参照ください。
-connect のホスト名がDNS名であればSNIに自動設定されますが、旧バージョン(1.1.1未満)や -connect にIPアドレスを指定した場合はSNIが送信されず、SNI運用サーバーからデフォルト証明書(別ドメインの証明書)が返されることがあります。互換性と誤診断防止のため、-connect と同じホスト名を -servername で明示することを推奨します。なお -servername はSNI(どの証明書を要求するか)の指定であり、返された証明書のホスト名(SAN/CN)が一致するかの検証は行いません。ホスト名検証まで行うには -verify_hostname を、検証失敗で接続を中断するには -verify_return_error を併用します。
openssl s_client -connect ドメイン名:443 -servername ドメイン名 -showcerts を実行し、出力の Certificate chain セクションを確認します。0番(サーバー証明書)しか表示されない場合は中間証明書が未インストールです。また Verify return code が unable to get local issuer certificate (20) の場合も中間証明書の欠落が疑われます。
-starttls オプションを使います。例:openssl s_client -connect mail.example.com:587 -starttls smtp(SMTP)、-starttls imap(IMAP/143)、-starttls pop3(POP3/110)。SMTPS(465)やIMAPS(993)のように最初からTLSのポートでは -starttls は不要です。出力を openssl x509 -noout -dates にパイプすれば有効期限も確認できます。
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -dates を実行すると、notBefore(発行日)とnotAfter(有効期限)が表示されます。echoを標準入力に渡すことで対話状態にならず、すぐに切断されます。
📌 関連ページ:
OpenSSLとは?インストール・基本コマンドから証明書管理まで完全ガイド
OpenSSLコマンド集:CSR生成・証明書確認・有効期限チェック
中間証明書のインストール
証明書ファイルの形式(PEM・DER・PKCS#12など)と変換方法
SSL証明書インストール後の動作確認
TLSバージョンの確認・設定方法