¿Cómo funciona la selección entre varias cadenas de certificados disponibles?

2

Estoy tratando de entender los mecanismos prácticos de los certificados de firma cruzada (intermedios). A modo de ejemplo, estoy viendo Let's Encrypt Chain of Trust . Esa página menciona:

  

IdenTrust ha firmado nuestros productos intermedios. Esto permite nuestro fin.   Los certificados serán aceptados por todos los navegadores principales mientras propagamos   nuestra propia raíz.

Además, la página contiene enlaces a ambos el certificado intermedio firmado con la clave privada que pertenece a su propia raíz de ISRG así como el certificado intermedio firmado con la clave privada pertenece a la CA de IdenTrust .

Mi expectativa era ver esos dos certificados intermedios en el cable al configurar una conexión TLS con www.letsencrypt.org, dejando que el cliente decida cuál de los dos intermedios utilizará para construir una cadena de confianza. Sin embargo, solo veo el intermedio firmado por IdenTrust.

He observado esto con Wirehark, analizando el tráfico TLS mientras navegué por www.letsencrypt.org con mi navegador web. Para forzar "la otra" cadena de confianza, no confié en el certificado DST Root CA X3 en la aplicación Keychain Access (estoy en una Mac) y, de hecho, ya no pude navegar por el sitio. Luego agregué el certificado ISRG Root X1, lo que indica que siempre debe confiar en él pero todavía no puedo navegar por el sitio. Esto es compatible con mi observación de que el servidor nunca proporciona el certificado intermedio firmado por ISRG.

También probé la aplicación openssl s_client , pero fue en vano.

Supongamos que confío en la Raíz ISRG y no en IdenTrust, ¿cómo hago que el servidor comparta conmigo el certificado intermedio firmado por la Raíz ISRG? O, de manera más general, se pregunta si hay múltiples cadenas de confianza disponibles, por ejemplo, debido a la firma cruzada, ¿cómo se comparten los certificados de ambas cadenas con los clientes? ¿Por qué no recibo un paquete que contenga ambos certificados para el intermedio?

Actualización: la primera respuesta indica que la especificación TLS no permite el intercambio de múltiples cadenas de certificados. Eso explica mucho.

Sin embargo, mis expectativas están determinadas por las respuestas a la pregunta ¿Cuál es el uso de certificados de firma cruzada en X.509? . La respuesta aceptada allí menciona: "Se trata de expandir la confianza" y "aumentar la facilidad de verificación de confianza, como en las situaciones en las que tiene clientes que confían en CA1 o CA2 (pero no en ambos). -signar un certificado para que ambos confíen ".

Si solo se permite el intercambio de una cadena, eso no parece ser "expandiendo la confianza" sino más bien como "modificar la confianza". Además, para un servidor en particular, si tiene que seleccionar una cadena en particular, el argumento de "facilidad de verificación" tampoco es válido, al menos no si su único mecanismo disponible es el protocolo de enlace TLS. ¿Es eso correcto?

    
pregunta Reinier Torenbeek 10.08.2018 - 17:43
fuente

1 respuesta

2

Esta pregunta está un tanto relacionada y puede verla en Respuesta de StackzOfZtuff de que solo se puede enviar una cadena. Cuando se conecta con openssl s_client -connect letsencrypt.org:443 está devolviendo la cadena de la raíz IdenTrust (Digital Signature Trust Co. que IdenTrust compró hace mucho tiempo):

Certificate chain
 0 s:/CN=www.letsencrypt.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3

Dado que la cadena de certificados enviada tiene la firma de IdenTrust, no se puede verificar con la raíz ISRG.

Como se señala aquí el cliente no está obligado a utilizar la cadena que envía el servidor, puede intentar construir su Cadena propia a una raíz de confianza. Sin embargo, esto requiere que el cliente ya tenga todos los intermedios necesarios que no fueron enviados por el servidor.

Si agrego el intermediario firmado por ISRG Root X1 a mi tienda de confianza, s_client descubrirá esa cadena a pesar de haber sido enviada a la cadena de IdenTrust (a menos que se indique lo contrario mediante -no_alt_chains ):

$ openssl s_client -connect letsencrypt.org:443
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.letsencrypt.org
verify return:1
---
Certificate chain
 0 s:/CN=www.letsencrypt.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
    
respondido por el AndrolGenhald 10.08.2018 - 18:17
fuente

Lea otras preguntas en las etiquetas