Java 11 RC build - HTTPS handshake failure against a previously working server
Xuelei Fan
xuelei.fan at oracle.com
Sat Aug 25 14:40:54 UTC 2018
Hi Jaikiran,
Could you build JDK 11 or JDK 12 from source code? I had a patch to
tolerate the extension in ServerHello handshake message. Please let me
know if it works or not.
If there are any other JDK 11 TLS problems with Apache Ant project, I'd
like to know as well.
Thanks,
Xuelei
On 8/25/2018 7:04 AM, Jaikiran Pai wrote:
> Hi Xuelei,
>
>
> On 25/08/18 7:20 PM, Xuelei Fan wrote:
>> Sending "supported_groups" in ServerHello does not comply to the
>> extension specification.
>
> Agreed. However, given that both the client and server are using TLSv1.2
> and this seems to be "working" before the newer TLSv1.3 changes, even in
> recent JDK versions, is there a way the implementation could workaround
> this so as to allow JDK 11 to communicate with such servers?
>
>> Is it possible the HTTPS server fix this problem?
>
> I don't have access or control over that server, so don't really know
> how it's configured or whether it can be fixed. It's a pretty frequently
> used Maven repository hosted by the JBoss (Red Hat middleware) project
> team. I suspect, it's not just limited to this server and could be a
> common issue with some other servers too.
>
>
>> I filed a bug in OpenJDK for the tracking:
>> https://bugs.openjdk.java.net/browse/JDK-8209965
>
> Thank you.
>
> -Jaikiran
>
>>
>> Thanks,
>> Xuelei
>>
>> On 8/25/2018 5:03 AM, Jaikiran Pai wrote:
>>> As noted in that exception message, it appears that the server is
>>> sending a "supported_groups" extension in its ServerHello message
>>> (TLSv1.2). Reading about it, this seems to be a common issue with
>>> certain servers and certain SSL implementations have added support to be
>>> lenient with such servers
>>> https://github.com/openssl/openssl/pull/4463/files
>>>
>>> -Jaikiran
>>>
>>>
>>> On 25/08/18 11:58 AM, Jaikiran Pai wrote:
>>>> While testing the recently released RC of JDK11 against the Apache Ant
>>>> project, I happened to run into an odd error. I have now been able to
>>>> reproduce this using the following, pretty trivial code:
>>>>
>>>> import java.net.URL;
>>>> import java.io.InputStream;
>>>>
>>>> public class Fetch {
>>>> public static void main(final String[] args) throws Exception {
>>>> final URL targetURL = new
>>>> URL("https://repository.jboss.org/nexus/content/groups/public/javax/media/jai-core/1.1.3/jai-core-1.1.3.pom");
>>>>
>>>> try (final InputStream is =
>>>> targetURL.openConnection().getInputStream()) {
>>>> is.read();
>>>> }
>>>> System.out.println("Done");
>>>> }
>>>> }
>>>>
>>>> All it does is opens a (HTTPS) connection against an endpoint to read
>>>> some content. This code works fine in Java 8 and even Java 10. I'm
>>>> pretty sure this was working fine even in Java 11 early access builds,
>>>> but I don't have any such build/binary at hand to be certain.
>>>>
>>>> However, using the latest (OpenJDK) RC of Java 11 (both on Mac OS and
>>>> Linux) downloaded from[1]:
>>>>
>>>> openjdk version "11" 2018-09-25
>>>> OpenJDK Runtime Environment 18.9 (build 11+28)
>>>> OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
>>>>
>>>> it fails with:
>>>>
>>>>
>>>> Exception in thread "main" 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:308)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.SSLExtensions.<init>(SSLExtensions.java:71)
>>>> at
>>>> java.base/sun.security.ssl.ServerHello$ServerHelloMessage.<init>(ServerHello.java:173)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.ServerHello$ServerHelloConsumer.consume(ServerHello.java:864)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
>>>> at
>>>> java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421)
>>>>
>>>> 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:1152)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063)
>>>>
>>>> at
>>>> java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)
>>>>
>>>> at
>>>> java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
>>>>
>>>> at
>>>> java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
>>>>
>>>> at
>>>> java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1581)
>>>>
>>>> at
>>>> java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1509)
>>>>
>>>> at
>>>> java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:245)
>>>>
>>>> at Fetch.main(Fetch.java:7)
>>>>
>>>>
>>>> [1] http://jdk.java.net/11/
>>>>
>>>> -Jaikiran
>>>>
>>>>
>>>>
>>>>
>>>
>
>
-------------- next part --------------
diff -r 76a51e26d0ac src/java.base/share/classes/sun/security/ssl/SSLExtensions.java
--- a/src/java.base/share/classes/sun/security/ssl/SSLExtensions.java Fri Aug 17 17:13:12 2018 +0200
+++ b/src/java.base/share/classes/sun/security/ssl/SSLExtensions.java Sat Aug 25 07:32:28 2018 -0700
@@ -65,38 +65,53 @@
"): no sufficient data");
}
+ boolean isSupported = true;
SSLHandshake handshakeType = hm.handshakeType();
if (SSLExtension.isConsumable(extId) &&
SSLExtension.valueOf(handshakeType, extId) == null) {
- hm.handshakeContext.conContext.fatal(
+ if (extId == SSLExtension.CH_SUPPORTED_GROUPS.id &&
+ handshakeType == SSLHandshake.SERVER_HELLO) {
+ // Note: It does not comply to the specification. However,
+ // there are servers that send the supported_groups
+ // extension in ServerHello handshake message.
+ isSupported = false;
+ if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
+ SSLLogger.warning(
+ "Buggy supported_groups in ServerHello");
+ }
+ } else {
+ hm.handshakeContext.conContext.fatal(
Alert.UNSUPPORTED_EXTENSION,
"extension (" + extId +
") should not be presented in " + handshakeType.name);
+ }
}
- boolean isSupported = false;
- for (SSLExtension extension : extensions) {
- if ((extension.id != extId) ||
- (extension.onLoadConsumer == null)) {
- continue;
- }
+ if (isSupported) {
+ isSupported = false;
+ for (SSLExtension extension : extensions) {
+ if ((extension.id != extId) ||
+ (extension.onLoadConsumer == null)) {
+ continue;
+ }
- if (extension.handshakeType != handshakeType) {
- hm.handshakeContext.conContext.fatal(
- Alert.UNSUPPORTED_EXTENSION,
- "extension (" + extId + ") should not be " +
- "presented in " + handshakeType.name);
- }
+ if (extension.handshakeType != handshakeType) {
+ hm.handshakeContext.conContext.fatal(
+ Alert.UNSUPPORTED_EXTENSION,
+ "extension (" + extId + ") should not be " +
+ "presented in " + handshakeType.name);
+ }
- byte[] extData = new byte[extLen];
- m.get(extData);
- extMap.put(extension, extData);
- if (logMap != null) {
- logMap.put(extId, extData);
+ byte[] extData = new byte[extLen];
+ m.get(extData);
+ extMap.put(extension, extData);
+ if (logMap != null) {
+ logMap.put(extId, extData);
+ }
+
+ isSupported = true;
+ break;
}
-
- isSupported = true;
- break;
}
if (!isSupported) {
More information about the security-dev
mailing list