2026年8月19日
2026年8月19日
telnet で TLS は確認できる?ポート疎通から openssl s_client での TLS 確認までのコマンド集
telnet は TLS のハンドシェイクができないため、telnet だけで TLS や証明書を確認することはできません。telnet で分かるのは「そのポートに TCP で接続できるか」までで、TLS の確認は openssl s_client などの TLS 対応ツールに引き継ぐ必要があります。この記事では、telnet(と代替コマンド)で TCP の疎通を確かめ、続けて openssl で TLS のバージョン・証明書・STARTTLS を確認する流れを、Web とメールの両方についてまとめます。
telnet で分かること・分からないこと
telnet は、指定したホストとポートに TCP 接続を張り、入力した文字をそのまま送るだけのツールです。そのため、次のように役割を分けて考えます。
- telnet で分かること:TCP の接続ができるか(ファイアウォールや待ち受けの有無)、平文のプロトコルならサーバーの最初の応答(SMTP のバナーなど)
- telnet で分からないこと:TLS のバージョン、証明書の内容や有効期限、証明書チェーンが正しいか、暗号スイート
443 番ポートに telnet で接続して「Connected」と出ても、それは TCP がつながったというだけで、HTTPS が正しく動いている保証にはなりません。逆に、TLS の問題を調べる前に TCP の疎通を確かめておくと、「そもそも届いていない」のか「届いているが TLS で失敗している」のかを最初に切り分けられます。
手順1:TCP の疎通を確かめる
telnet example.com 443
結果の読み方は次のとおりです。
Connected to example.com.… TCP 接続に成功。何も入力せず、Ctrl+] を押してからquitで抜けますConnection refused… 相手のホストには届いているが、そのポートで待ち受けていない(サービス停止、ポート番号の誤り)- 応答がないまま時間切れ … 途中のファイアウォールで破棄されている、経路の問題、または相手のホストが停止している
telnet が入っていない環境も増えています。Windows では telnet クライアントは既定で無効になっているため、PowerShell の次のコマンドを使うほうが手軽です。
Test-NetConnection example.com -Port 443
結果の TcpTestSucceeded が True なら TCP 接続は成功しています。Linux や macOS では nc(netcat)でも確認できます。
nc -vz example.com 443
-z は接続だけ試してデータを送らない指定、-v は結果の表示です。netcat には実装の異なる版がいくつかあり、オプションの意味が少し違うことがあるので、man nc で確認してください。
手順2:openssl s_client で TLS を確認する
TCP が通ったら、TLS の確認に移ります。
openssl s_client -connect example.com:443 -servername example.com < /dev/null
-servername は SNI(接続先のホスト名)を送る指定です。1 台のサーバーで複数のサイトを動かしている場合、SNI がないと別のサイトの証明書が返ってくることがあります。比較的新しい OpenSSL では -connect のホスト名から SNI を自動で送りますが、明示しておくと読み違いがありません。< /dev/null は、接続後に入力待ちで止まらないようにするためのものです。
出力で確認するところは次のとおりです。
Certificate chain… サーバーが送ってきた証明書の並び。中間証明書が含まれているかVerify return code: 0 (ok)… 証明書の検証に成功。0 以外ならその後ろのメッセージが原因の手がかりです(例:期限切れ、発行者の証明書が見つからない)ProtocolとCipher… 実際に使われた TLS のバージョンと暗号スイート
出力が長いときは -brief を付けると要点だけ表示されます。
証明書の有効期限と対象ドメインを見る
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -ext subjectAltName
notBefore と notAfter が有効期間、subjectAltName が証明書の対象となるドメインの一覧です。-ext オプションは OpenSSL 1.1.1 以降で使えます。古い版では -text で全体を表示して探してください。
中間証明書の不足を確認する
ブラウザでは問題なく表示されるのに、一部のアプリや古い端末でだけエラーになる場合は、中間証明書の送り忘れを疑います。
openssl s_client -connect example.com:443 -servername example.com -showcerts < /dev/null
-showcerts でサーバーが送ってくる証明書をすべて表示し、サーバー証明書の次に中間証明書が続いているかを確認します。ブラウザは中間証明書を補完できることがあるため、ブラウザでの表示だけでは判断できません。
TLS のバージョンを指定して試す
openssl s_client -connect example.com:443 -servername example.com -tls1_2 < /dev/null
openssl s_client -connect example.com:443 -servername example.com -tls1_3 < /dev/null
古い TLS を無効にしたあとの確認や、特定のクライアントだけ接続できない原因の切り分けに使います。手元の OpenSSL 自体が古いバージョンの TLS を無効にしてビルドされていることもあるので、接続できないときは手元側の制限も疑ってください。
HTTP/2 を使えるかは -alpn h2 を付けて、出力の ALPN protocol を見ると分かります。
手順3:メールサーバーの STARTTLS を確認する
メールでは、平文で接続してから途中で TLS に切り替える STARTTLS と、最初から TLS で接続する方式(いわゆる暗黙の TLS)の二通りがあります。ポートの組み合わせの目安は次のとおりです。
- SMTP 送信:587 番(STARTTLS)、465 番(暗黙の TLS)
- サーバー間の SMTP:25 番(STARTTLS)
- IMAP:143 番(STARTTLS)、993 番(暗黙の TLS)
- POP3:110 番(STARTTLS)、995 番(暗黙の TLS)
STARTTLS の場合は、最初は平文なので telnet で「STARTTLS に対応していると表明しているか」まで確認できます。
telnet mail.example.com 587
220 で始まるバナーが返ったら、EHLO client.example.com と入力します。応答に 250-STARTTLS が含まれていれば、サーバーは STARTTLS に対応しています。確認したら QUIT で切断します。
ここから先の TLS 部分は openssl で確認します。
# SMTP の STARTTLS
openssl s_client -connect mail.example.com:587 -starttls smtp -crlf < /dev/null
# IMAP の STARTTLS
openssl s_client -connect mail.example.com:143 -starttls imap < /dev/null
# 暗黙の TLS(465 / 993 / 995)は -starttls なしで接続
openssl s_client -connect mail.example.com:993 -servername mail.example.com < /dev/null
-crlf は改行を CRLF で送る指定で、SMTP サーバーとの対話で必要になることがあります。確認項目は Web の場合と同じで、Verify return code と証明書の対象ドメインを見ます。メールサーバーの証明書が mail.example.com ではなくサーバー会社の共用ホスト名で発行されている、というのはよくある不一致です。
openssl 以外の選択肢
GnuTLS が入っている環境では gnutls-cli でも同様の確認ができます。
gnutls-cli -p 443 example.com
gnutls-cli --starttls-proto=smtp -p 587 mail.example.com
サーバーが受け付ける暗号スイートを一覧で見たい場合は、nmap --script ssl-enum-ciphers -p 443 example.com のようなスキャンツールもあります。スキャンは相手のサーバーから攻撃と見なされることがあるため、自分が管理するサーバーに限って使ってください。HTTPS の Web サイトであれば、curl の -v オプションでもハンドシェイクの結果と証明書の概要を確認できます。
コマンドのオプション名は OpenSSL や GnuTLS のバージョンによって変わることがあります(2026年10月現在)。手元の環境で openssl version を確認し、openssl s_client -help で使えるオプションを見てから実行してください。
まとめ
- telnet は TLS を扱えないため、分かるのは TCP の疎通と平文プロトコルの最初の応答までです
- TCP の確認は telnet、Windows なら
Test-NetConnection、Linux や macOS ならnc -vzでも行えます - TLS は
openssl s_client -connect ホスト:ポート -servername ホストで確認し、Verify return code、証明書チェーン、有効期限、subjectAltNameを見ます - メールの STARTTLS は、telnet で
250-STARTTLSの表明を確認し、続けてopenssl s_client -starttls smtpなどで TLS 部分を確認します - スキャン系のツールは自分が管理するサーバーにだけ使います