Come risolvere gli errori relativi al "certificato client" in HTTPS a 2 vie

3

Ho un server web che chiede il certificato client per l'autenticazione reciproca. Ho quello che penso sia il certificato giusto caricato nel mio browser client. Tuttavia, il browser non è in grado di trovare il certificato & sta dando l'errore "Questa pagina non può essere visualizzata" quando visito la pagina da IE (fallisce anche in cromo e FF). C'è qualche strumento che mi aiuterà a capire cos'è esattamente il certificato che il server sta chiedendo al mio browser client?

Ho provato ad utilizzare alcuni monitor di rete, ma ci sono molti dati scambiati che non riesco a trovarlo.

    
posta user93353 30.06.2014 - 12:53
fonte

1 risposta

3
  • 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 .

    
risposta data 30.06.2014 - 13:32
fonte

Leggi altre domande sui tag