3

A CA certificate expired and was regenerated with the same private key, with the existing client certificates working in Chrome, but failing within Firefox:

An error occurred during a connection to example.com:
SSL peer was unable to negotiate an acceptable set of security parameters:

Error code: SSL_ERROR_HANDSHAKE_FAILURE_ALERT

Firefox does not prompt for the client certificate and does not send it - suspecting that something does not match the client certificate selection process.

How could this be debugged on Firefox side?
How does Firefox decide when to ask for / offer the client certificate?

Please note that [web]server certificate is working properly and is out of scope here.

What has been verified:

  • Fails both on Firefox 78 on Mac and Firefox 77 on Linux; the same client certificate that worked with the previous CA certificate is present in both Firefox instances.
  • On Mac, where the same client certificate works in Chrome and thus is present in Keychain, enabling security.osclientcerts.autoload in Firefox does not help.
  • "Acceptable client certificate CA names" match between the old and new CA certificate.
  • "Client Certificate Types" seems to be acceptable:
    New certificate: RSA sign, DSA sign, ECDSA sign
    Old certificate: RSA fixed DH, DSS fixed DH, RSA sign, DSA sign
  • Presence of v3 extensions in the CA certificate does not matter (including the setting of CA:TRUE).
  • CRL is used but has not expired, and client certificate is not revoked.
  • The serial number on the old and new CA certificate are different and seems to be large random numbers.
  • Client certificate does not seem to contain any (expired) chain certificates.
  • Regenerating the CA certificate to have validity period start before the client certificate does not help.
  • Regenerating CA certificate to be SHA1 does not help (the old CA certificate was SHA1).

Certificates

CA certificate (with X509v3 extensions; their presence / lack of it makes no difference):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            cb:b5:11:9e:17:0f:aa:30
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: <string>
        Validity
            Not Before: Jul 16 12:04:27 2020 GMT
            Not After : Apr 15 12:04:27 2030 GMT
        Subject: <string>
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c1:16:6b:74:7e:b7:d0:da:8b:7f:55:bf:ee:c3:
                    c1:c3:ff:48:8a:b2:2d:a9:48:17:f1:aa:8b:36:34:
                    21:b2:d8:22:09:7c:ba:7c:61:83:a9:0e:40:69:4c:
                    b9:ed:25:dc:e6:f0:f8:45:b6:a6:14:2f:7a:2b:bc:
                    6d:9d:d3:d7:f5:4a:bd:dc:38:ed:88:f7:47:73:0a:
                    41:6f:15:a0:83:34:55:7b:4c:39:1d:8e:de:60:1f:
                    81:df:42:f5:b5:b9:0d:f5:90:9a:c4:80:ef:a7:1c:
                    38:93:c0:83:43:9b:5b:ef:cf:30:1a:70:29:26:e5:
                    e2:35:0e:81:24:e7:97:75:d1:ae:f7:a4:bc:e7:28:
                    20:52:87:58:87:41:2f:4b:ca:cd:2d:af:08:8b:bf:
                    1f:a5:a3:e1:f3:d0:81:f1:9c:f6:36:a2:d4:8f:2e:
                    19:67:72:2d:41:2c:43:d9:4f:b5:6b:2d:60:e0:77:
                    39:2e:53:20:7d:49:fa:c0:43:f2:03:cc:17:71:93:
                    cb:42:4e:42:41:23:2e:86:7c:b1:64:dc:a3:e4:7c:
                    60:37:43:56:ed:25:c5:97:ab:4d:90:98:c9:34:48:
                    b2:bc:34:f9:fb:89:cb:20:62:25:91:cf:8f:dd:bd:
                    40:d6:03:bf:b5:fc:cd:f8:c9:db:df:25:bb:f7:17:
                    31:8d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                A8:C5:5A:EC:01:FD:DE:76:54:E1:94:97:EC:35:B6:C4:23:8A:73:FC
            X509v3 Authority Key Identifier: 
                keyid:A8:C5:5A:EC:01:FD:DE:76:54:E1:94:97:EC:35:B6:C4:23:8A:73:FC
                DirName:<string>
                serial:CB:B5:11:9E:17:0F:AA:30

            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
    Signature Algorithm: sha256WithRSAEncryption
         33:90:66:8c:e4:99:c4:4e:1c:b7:5c:7d:b7:16:67:f1:b4:bc:
         d6:b2:ce:36:c3:4f:77:db:e3:22:89:5c:63:cb:a4:0b:62:b4:
         c5:72:d8:37:02:c7:1b:83:0b:03:ad:c6:51:20:e1:fd:c8:28:
         72:ea:62:da:be:e7:0b:68:e7:f2:7d:24:b6:59:2f:ab:4c:76:
         ba:42:38:fe:fb:e4:a1:91:ab:0f:9b:08:3f:d2:98:3b:c2:75:
         78:97:cf:97:34:8f:c1:3f:b9:bd:a4:53:6d:ea:bc:03:33:86:
         a3:46:8f:b8:6e:09:be:67:43:d8:c4:17:85:3a:9e:e9:c0:86:
         fc:d4:25:51:e0:36:d2:fc:ca:84:43:68:a8:75:f5:b8:a3:87:
         71:8d:b4:e9:78:69:b3:4d:52:10:ed:05:df:a0:b3:0d:34:f9:
         a0:99:99:29:12:74:d6:74:55:05:1b:7e:6c:81:48:ba:a2:05:
         9e:f3:33:2b:6f:14:25:8a:a9:c6:ff:7d:28:01:03:32:3e:46:
         68:b1:88:f2:04:b0:bd:83:a0:97:ca:12:84:03:49:9c:f6:63:
         14:24:45:ab:dd:73:97:33:a0:fd:0e:94:95:b1:cb:95:cc:c3:
         6c:82:fc:05:70:3d:9b:0e:ea:05:6e:e2:36:c1:2f:b3:87:b6:
         ca:58:59:b1

