はじめに
目的
本ドキュメントは「SSL handshake failed for tcp」に関するトラブル対応と理解を助けるために作成しました。特にF5 BIG-IPや各種ロードバランサ、クラウド環境で実運用中に発生するエラーの原因調査と解決策に重点を置いています。
背景
SSL/TLSハンドシェイクは、安全な通信を確立するための初期処理です。これが失敗すると、サービスの接続ができなくなり、ユーザー影響やログの増加を招きます。実運用ではネットワーク設定や証明書、製品固有の挙動など複数要因が絡みます。
対象読者
- ネットワークや運用を担当するエンジニア
- ロードバランサやアプリケーションの運用者
- SSL/TLSの基本は知っているがトラブル対応を学びたい方
本章で扱う範囲
- 本ドキュメントの目的と適用範囲
- 以降の章で説明する項目の概要(ハンドシェイクの仕組み、具体的ログの意味、よくある原因と対策)
注意事項
- 実機や製品ごとに細かな挙動が異なります。ここでは一般的な考え方と調査手順を示します。
- セキュリティに関わる設定変更は影響範囲を確認してから実施してください。
SSL/TLSハンドシェイクとは何か
概要
SSL/TLSは通信を暗号化して安全にする仕組みです。通信開始時に「ハンドシェイク」と呼ぶ段階的なやりとりで、どんな暗号方式を使うかや鍵のやりとりを決めます。ハンドシェイクが成功して初めて暗号化された通信が始まります。
ClientHello(クライアントの提案)
クライアントが最初に送るメッセージです。使いたいTLSのバージョンや暗号スイート(暗号の組み合わせ)、拡張情報を提案します。例としては「TLS1.2を使いたい」「この暗号方式が使えます」といった宣言です。
ServerHelloと証明書提示(サーバの応答)
サーバはClientHelloを受けて使うTLSバージョンや暗号スイートを選びます。続けてサーバ証明書を送ってサーバの正当性を示します。クライアントは証明書を検証し、信頼できるか確認します。
鍵交換と共通鍵生成
証明書の検証が済むと、鍵交換の手順に進みます。クライアントとサーバが安全に共通の暗号鍵を作り、それを使って以降の通信を暗号化します。鍵が確立し双方が確認すると、ハンドシェイクは完了です。
ハンドシェイク失敗の意味
「SSL handshake failed」は、このどこかで手続きが止まったことを示します。証明書が無効、対応する暗号がない、通信が途中で遮断されたなど原因は複数あります。次章で具体的な状況別の意味と対処法を説明します。
「SSL handshake failed for TCP x.x.x.x:80 -> x.x.x.x:443」とは何を意味するか
概要
このログは、平文(HTTP)を使う接続と暗号化(HTTPS/TLS)を期待する受け側との間で不整合が起きたことを示します。簡単に言うと、送信側がポート80で平文を送っているのに、受信側がポート443でTLSハンドシェイクを始めようとし、暗号化のやり取りが成立しなかった状態です。
なぜ失敗するのか(仕組みの説明)
TLSハンドシェイクは最初に「ClientHello」という暗号化の開始メッセージを送ることを前提とします。ところが送信側が単純なHTTPリクエスト(例: GET /)を送ると、受信側は期待したバイナリ形式のClientHelloを受け取れず、ハンドシェイクに失敗します。
よくある状況の具体例
- クライアントがhttp://を使いポート80へ接続する。ロードバランサやサーバ側で誤ってTLSプロファイルが割り当てられている。
- ポート変換やリダイレクト設定のミスで、平文トラフィックをTLS処理する仧。
ログの読み方と影響
ログの「TCP x.x.x.x:80 -> x.x.x.x:443」は、送信元と宛先のポートが不一致であることを示します。結果として接続は確立せず、ユーザーはページが表示されないかTLSエラーを受け取ります。
最初に確認すること(簡単な対処)
- 対象のVIP/仮想サーバで割り当てられたポートとSSLプロファイルを確認する。
- クライアントが本当にhttpとhttpsどちらで接続しているか確認する(ブラウザのURLやcurlなど)。
- ログやパケットキャプチャで最初のバイトを確認し、ClientHelloが来ているかを確認する。
この章では原因の概要と初期確認を説明しました。詳しい原因別対処は次の章で扱います。
一般的なSSLハンドシェイク失敗の主な原因
クライアント側の原因
- システム日時のずれ:端末の時計がずれていると証明書が無効と判断されます。例:数時間違うだけで「期限切れ」となることがあります。対策は時計同期(NTP)や手動設定です。
- 古いブラウザや設定不備:TLSの古いバージョンしか使えない古いブラウザは接続できません。ブラウザやOSの更新で改善します。
- セキュリティソフト/プロキシの干渉:ウイルス対策や社内プロキシが暗号通信を中継・書き換えて失敗することがあります。一時的に無効化して切り分けると原因が分かります。
サーバ側の原因
- TLSバージョンや暗号スイートの不一致:サーバが新しい暗号のみ許可、または古い暗号のみ許可するとクライアントと合わない場合があります。設定を見直し、互換性のある暗号を残すかクライアントを更新します。
- 証明書の問題:期限切れ、チェーン不備、中間証明書の未設定、ホスト名不一致などがあります。証明書の確認ツールでエラー内容を確認してください。
- SNIの不備:複数ドメインを同じIPで運用する場合、SNI(サーバ名表示)がないと正しい証明書が返らず失敗します。SNI対応を確認します。
ネットワーク/ミドルウェア側の原因
- ファイアウォールやWAFのブロック:特定のポートやTLSの特徴を持つ接続を遮断している場合があります。ログを確認し一時的にルールを緩めて検証します。
- プロキシやロードバランサの書き換え:TLS終端を行う機器が誤設定でヘッダや証明書を変えてしまうことがあります。構成を確認し直接サーバへ接続して比較してください。
- MTUやパケット断片化:まれにパケットサイズの問題でハンドシェイクが途切れることがあります。MTU調整や経路の確認で対処します。
各原因はログの確認と段階的な切り分けで見つかります。まずクライアント側の基本チェック(日時、ブラウザ更新)、次にサーバ証明書と設定、最後にネットワーク機器の検証を行ってください。












