Um certificado CA expirou e foi regenerado com a mesma chave privada, com os certificados de cliente existentes funcionando no Chrome, mas falhando no Firefox:
Ocorreu um erro durante uma conexão com example.com:
SSL peer não pôde negociar um conjunto aceitável de parâmetros de segurança:Error code: SSL_ERROR_HANDSHAKE_FAILURE_ALERT
O Firefox não solicita o certificado do cliente e não o envia - suspeitando que algo não corresponda ao processo de seleção do certificado do cliente.
Como isso pode ser depurado no lado do Firefox?
Como o Firefox decide quando pedir/oferecer o certificado do cliente?
Observe que o certificado do servidor [web] está funcionando corretamente e está fora do escopo aqui.
O que foi verificado:
- Falha no Firefox 78 no Mac e no Firefox 77 no Linux; o mesmo certificado de cliente que funcionou com o certificado CA anterior está presente em ambas as instâncias do Firefox.
- No Mac, onde o mesmo certificado de cliente funciona no Chrome e, portanto, está presente no Keychain, habilitar
security.osclientcerts.autoload
no Firefox não ajuda. - "Nomes de CA de certificado de cliente aceitáveis" correspondem entre o antigo e o novo certificado de CA.
- "Tipos de certificado de cliente" parece ser aceitável:
Novo certificado: sinal RSA, sinal DSA, sinal ECDSA
Certificado antigo: RSA fixo DH, DSS fixo DH, sinal RSA, sinal DSA - A presença de extensões v3 no certificado CA não importa (incluindo a configuração de
CA:TRUE
). - A CRL é usada, mas não expirou e o certificado do cliente não foi revogado.
- O número de série no antigo e no novo certificado CA são diferentes e parecem ser grandes números aleatórios.
- O certificado do cliente parece não conter nenhum certificado de cadeia (expirado).
- Gerar novamente o certificado CA para que o período de validade comece antes do certificado do cliente não ajuda.
- Gerar novamente o certificado CA para SHA1 não ajuda (o antigo certificado CA era SHA1).
certificados
Certificado CA (com extensões X509v3; sua presença/falta não faz diferença):
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
Certificado do cliente:
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
Aparentemente, o problema era com o antigo certificado usado
PrintableStrings
para todas as strings, mas o novo usadoUTF8Strings
para algumas. Regenerar o novo comPrintableStrings
corrige-o.Quando as ferramentas OpenSSL são usadas, a opção string_mask permite controlar a codificação do campo.
Todo o crédito por identificar a diferença vai para o engenheiro de segurança da Mozilla, Dana.