it-swarm.com.ru

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 (релиз-кандидат).

8
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 (этап Q2 + 2019)

Некоторые предпосылки для этого можно найти в комментариях здесь https://github.com/openssl/openssl/pull/4463/files

TLS 1.3 добавляет схему для сервера, чтобы указать клиенту свой список поддерживаемых групп в Сообщение EncryptedExtensions, но не релевантное Спецификации позволяют отправлять support_groups в ServerHello.

Тем не менее (возможно, из-за непосредственной близости к расширению "Ec_point_formats", которое разрешено в ServerHello), Есть несколько серверов, которые отправляют это расширение в ServerHello в любом случае. 

До версии 1.1.0 включительно, мы не проверяли наличие недопустимых расширений, поэтому, чтобы избежать регрессии, мы должны разрешить это расширение в TLS 1.2 Server также привет.

9
muttonUp

Теперь это решено в JDK 11.0.2, выпущенном 16 января 2019 года.

0
cocorossello