web-dev-qa-db-ja.com

SSLハンドシェイク:サーバーは以前のプロトコルを選択することになっていますか?

アプリケーション(Java 8)で記述)をHTTPSを使用して非常に古いサーバーに接続する必要があります。Java 8であるため、クライアントはTLSv1.2をサポートします。 TLSv1.1、TLSv1、SSLv3。もちろん、TLSv1.2は最新のプロトコルであるため、使用することをお勧めします。

ただし、サーバー(Oracle-HTTP-Server 11.1.1.7)は、TLSv1とSSLxのみをサポートします。さらに、サポートされている暗号スイートの選択肢は非常に限られていますが、TLSv1で使用できる共通のスイートが1つあります。SSL_RSA_WITH_3DES_EDE_CBC_SHA(別名TLS_RSA_WITH_3DES_EDE_CBC_SHA)。

ただし、サーバーがハンドシェイクを終了すると、直接接続は失敗します。 (クライアント側で)取得するデバッグ出力は次のようになります。

main, WRITE: TLSv1.2 Handshake, length = 265
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1.2 ALERT:  fatal, close_notify
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received fatal alert: close_notify

私には、サーバーがTLSv1にフォールバックしようとさえしないように見えます。クライアントがTLSv1.2を優先として宣言するとすぐに、サーバーはベイルアウトします。

対照的に、クライアントでTLSv1.2とTLSv1.1を明示的に無効にして、TLSv1を優先オプションにすると、ハンドシェイクは成功します。

また、TLSv1.2とTLSv1.1を認識していない別のレガシーサーバーに接続しようとしましたが、ここでは接続は期待どおりに機能します。クライアントはTLSv1.2を好むと言っており、サーバーがTLSv1を最も一般的なプロトコルとして使用することに同意しています。

main, WRITE: TLSv1.2 Handshake, length = 269
main, READ: TLSv1 Handshake, length = 85
...

質問:クライアントがサポートするTLS/SSLプロトコルのリストから選択するのはサーバーの義務ですか?サーバーのメンテナに、クライアントではなく、サーバーが誤動作していると言えますか?

1
doublep

クライアントがサポートするTLS/SSLプロトコルのリストから選択するのはサーバーの義務ですか?

クライアントは、サポートされているバージョンのリストを提供しません。クライアントは提供できる最高のバージョンを提供し、サーバーはクライアントのバージョン以下のサーバーでサポートされている最高のバージョンで応答することになっています。クライアントが低すぎるバージョンを受け入れようとしない場合、クライアントはエラーをスローして接続を閉じます。

サーバーのメンテナに、クライアントではなく、誤動作するのはサーバーであると言えますか?

あなたはそれを言うことができると思います。プロトコルはこのように特別に設計されているため、TLS 1.0を適切に実装するサーバーは、クライアントからのTLS1.2接続を処理できるはずです。残念ながら、まだ十分に壊れたTLS実装があります。

3
Steffen Ullrich