web-dev-qa-db-ja.com

有効な証明書でのJDK 11 SSLエラー(以前のバージョンで動作)

次のコードは、JDK 11でエラーをスローします。

    HttpURLConnection con = (HttpURLConnection) new URL("https://sis.redsys.es/sis/realizarPago").openConnection();
    con.setRequestMethod("GET");
    con.getResponseCode();

エラーは次のとおりです。

javax.net.ssl.SSLHandshakeException: extension (10) should not be presented in server_hello
at Java.base/Sun.security.ssl.Alert.createSSLException(Alert.Java:128)
at Java.base/Sun.security.ssl.Alert.createSSLException(Alert.Java:117)
at Java.base/Sun.security.ssl.TransportContext.fatal(TransportContext.Java:312)
at Java.base/Sun.security.ssl.TransportContext.fatal(TransportContext.Java:268)
at Java.base/Sun.security.ssl.TransportContext.fatal(TransportContext.Java:259)
at Java.base/Sun.security.ssl.SSLExtensions.<init>(SSLExtensions.Java:71)
at Java.base/Sun.security.ssl.ServerHello$ServerHelloMessage.<init>(ServerHello.Java:169)
at Java.base/Sun.security.ssl.ServerHello$ServerHelloConsumer.consume(ServerHello.Java:860)
at Java.base/Sun.security.ssl.SSLHandshake.consume(SSLHandshake.Java:390)
at Java.base/Sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.Java:445)
at Java.base/Sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.Java:422)
at Java.base/Sun.security.ssl.TransportContext.dispatch(TransportContext.Java:178)
at Java.base/Sun.security.ssl.SSLTransport.decode(SSLTransport.Java:164)
at Java.base/Sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.Java:877)
at Java.base/Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:810)
at Java.base/Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:383)
at Java.base/Sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.Java:567)

以前のJDKで動作していました(7、8、9、10でテストしました)。

ブラウザーまたはインターネットで見つかったほとんどのSSLテストで認識されているため、証明書は有効なようです。

ホスト名検証の無効化、cacertsの無効化、DigiCertをcacertsファイルに追加しようと試みましたが、うまくいきません。

OpenJDKのバグのようです。ビルド26、27、28でテスト済み(リリース候補)。

10
cocorossello

この問題は現在、JDK 12 https://bugs.openjdk.Java.net/browse/JDK-8209965 で解決されており、ea-9に含まれていました。

JDK 11へのバックポートも解決されました https://bugs.openjdk.Java.net/browse/JDK-8210005

  • 11.0.3(Oracle JDK)
  • 11.0.2(OpenJDK)

これについての背景は、ここのコメントで見つけることができます https://github.com/openssl/openssl/pull/4463/files

TLS 1.3はEncryptedExtensionsメッセージでサポートされているグループのリストをクライアントに示すためのサーバーのスキームを追加しますが、ServerHelloでsupported_groupsを送信することを許可する関連仕様はありません。

それでも(おそらく、ServerHelloで許可されている「ec_point_formats」拡張機能に近いため)、とにかくServerHelloでこの拡張機能を送信するサーバーがいくつかあります。

1.1.0リリースまでは、許可されていない拡張機能の存在を確認しなかったため、回帰を回避するために、TLS 1.2 ServerHelloでもこの拡張機能を許可する必要があります。

11
muttonUp

2019年1月16日にリリースされたJDK 11.0.2で解決されました

0
cocorossello