TLS 1.2を明示的に要求したにもかかわらず、SSL3ハンドシェイクエラーをスローするホストをいくつか見つけました。どうしてこれなの? openssl
クライアントを間違って使用していますか?
$ openssl s_client -tls1_2 -connect id-images.vice.com:443 CONNECTED(00000003) 140735150146384:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure :s3_pkt.c:1472:SSLアラート番号40 140735150146384:error:1409E0E5:SSLルーチン:ssl3_write_bytes:sslハンドシェイクエラー:s3_pkt.c:656: --- 使用可能なピア証明書がありません --- 送信されたクライアント証明書CA名がありません --- SSLハンドシェイクが7バイトを読み取り、0バイトを書き込みました --- 新規、(なし)、暗号は(なし) 安全な再ネゴシエーションISサポートされていません 圧縮:なし 拡張:なし 交渉されたALPNなし SSL-Session: プロトコル:TLSv1.2 暗号:0000 セッションID: セッションID-ctx: マスターキー: キー-組織:なし PSK ID:なし PSK IDヒント:なし SRPユーザー名:なし 開始時間:1444078671 タイムアウト:7200(秒) 戻りコードを確認:0(ok) ---
SSL/TLSでは、クライアントは特定のプロトコルバージョンを要求しません。クライアントがサポートする最大プロトコルバージョンをクライアントがアナウンスし、次にサーバーが使用するプロトコルバージョンを選択します。クライアントは「TLS 1.2を使用しましょう」とは言わない。それは「私は知っているまでTLS 1.2」と言います。
クライアントmayには独自の追加要件がありますが、ClientHello
メッセージでそれらを述べる余地はありません。クライアントがTLS 1.2のみを実行する場合は、ClientHello
、、およびで「TLS 1.2まで」を閉じる必要があります。サーバーが「TLS 1.2を実行しましょう」以外のメッセージで応答した場合の接続。あなたのケースでは、物事はその点にさえ到達しませんでした:サーバーは致命的なアラート40( "handshake_failure"、 標準 を参照)で応答しました。 @ dave_thompson_085が指摘するように、これは [〜#〜] sni [〜#〜] の欠如が原因です:これは、クライアントがClientHello
メッセージに文書化するための拡張機能ですターゲットサーバーのname。一部のサーバーでは、同じIPアドレスでSSL対応のサイトをいくつかホストし、使用する証明書を知るためにそのパラメーターが必要なため、SNIが必要です。コマンドラインツールopenssl s_client
は、明示的な-servername
オプション。
@Steffenが説明したように、SSL 3.0とすべてのTLSバージョンは非常によく似ており、同じレコード形式を使用するため(少なくともハンドシェイクの初期段階では)、OpenSSLは同じ機能を再利用する傾向があります。サーバーはServerHello
でまったく応答しないため、プロトコルバージョンはまだ選択されておらず、SSL 3.0は、少なくとも概念的には、ハンドシェイクのその初期の時点で可能性があることに注意してください。
ssl3_read_bytes
およびssl3_writes_bytes
は、SSL3スタイルのフレームを扱います。これらは以降のバージョン、つまりTLS1.xでも同じです。したがって、それらの名前が異なることを示唆している場合でも、同じ関数が使用されます。特定のtls1_read_bytes
関数などはありません。