We do have a strange problem with Firefox 2 and Jetty 6.1 (a Servlet Container) using HTTPS to communicate: At some stage Firefox (FF) sends a ClientHelloV2, to which Jetty responds with a ServerHelloV3. This leads to a handshake failure for this handshake and for any subsequent attempt.
To avoid the handshake failures there are 2 options: 1.) restart FF 2.) change the servername or port, by using ssltap [1] as a proxy. [FF] --> [ssltap] --> [Jetty] That way it is possible to change the port without restarting FF and Jetty, and to debug the SSL traffic.
Both options make FF to start a SSL session, by sending a ClientHelloV3. Then everything works until we get to the same stage described above.
Question ======
Why is Firefox a ClientHelloV2, although SSL v2 is disabled in Firefox 2? Is there any work-around in Firefox, e.g. by making Firefox to start a new SSL session everytime it accesses a server? I am pretty stuck on solving our problem. Can you give me any advice, how to further investigate this problem?
Logs =====
From what I can see in the logs of ssltap, Firefox is sending some data, which might be something like a partial handshake (?). --> [ alloclen = 63 bytes (63 bytes of 63) [Wed Jan 09 12:18:41 2008] [ssl2] ClientHelloV2 { version = {0x03, 0x00} cipher-specs-length = 36 (0x24) sid-length = 0 (0x00) challenge-length = 16 (0x10) cipher-suites = { (0x000039) TLS/DHE-RSA/AES256-CBC/SHA (0x000038) TLS/DHE-DSS/AES256-CBC/SHA (0x000035) TLS/RSA/AES256-CBC/SHA (0x000033) TLS/DHE-RSA/AES128-CBC/SHA (0x000032) TLS/DHE-DSS/AES128-CBC/SHA (0x000004) SSL3/RSA/RC4-128/MD5 (0x000005) SSL3/RSA/RC4-128/SHA (0x00002f) TLS/RSA/AES128-CBC/SHA (0x000016) SSL3/DHE-RSA/3DES192EDE-CBC/SHA (0x000013) SSL3/DHE-DSS/DES192EDE3CBC/SHA (0x00feff) SSL3/RSA-FIPS/3DESEDE-CBC/SHA (0x00000a) SSL3/RSA/3DES192EDE-CBC/SHA
When I replace the keystore by another keystore provided by the Jetty distribution, Firefox will not complain about the handshake exception. Nevertheless there are handshake exceptions, and the SSL level switches from TLS to SSLv3.
Now I guess the question is: What is the difference between the two keystores? Answer: As far as I can see, the Keystore provided in the Jetty distro has expired in 2001, while my keystore is still valid (although also self-generated).
Could it be, that Firefox some is less strict regarding handshake failures, after you have told it to accept an expired certificate?
It turned out, that difference was the certificate algorithm. - DSA seems to cause the problem, with RSA there is no problem. This result can also be verified with Tomcat, so it is no Jetty-specific error.
>> Why is Firefox a ClientHelloV2, although SSL v2 is disabled in Firefox >> 2?
> This is a big question. Firefox2 has turned on a number of SSL3/TLS > extensions which require and SSL3 hello. I suspect that for some reason > you don't really have SSL2 turned off (and old profile?). We know that > we are sending SSL3 hello's because we can connect to sites that require > them.
> bob >> Logs =====
>> From what I can see in the logs of ssltap, Firefox is sending some >> data, which might be something like a partial handshake (?). >> --> [ >> alloclen = 63 bytes >> (63 bytes of 63) >> [Wed Jan 09 12:18:41 2008] [ssl2] ClientHelloV2 { >> version = {0x03, 0x00}
Bob, An SSLv2 format client hello advertising SSL 3.0 is what we send out to "TLS intolerant" servers.
Stefan, you've begun exploratory surgery on the patient, but haven't yet recorded the patient's temperature and blood pressure (IOW, the basics).
What error does FF report when trying to connect to your server?
> >> Why is Firefox a ClientHelloV2, although SSL v2 is disabled in Firefox > >> 2?
> > This is a big question. Firefox2 has turned on a number of SSL3/TLS > > extensions which require and SSL3 hello. I suspect that for some reason > > you don't really have SSL2 turned off (and old profile?). We know that > > we are sending SSL3 hello's because we can connect to sites that require > > them.
> > bob > >> Logs =====
> >> From what I can see in the logs of ssltap, Firefox is sending some > >> data, which might be something like a partial handshake (?). > >> --> [ > >> alloclen = 63 bytes > >> (63 bytes of 63) > >> [Wed Jan 09 12:18:41 2008] [ssl2] ClientHelloV2 { > >> version = {0x03, 0x00}
> Bob, An SSLv2 format client hello advertising SSL 3.0 is what we send > out to "TLS intolerant" servers.
> Stefan, you've begun exploratory surgery on the patient, but haven't yet > recorded the patient's temperature and blood pressure (IOW, the basics).
> What error does FF report when trying to connect to your server?
Hi Nelson,
I agree. Here are the basics:
First of all, I am using version 2.0.0.11. The following parameters might be of interest:security.enable_ssl2=false, security.enable_ssl3=true, security.enable_tls=true The error I am getting after a few clicks or reloads is "Could not establish an encrypted connection because certificate presented by localhost has an invalid signature."
As I mentioned this happens with DSA certificates only. RSA seems not to cause a problem. Also, I've only been able to test this on Java- based servers (Jetty, Tomcat).
> First of all, I am using version 2.0.0.11. The following parameters > might be of interest:security.enable_ssl2=false, > security.enable_ssl3=true, security.enable_tls=true > The error I am getting after a few clicks or reloads
After a few reloads? Are you saying that it works for a while and then fails? Are you able to connect to this site at all when it is using that particular certificate?
> is "Could not > establish an encrypted connection because certificate presented by > localhost has an invalid signature."
OK, so there you have the root of the problem, signatures that cannot be verified and therefore are declared invalid. The problem is either with the signature in one of the certificates in the server's cert chain, or with the signature in the server key exchange message. It would be necessary to examine the entire server cert chain to determine which of those is the case.
> As I mentioned this happens with DSA certificates only. RSA seems not > to cause a problem.
I'd guess that your answer to my questions above will be that you are not able to communicate with the https server at all while it is configured to use the DSA certificate. Assuming that guess is right, then the problem is likely that no certificate in the DSA certificate chain contains the PQG parameters for the DSA public key.
There also also other possibilities. Complete diagnosis cannot be made without the answers to the questions above and the complete server certificate chain.
> Please let me know, if there is additional information I can provide.
Did you get this DSA certificate from a professionally run CA? or did you make the cert yourself?
If you made the DSA cert yourself, then the problem is likely that the certificate (key) is incomplete or incorrectly made. Try some other approach, one that works for you. Explaining all the intricacies of DSA certs is beyond the charter of this newsgroup. Sorry.
OTOH, if you can reproduce this with a DSA cert from a real CA, then I'm willing to pursue this further.
thanks for the Info. We are indeed using a self-signed certificate. I need to get our clients some decisions made, whether we pursue this issue or not.
Nelson Bolyard wrote: > skleinei wrote, On 2008-01-17 09:44: > > [...] Here are the basics:
> > First of all, I am using version 2.0.0.11. The following parameters > > might be of interest:security.enable_ssl2=false, > > security.enable_ssl3=true, security.enable_tls=true > > The error I am getting after a few clicks or reloads
> After a few reloads? > Are you saying that it works for a while and then fails? > Are you able to connect to this site at all when it is using that > particular certificate?
> > is "Could not > > establish an encrypted connection because certificate presented by > > localhost has an invalid signature."
> OK, so there you have the root of the problem, signatures that cannot be > verified and therefore are declared invalid. The problem is either > with the signature in one of the certificates in the server's cert > chain, or with the signature in the server key exchange message. > It would be necessary to examine the entire server cert chain to > determine which of those is the case.
> > As I mentioned this happens with DSA certificates only. RSA seems not > > to cause a problem.
> I'd guess that your answer to my questions above will be that you are > not able to communicate with the https server at all while it is > configured to use the DSA certificate. Assuming that guess is right, > then the problem is likely that no certificate in the DSA certificate > chain contains the PQG parameters for the DSA public key.
> There also also other possibilities. Complete diagnosis cannot be > made without the answers to the questions above and the complete > server certificate chain.
> > Please let me know, if there is additional information I can provide.
> Did you get this DSA certificate from a professionally run CA? > or did you make the cert yourself?
> If you made the DSA cert yourself, then the problem is likely that the > certificate (key) is incomplete or incorrectly made. Try some other > approach, one that works for you. Explaining all the intricacies > of DSA certs is beyond the charter of this newsgroup. Sorry.
> OTOH, if you can reproduce this with a DSA cert from a real CA, then > I'm willing to pursue this further.