¿Cómo obtener los certificados intermedios mediante programación?

2

Estoy creando un script que cataloga el uso de intermedios públicos y certificados raíz, dado el certificado público de un sitio, por lo que necesito obtener los certificados de manera programática. A veces, éstas pueden incluirse en las respuestas del servidor, pero otras veces es posible que deban buscarse o extraerse de un archivo de certificación CA. A menudo veo los certificados listados en la salida de herramientas como testssl.sh y openssl s_client y enlace , pero no tengo claro cómo puedo obtener en la misma cosa y extraerlos de forma fiable, idealmente en formato PEM. ¿Alguien puede sugerir cuál es la mejor manera de hacer esto?

    
pregunta Synchro 22.11.2016 - 10:45
fuente

1 respuesta

3

Puede usar openssl s_client para capturar la cadena de certificados de un sitio web determinado, y (con la opción -showcerts ) identificará de manera útil el (s) ubject y (i) ssuer para cada certificado. Si la raíz no está incluida, debería poder encontrarla en su almacén de certificados local.

Aquí hay un ejemplo de salida de openssl s_client , con el contenido de los certificados reales recortados (...) por brevedad:

$ echo "" | openssl s_client -showcerts -connect www.google.com:443
CONNECTED(00000003)
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
-----BEGIN CERTIFICATE-----
MIIEgDCCA2igAwIBAgIIRLhIyqBaCIMwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
...
segXWw==
-----END CERTIFICATE-----
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIDAjqSMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
...
wSHGFg==
-----END CERTIFICATE-----
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
...
b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---

El primer certificado en la cadena (0) le muestra su asunto y su emisor. Como puede ver, el asunto para el segundo certificado (1) es el mismo que el emisor para (0), y el emisor para (1) es el sujeto para (2). El emisor para (2) es el certificado raíz, que no está incluido. (Se acepta, pero no es obligatorio, incluir la raíz en la cadena; como el propósito de la raíz es ser una copia "confiable" almacenada localmente, el software no debería nunca "confiar" en la raíz entregada un servidor web. Dicho esto, he visto un software (sin navegador) que se rompió si la raíz no se incluyó en la cadena, por lo que sucede).

En un sistema Linux, puede rastrear el certificado raíz en el directorio /etc/ssl/certs , ya sea como un archivo individual o como parte de un archivo grande como ca-certificate.crt (Ubuntu) o ca-bundle.crt (Sombrero rojo). Puede usar openssl x509 -noout -subject -in filename donde nombre de archivo es un único archivo de certificado para obtener el Asunto de cada certificado; compararlos con lo que extrajo de la cadena de certificados anterior le permitirá rastrear el certificado del servidor.

(extraer los temas de todos esos archivos, o explotar el paquete en una cantidad de archivos y extraerlos de ellos, es un desafío de secuencias de comandos Unix de complejidad media que queda para el lector).

Puede encontrar servidores web que no proporcionan la cadena necesaria. En tales casos, generalmente es porque los proveedores de navegadores también distribuyen los certificados intermedios, por lo que pueden salirse con la suya.

Finalmente, si no puede rastrear un certificado de emisor por alguno de estos métodos, intente hacer una búsqueda en Google del sujeto. Si se trata de una autoridad de certificación pública, es probable que aparezca en algún lugar.

Responder al comentario:

No, no se garantiza que el tema sea único; recuerde, el punto principal de los certificados x509 es que debe tener una cadena de confianza hasta una raíz de confianza implícita; sabes que el sujeto es bueno porque fue firmado por alguien de confianza. Pero, por sí solos, se puede falsificar un tema si no se está verificando el certificado.

Entonces huellas digitales clave son las La mejor manera de identificar un certificado de forma única, y puede usar openssl x509 para imprimirlos dado el certificado:

$ openssl x509 -sha256 -noout -in my_cert.crt -fingerprint
SHA256 Fingerprint=DC:5F:B5:98:53:E0:FC:B2:33:7B:8A:CE:64:09:75:76:65:84:A0:8C:2F:B1:D4:01:6D:1F:70:04:C6:0E:23:69
$ 
    
respondido por el gowenfawr 27.11.2016 - 05:51
fuente

Lea otras preguntas en las etiquetas