次のコードは、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でテスト済み(リリース候補)。
この問題は現在、JDK 12 https://bugs.openjdk.Java.net/browse/JDK-8209965 で解決されており、ea-9に含まれていました。
JDK 11へのバックポートも解決されました https://bugs.openjdk.Java.net/browse/JDK-8210005
これについての背景は、ここのコメントで見つけることができます 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でもこの拡張機能を許可する必要があります。
2019年1月16日にリリースされたJDK 11.0.2で解決されました