generate from create ssl openssl ssl-certificate

from - openssl generate csr



openssl s_client-cert: Probar que un certificado de cliente fue enviado al servidor (2)

Fondo

Estoy atrapado en una coincidencia de señalar con un proveedor de servicios con una API protegida por el servidor SSL y certificados de clientes .

  • He generado una CSR, obtuve un certificado de una CA pública (GoDaddy en este caso) y proporcioné el certificado y la cadena de CA al proveedor del servicio.
  • Supuestamente cargaron la CA y el certificado de mi cliente en su puerta de entrada.
  • Estoy trabajando con las pruebas de nivel más básicas usando openssl s_client -connect ... -cert ... -key ...
  • El proveedor me dice que sus registros sugieren que mis solicitudes no incluyen ningún certificado SSL de cliente.
  • Extrañamente, el emisor de CA adecuado para mi certificado aparece en la lista de "Nombres de CA de certificado de cliente aceptables" que se proporcionan durante el protocolo de enlace SSL.
  • Como referencia, un certificado autofirmado que creé y proporcioné para pruebas, de hecho funciona correctamente.

Una solicitud de muestra (fallida)

[shell ~]$ openssl s_client -connect host:443 -cert cert_and_key.pem -key cert_and_key.pem -state -quiet CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=2 **SNIP** verify return:1 depth=1 **SNIP** verify return:1 depth=0 **SNIP** verify return:1 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server key exchange A SSL_connect:SSLv3 read server certificate request A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client certificate A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write certificate verify A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL3 alert read:fatal:unknown CA SSL_connect:failed in SSLv3 read finished A 140011313276744:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1197:SSL alert number 48 140011313276744:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

Mi lectura de la SSL3 alert read:fatal:unknown CA error de SSL3 alert read:fatal:unknown CA es que el servidor no reconoce el emisor del certificado que estoy proporcionando (de hecho). Sin embargo, el proveedor "me asegura" que los certificados de CA están cargados correctamente y no he podido convencerlos de lo contrario.

Pregunta

Por lo tanto, dejando de lado otros pasos (amplios) de solución de problemas, lo que realmente me gustaría saber es:

¿Hay alguna salida disponible de openssl s_client que muestre de manera concluyente que el servidor no solo solicitó un certificado de cliente, sino que de hecho se transmitió al servidor durante el protocolo de enlace SSL?

He experimentado con las -state , -msg , -debug y -trace , pero no tengo los antecedentes necesarios para interpretar el resultado.

La respuesta de EJP sugiere que el resultado de muestra que proporcioné es una prueba suficiente con el write client certificate A , pero este resultado aparece independientemente de si las opciones -cert se usaron en la línea de comando o no, por lo que no es indicativo de que se haya enviado un certificado.


Para verificar que un certificado de cliente se está enviando al servidor, debe analizar el resultado de la combinación de los -state y -debug .

Primero como referencia, intente ejecutar

$ openssl s_client -connect host:443 -state -debug

Obtendrá un montón de resultados, pero las líneas que nos interesan se ven así:

SSL_connect:SSLv3 read server done A write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC)) 0000 - 16 03 01 00 07 0b 00 00-03 ......... 000c - <SPACES/NULS> SSL_connect:SSLv3 write client certificate A

Que esta pasando aqui:

  • El -state es responsable de mostrar el final de la sección anterior:

    SSL_connect:SSLv3 read server done A

    Esto solo es importante para ayudarlo a encontrar su lugar en la salida.

  • Luego, el indicador -debug muestra los bytes sin procesar que se envían en el siguiente paso:

    write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC)) 0000 - 16 03 01 00 07 0b 00 00-03 ......... 000c - <SPACES/NULS>

  • Finalmente, la bandera de estado -state una vez más el resultado del paso que -debug acaba de -debug :

    SSL_connect:SSLv3 write client certificate A

En otras palabras: s_client terminó de leer los datos enviados desde el servidor, y envió 12 bytes al servidor como (lo que supongo que es) un mensaje de "no certificado de cliente" .

Si repites la prueba, esta vez incluye los -cert y -key como este:

$ openssl s_client -connect host:443 / -cert cert_and_key.pem / -key cert_and_key.pem / -state -debug

su salida entre la línea "leer servidor hecho" y la línea "escribir certificado de cliente" será mucho más larga, representando la forma binaria de su certificado de cliente:

SSL_connect:SSLv3 read server done A write to 0x7bd970 [0x86d890] (1576 bytes => 1576 (0x628)) 0000 - 16 03 01 06 23 0b 00 06-1f 00 06 1c 00 06 19 31 ....#..........1 (*SNIP*) 0620 - 95 ca 5e f4 2f 6c 43 11- ..^%/lC. SSL_connect:SSLv3 write client certificate A

Los 1576 bytes son una excelente indicación en sí misma de que el certificado fue transmitido, pero además de eso, la columna de la derecha mostrará partes del certificado que son legibles por el ser humano: Debería poder reconocer el CN ​​y las cadenas del emisor. de su certificado allí.


Sé que esta es una pregunta antigua, pero todavía no parece tener una respuesta. Dupliqué esta situación, pero estoy escribiendo la aplicación de servidor, así que también pude establecer lo que sucede en el lado del servidor. El cliente envía el certificado cuando el servidor lo solicita y si tiene una referencia a un certificado real en la línea de comando s_client. Mi aplicación de servidor está configurada para solicitar un certificado de cliente y fallar si no se presenta uno. Aquí está el problema de la línea de comando I:

Yourhostname here -vvvvvvvvvv s_client -connect <hostname>:443 -cert client.pem -key cckey.pem -CAfile rootcert.pem -cipher ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH -tls1 -state

Cuando dejo fuera la parte "-cert client.pem" del comando, el handshake falla en el lado del servidor y el comando s_client falla y se informa un error. Aún recibo el informe "No se enviaron nombres CA de certificado de cliente", pero creo que ya se ha respondido aquí.

La respuesta corta entonces es que el servidor determina si el cliente enviará un certificado en condiciones normales de funcionamiento (s_client no es normal) y la falla se debe a que el servidor no reconoce la CA en el certificado presentado. No estoy familiarizado con muchas situaciones en las que se realiza la autenticación bidireccional, aunque es necesaria para mi proyecto.

Está claramente enviando un certificado. El servidor claramente lo está rechazando.

La información que falta aquí es la forma exacta en que se crearon los certificados y la forma en que el proveedor cargó el certificado, pero probablemente ya esté todo listo.