Client certificate:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 302 (0x12e)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: <string>
        Validity
            Not Before: Mar 26 08:11:41 2020 GMT
            Not After : Mar 26 08:11:41 2022 GMT
        Subject: <string>
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b1:07:3c:54:4f:4c:77:66:75:21:c5:9d:1f:b0:
                    da:92:ee:5f:4f:a9:79:a3:56:a9:fd:ec:0f:ff:c9:
                    23:de:3f:6a:f4:e3:5b:f5:d0:ef:cf:ae:1d:a8:80:
                    21:76:39:1e:e6:90:1a:da:dd:07:21:68:98:73:29:
                    ea:f2:40:fe:9f:a3:b9:af:89:20:7d:0f:22:cb:cc:
                    50:de:30:af:66:00:52:93:2c:f1:a0:f5:7d:46:6e:
                    c9:63:d9:c4:24:0a:db:9c:8c:66:52:04:f1:da:f8:
                    8b:71:27:46:60:98:94:49:b0:b2:05:e5:5d:7c:05:
                    8d:e0:51:35:eb:38:ae:d3:d7:dc:a5:21:72:d4:b9:
                    9a:be:29:3f:04:bd:11:c3:43:b7:d8:56:2b:4b:60:
                    08:9e:a9:77:55:a4:e6:d1:b8:b6:2b:57:ff:89:bc:
                    0a:87:b2:43:71:0c:aa:65:28:20:09:68:63:0b:d8:
                    2e:de:05:bf:40:95:a7:24:b4:2e:a0:c4:d8:37:66:
                    3e:28:d1:7b:4e:77:4f:23:7e:e7:44:85:3d:70:fc:
                    eb:34:06:2a:9d:40:c9:30:0f:a6:df:0a:51:1e:54:
                    31:22:a9:d7:8b:7c:84:88:ef:77:ca:34:00:27:52:
                    ef:34:d0:a5:a2:41:79:bd:45:0d:85:70:00:01:2c:
                    6a:f7
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Key Encipherment, Data Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
            Netscape Cert Type: 
                SSL Client
    Signature Algorithm: sha256WithRSAEncryption
         5c:c1:da:4a:ba:37:21:54:24:21:f5:6f:83:b4:74:78:17:cb:
         d3:f8:63:a3:07:9c:34:7c:51:e5:97:4d:70:41:fa:91:1a:ce:
         6f:87:32:24:81:65:00:3b:9a:c1:f6:32:82:9a:cc:6d:68:3e:
         03:b7:3a:3d:3c:81:15:89:f8:12:27:b3:cd:d3:e5:7a:bd:e9:
         49:f4:c1:19:58:39:dc:13:58:2c:8b:1b:a7:c6:ae:28:ad:4c:
         9e:76:77:ff:fa:36:04:94:fb:bd:87:fe:f0:a5:2e:85:d8:29:
         50:b6:c5:43:9b:f4:bd:5a:35:40:1f:23:59:e2:04:84:f2:b9:
         91:ef:20:fe:99:28:e4:df:71:96:4a:ab:35:5c:57:c2:46:80:
         20:7c:be:49:37:18:d1:0f:07:47:54:1c:e3:33:78:e0:c1:61:
         93:bf:95:fd:f4:bd:27:a4:f1:6b:ba:62:8c:79:a0:57:ee:d3:
         bd:08:73:b1:37:41:10:68:38:7a:91:c5:3a:64:1b:54:66:b4:
         19:cc:16:16:5d:94:7a:e2:f7:2b:79:bd:2a:ab:01:67:32:e9:
         4a:2b:fb:da:df:5b:65:36:1a:8b:1d:a9:3c:2a:3f:bd:02:f0:
         eb:9b:e2:3b:46:0d:44:f8:ac:77:ac:6f:60:df:a5:27:00:4c:
         8c:9f:a0:2c
