web-dev-qa-db-ja.com

TLS 1.2を使用して接続を要求するときのSSL3エラー

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)
 --- 
19
richid

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は、少なくとも概念的には、ハンドシェイクのその初期の時点で可能性があることに注意してください。

34
Thomas Pornin

ssl3_read_bytesおよびssl3_writes_bytesは、SSL3スタイルのフレームを扱います。これらは以降のバージョン、つまりTLS1.xでも同じです。したがって、それらの名前が異なることを示唆している場合でも、同じ関数が使用されます。特定のtls1_read_bytes関数などはありません。

9
Steffen Ullrich