Cómo solucionar los errores relacionados con el "certificado de cliente" en HTTPS de 2 maneras

3

Tengo un servidor web que solicita un certificado de cliente para la autenticación mutua. Tengo lo que creo que es el certificado correcto cargado en el navegador de mi cliente. Sin embargo, el navegador no puede encontrar el certificado & está dando el error "Esta página no se puede mostrar" cuando visito la página desde IE (también falla en cromo y FF). ¿Hay alguna herramienta que me ayude a averiguar qué es exactamente el certificado que el servidor le solicita al navegador de mi cliente?

Lo intenté a través de algunos monitores de red, pero hay mucha información intercambiada que no puedo encontrar.

    
pregunta user93353 30.06.2014 - 12:53
fuente

1 respuesta

3
  • Si el servidor solicita el certificado durante el reconocimiento inicial, simplemente use Wireshark y busque el mensaje Certificate Request TLS (justo antes de Server Hello Done ). Si observa los detalles de este paquete, debería ver una lista certificate_authorities que le da la lista de CA aceptables. Su cadena local deberá coincidir con una de estas.

  • Si no hay un mensaje Certificate Request visible, puede estar en un saludo negociado nuevamente. En este caso, este segundo saludo se cifrará, por lo que no será visible de inmediato. Las versiones recientes de Wireshark le permiten usar un secreto maestro previo (vea " Cómo usar la sección (Pre) -Master-Secret en la página wiki de Wireshark SSL , y esta respuesta por supuesto). Esto generalmente es más complicado. pero esto se puede hacer.

    Más generalmente, para solucionar su problema, también vería otros NSS variables de entorno , como SSLDEBUG (y SSLDEBUGFILE ), cuando se usa Firefox.

Además, podría usar openssl s_client -connect my.host.example:443 -servername my.host.example (con varios niveles de verbosidad si es necesario) para simular una conexión de navegador a su servidor. Al menos debería decirle qué CA se anuncian en el mensaje Certificate Request . Si el servidor utiliza la renegociación, es posible que deba escribir una solicitud HTTP mínima pareciéndose más o menos así (adaptado a lo que necesita):

GET /my/protected/resource HTTP/1.1
Host: my.host.example

(En algunas configuraciones complejas, es posible que tenga que copiar / pegar los otros encabezados que ve desde una solicitud del navegador, utilizando sus herramientas de desarrollo).

(También puede encontrar la opción -prexit útil en algunos casos, acredite a esta respuesta .)

Como parece por los comentarios que la falsificación manual de la solicitud HTTP no funciona para usted, otra posibilidad es usar curl --verbose https://my.host.example/my/protected/resource > /dev/null (también puede usar niveles de depuración más finos como --trace o --trace-ascii si es necesario, vea página de manual para curl). Esto debería producir algo como esto, así que espero que veas un Certificate Request en alguna 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]

Mejor, si necesita que la solicitud sea más realista, realice su solicitud real desde Chrome después de abrir las herramientas para desarrolladores. Haga clic derecho en eso y use "Copiar como cURL", luego péguelo y utilícelo con curl (agregue --verbose u otro): esto debería copiar los encabezados necesarios. Hay un video con un ejemplo aquí .

    
respondido por el Bruno 30.06.2014 - 13:32
fuente

Lea otras preguntas en las etiquetas