-
Se il server richiede il certificato durante l'iniziale handshake, usa semplicemente Wireshark e cerca il messaggio Certificate Request
TLS (appena prima di Server Hello Done
). Se si esaminano i dettagli di questo pacchetto, è necessario visualizzare un elenco certificate_authorities
che fornisce l'elenco di CA accettabili. La tua catena locale dovrà corrispondere a una di queste.
-
Se non vi è alcun messaggio Certificate Request
visibile, potrebbe essere in un handshake rinegoziato. In questo caso, questa seconda stretta di mano sarà crittografata, quindi non immediatamente visibile. Le versioni recenti di Wireshark consentono di utilizzare un segreto pre-master (vedere " Uso della sezione (Pre) -Master-Secret sulla pagina wiki SSL di Wireshark e questa risposta ovviamente). Questo è generalmente più complicato, ma questo può essere fatto.
Più in generale, per eseguire il debug del problema, vorrei anche esaminare altri NSS variabili di ambiente , ad esempio SSLDEBUG
(e SSLDEBUGFILE
), quando si utilizza Firefox.
Inoltre, puoi usare openssl s_client -connect my.host.example:443 -servername my.host.example
(con vari livelli di verbosità se necessario) per simulare una connessione browser al tuo server. Questo dovrebbe almeno dirti quali CA sono pubblicizzate nel messaggio Certificate Request
. Se il server utilizza la rinegoziazione, potrebbe essere necessario scrivere una richiesta HTTP minima più o meno simile a questa (adattata con ciò che ti serve):
GET /my/protected/resource HTTP/1.1
Host: my.host.example
(In alcune impostazioni complesse, potresti dover copiare / incollare le altre intestazioni che vedi da una richiesta del browser, usando i suoi strumenti di sviluppo.)
(in alcuni casi potresti anche trovare l'opzione -prexit
, credito a questa risposta .)
Poiché dai commenti che falsificano manualmente la richiesta HTTP non funziona per te, un'altra possibilità è usare curl --verbose https://my.host.example/my/protected/resource > /dev/null
(puoi anche usare livelli di debug più precisi come --trace
o --trace-ascii
se necessario, vedi pagina man per curl). Questo dovrebbe produrre qualcosa di simile, quindi spero che dovresti vedere un Certificate Request
da qualche parte:
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Server hello (2):
{ [data not shown]
* SSLv3, TLS handshake, CERT (11):
{ [data not shown]
* SSLv3, TLS handshake, Server key exchange (12):
{ [data not shown]
Meglio, se hai bisogno che la richiesta sia più realistica, effettua la tua richiesta effettiva da Chrome dopo aver aperto gli strumenti per sviluppatori. Fai clic con il tasto destro del mouse su questo e usa "Copia come cURL", quindi incollalo e usalo con arricciatura (aggiungi --verbose
o altro): questo dovrebbe copiare le intestazioni necessarie. C'è un video con un esempio qui .