I came back to using Chrome with my MQ Web browser. It was working last week, but yesterday and today it stopped working. In debugging it, I’ve learned even more ways of checking TLS handshakes to see why they fail!
Using Wireshark packet trace on Linux, and TLS trace in the web server, I could see the Client Hello, Server hello, worked; but the response was Chrome giving NET::ERR_CERT_INVALID, and the traces showing Alert Level: Fatal, Description: Certificate Unknown.
- I had been through the checks to make sure the CA was in the client key store.
- I double checked, and tripled checked to make sure it was the right CA.
- I exported the z/OS CA certificate, downloaded it and imported it.
- I displayed the z/OS version, and the Chrome keystore’s version and they matched ( ok – the not-after and not-before times were different due to different time zones).
- I shut every thing down and restarted it the next day.
- I felt like screaming “AHH -it worked last week it works on FireFox – it should all work on Chrome”
After a day working in the garden, I had time to consider a different approach.
How I traced the problem down.
From your browser you can display the “problem” certificate by clicking on the icon in front of the URL. You get into “certificate viewer”. There is a “General” display which shows you useful information about the certificate. There is also the “Details”. At the bottom of the Details is a button labelled “Export”. Click it and export the certificate to a file such as SERVER.PEM.
You can now use openssl on this. For example
openssl x509 -in ~/Downloads/SERVER.cert.bad -text -noout|less
This shows you all the details of the certificate, so you can check them again!
You can also export the CA you think is being used, from the browser keystore, eg CA.pem
You can use the openssl verify command to do its validation of the server certificate and the CA certificate.
openssl verify -CAfile ca.pem -show_chain ~/Downloads/SERVER.cert
worked, it gave
OK Chain: depth=0: O = ZZZZ, OU = SSS, CN = SERVER (untrusted) depth=1: O = TEMP, OU = TEST, CN = TEMP4Certification Authority
Which shows the server certificate, and the CA certificate were OK. However the same command with -x509_strict gave
openssl verify -CAfile ca.pem -show_chain -x509_strict ~/Downloads/SERVER.cert
O = ZZZZ, OU = SSS, CN = SERVER
error 24 at 0 depth lookup: invalid CA certificate
error /home/colinpaice/Downloads/SERVER.cert.bad: verification failed
I felt I was on the trail of the problem.
Depth 0 is the server certificate. Depth 1 is the signers certificate, Depth 2 is the next level up. It was strange that it said the server certificate was an invalid CA.
Looking in the openssl source openssl/crypto/x509/x509_vfy.c showed several lines giving the error code X509_V_ERR_INVALID_CALL.
It turns out that the server’s certificate had been configured to to “certsign” (I had mis-copied a line in the certificates definition from an earlier test). Certsign means the certificate is a CA because it can sign things – but the CA flag was not set in the certificate – so clearly it was a bad_certificate. The validation failed – as it failed the consistency check it reported unknown certificate, and I was getting very frustrated.
What keyusage is required?
Any keyusage from no keysusage to KEYUSAGE( DATAENCRYPT, DOCSIGN, HANDSHAKE) works.
Just do not use KEYUSAGE(
Recreate the certificate, and add it to the key store, and use
to get the MQ web server to pick up the change to the keystore. You may need to restart your web browser.
I think this is a useful technique which I will use in the future when I stumble over the next TLS set up problem.
3 thoughts on “Are you going crazy with Chrome giving fatal: certificate_unknown, bad_certificate NET::ERR_CERT_INVALID? Me too!”
Thanks a lot Colin – I had the very exact issue and fixed it as per your solution.
Hi, Im glad it helped – it makes my struggles all worth while