2

I am trying to write my own web server in Java 8, and i am running into a very odd problem. Whenever i make an SSL connection with Chrome, it works just fine. When i try with Firefox (59.0.2), i was having connection problems, but only with cipher suites that use GCM. It seemed that after the SSL handshake, the request from the browser was never sent. Using wireshark, i saw that Firefox was sending Application Data in middle of the SSL handshake: From wireshark:

C = Client
S = Server

C —> S Client Hello
C <— S Server Hello, Certificate, Server Key Exchange, Server Hello Done
C —> S Client Key Exchange, Change Cipher Spec, Hello Request, Hello Request
C —> S Application Data
C <— S Change Cipher Spec
C <— S Hello Request, Hello Request

To be sure I was not misunderstanding, I checked this out with Chrome, and with Firefox without GCM cipher suites, and none of them had Application Data sent in middle of the handshake. I checked other sites, like google.com, cnn.com, etc. and they are using GCM cipher suites without any problems on Firefox, so obviously this is a problem on my side.

Java 8 does not support ALPN, so it is not a TLS False Start. Any ideas what would cause the specific problem with Firefox and not with Chrome?

  • By the way, the Hello Request marker is actually "Encrypted Handshake Message" (which likely contains a Finished message). This was fixed since Wireshark 2.4.0. – Lekensteyn Apr 26 '18 at 9:35
5

You are in fact seeing TLS False Start. The client sends application data right after its own ChangeCipherSpec and Finished messages, but before receiving the ChangeCipherSpec and Finished messages from the server.

The specification (RFC 7918) does not require the ALPN (or its predecessor, NPN) extension, this was a policy that Google implemented for Chrome. It instead imposes requirements on the cipher suite, key exchange method and protocol version. It has not an exhaustive list of forbidden or allowed combinations, but it does recommend two AES-GCM cipher suites, used with the (EC)DHE key exchange method.

As for Firefox, it used to have a preference in the past for requiring ALPN/NPN, but that that was removed in https://bugzilla.mozilla.org/show_bug.cgi?id=1321909. To disable it now, go to about:config and the security.ssl.enable_false_start preference to false.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.