26
  • Do you have on firefox's trusted certificates the expired CA? Have you tried to load the new CA into Firefox?
    – NuTTyX
    Jul 16, 2020 at 9:45
  • Firefox did not trust the expired CA certificate (it is not used for the sever certificate, only for the client certificate). To be on the safe side, I did try to trust the CA certificate, no change.
    – Richlv
    Jul 16, 2020 at 10:07
  • Do you have OCSP or CRL enabled? Could be that Firefox is checking whether the client cert is revoked and getting an expired CRL or OCSP response. Also Firefox is REALLY picky with certificates and would refuse to work if it sees a duplicate serial for the same CA. I don't think that should be a problem with the CA itself, but make sure that on renewal you change the serial.
    – NuTTyX
    Jul 16, 2020 at 10:16
  • Are you really using user certs for authentication to a web server? I didn't know anyone went to that kind of trouble.
    – Spiff
    Jul 16, 2020 at 10:16
  • 1
    @Spiff, to test the validity period possibility, regenerated the CA cert to have start time 10 years on the past - that did not help.
    – Richlv
    Jul 20, 2020 at 17:36

1 Answer 1

1

Apparently the problem was with the old cert using PrintableStrings for all strings, but the new one using UTF8Strings for some. Regenerating the new one with PrintableStrings fixes it.

When OpenSSL tools are used, the string_mask option allows to control field encoding.

All credit for spotting the difference goes to Mozilla security engineer, Dana.

5
  • Do you have issue number in mozilla tracker ? Jan 18, 2021 at 8:18
  • Sure, that would be bugzilla.mozilla.org/show_bug.cgi?id=1654596 .
    – Richlv
    Jan 18, 2021 at 13:24
  • Thanks. I have the same problem. How I can see how the CA is encoded? PrintableStrings or UTF8Strings. What command do you use? Jan 18, 2021 at 16:15
  • I saw your comment in Mozilla issue and I have exactly the same problem. The CA uses PrintableStrings and my certificate uses UTF8Strings. I have tried to create my certificate using PrintableStrings but it is always generated using UTF8Strings Do you know how to generate them using PrintableStrings? Jan 18, 2021 at 17:26
  • That depends on the tools used, but for OpenSSL string_mask option allows to control this - also added in the answer.
    – Richlv
    Jan 18, 2021 at 20:43

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .