以下代码在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(候选版本)中进行了测试。
答案 0 :(得分:11)
该问题目前已在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也是如此。
答案 1 :(得分:-1)
现在已在2019年1月16日发布的JDK 11.0.2中解决了