¿Qué parte de TLS especifica cómo verificar una cadena de certificados?

11

A veces me he encontrado con una situación en la que veo un certificado de CA raíz que está configurado para caducar antes que el certificado de CA intermedio.

Mi pregunta es: si estaba interesado en mantener su CA intermedia activa y necesitaba actualizarla para hacer referencia a un certificado raíz recién creado, ¿qué debería cambiar la CA intermedia? Creo que este es el campo del Emisor, pero ¿se puede actualizar dinámicamente como lo son algunas SAN, o también necesita actualizar el certificado de CA intermedio?

Supongo que esto también podría resumirse como: ¿en qué parte de un certificado indica a quién estás firmado y cómo se ve?

Los puntos de bonificación para responder en qué parte del proceso de intercambio se presenta al cliente, y lo que lo hace necesario (supongo que está completamente dirigido al cliente, ya que algunos clientes no requieren que el servidor presente la cadena del certificado). verificar la legitimidad de un servidor cert)?

    
pregunta JZeolla 18.02.2015 - 22:30
fuente

3 respuestas

13

Dentro de SSL / TLS, el servidor envía su cadena de certificados sistemáticamente al cliente (bueno, a menos que el cliente quiera negociar un conjunto de cifrado que no use ningún certificado, pero eso es bastante raro en la práctica). Consulte el estándar TLS , en particular este diagrama, que lo dice todo:

  Client                                               Server

  ClientHello                  -------->
                                                  ServerHello
                                                 Certificate*
                                           ServerKeyExchange*
                                          CertificateRequest*
                               <--------      ServerHelloDone
  Certificate*
  ClientKeyExchange
  CertificateVerify*
  [ChangeCipherSpec]
  Finished                     -------->
                                           [ChangeCipherSpec]
                               <--------             Finished
  Application Data             <------->     Application Data

         Figure 1.  Message flow for a full handshake

Para obtener explicaciones (mucho más completas) sobre cómo funciona SSL / TLS, lea esta respuesta .

Tenga en cuenta, sin embargo, que si bien SSL / TLS se basa formalmente en los certificados X.509, el protocolo no está irremediablemente vinculado con X.509. Dentro de la dinámica de handshake, la idea es que el servidor envíe su clave pública al cliente dentro de una cadena de certificados , y luego el cliente de alguna manera usa la clave pública del servidor. Cómo el cliente obtiene la clave pública del servidor está un poco fuera de alcance; normalmente, el cliente lo hace decodificando y validando la cadena de certificados enviada por el servidor, pero el cliente es libre de "conocer" la clave pública del servidor de cualquier otra forma que considere adecuada. En algunas aplicaciones dedicadas (especialmente en sistemas integrados), el cliente puede contener una copia codificada de la clave pública del servidor, y simplemente usarla, sin tener en cuenta lo que el servidor envíe como "cadena de certificados".

Además, la "cadena de certificados", desde el punto de vista de SSL / TLS, es una secuencia de manchas opacas, de manera que la longitud total no exceda de 16 megabytes. Si bien estos blobs son normalmente certificados X.509 codificados, pueden ser otra cosa, siempre que el cliente esté de acuerdo (y un cliente que ignora la cadena de certificados del servidor aceptará, por definición, cualquier cosa). Incluso hay un RFC definido formalmente para usar claves OpenPGP en lugar de certificados X.509 en SSL / TLS.

SI la cadena de certificados sigue las reglas habituales (certificados X.509, que el cliente valida), luego Se aplican las reglas X.509 . El algoritmo completo de validación de la ruta X.509 es un trabajo del Diablo para confundir y corromper las mentes de los hombres buenos . Sin embargo, como resumen simple, un certificado emitido (su "certificado de CA intermedio") coincide con su emisor (en su caso, la raíz) a través de las dos propiedades siguientes, que deben cumplirse todas:

  • El campo subjectDN en el emisor (raíz) debe ser igual al campo issuerDN en el emitido (CA intermedia). Gracias a la multitud de posibles codificaciones y las reglas bizantinas de Unicode para la coincidencia de casos, la "igualdad" real de los nombres es una noción potencialmente compleja.

  • Un certificado está firmado ; la firma en el certificado emitido debe ser verificable con respecto a la clave pública del emisor.

Por lo tanto, si desea mantener el certificado de CA intermedio sin cambios, entonces, como mínimo, la nueva raíz necesitará usar el mismo nombre exacto que el anterior, y también la exacta mismo par de claves. Si cambia cualquiera de los dos (o ambos), deberá volver a emitir un nuevo certificado para la CA intermedia.

Los mismos principios se aplican a lo largo de la cadena: si cambia el certificado de la entidad de certificación intermedia, es posible que los certificados de entidad final no se modifiquen (los certificados emitidos anteriormente por la entidad de certificación), si (y solo si) la nueva entidad de certificación. El certificado aún contiene el mismo nombre de CA intermedio y la clave pública de CA intermedia.

    
respondido por el Thomas Pornin 18.02.2015 - 23:10
fuente
3

En realidad, hay muy poco en la especificación TLS acerca de la verificación de certificados. La especificación TLS es lo suficientemente flexible como para permitir tipos de autenticación distintos a los certificados X.509, como los certificados OpenPGP o Kerberos .

Hay algunas expectativas y referencias a los conceptos relacionados con X.509, como la lista certificate_authorities para la autenticación cliente-cert, la definición de certificate_list en Certificado del servidor y el significado de algunos mensajes de alerta .

Dicho esto, la cadena de certificados es bastante opaca en lo que respecta a la especificación TLS. Uno de los puntos principales es el Apéndice D :

D.2. Certificates and Authentication

   Implementations are responsible for verifying the integrity of
   certificates and should generally support certificate revocation
   messages.  Certificates should always be verified to ensure proper
   signing by a trusted Certificate Authority (CA).  The selection and
   addition of trusted CAs should be done very carefully.  Users should
   be able to view information about the certificate and root CA.

El proceso de verificación tiende a depender de otras especificaciones: RFC 5280 (o aún RFC 3280) para el aspecto PKI, es decir, la verificación de la cadena, y RFC 6125 para la verificación del nombre (o aún RFC 2818 y otro protocolo específico) especificaciones).

Como regla general, el Nombre distinguido del emisor de un certificado debe ser Nombre distinguido del sujeto del certificado de la CA que lo emitió. En cuanto a los nombres alternativos, la especificación dice :

4.2.1.7. Issuer Alternative Name

   As with Section 4.2.1.6, this extension is used to associate Internet
   style identities with the certificate issuer.  Issuer alternative
   name MUST be encoded as in 4.2.1.6.  Issuer alternative names are not
   processed as part of the certification path validation algorithm in
   Section 6.  (That is, issuer alternative names are not used in name
   chaining and name constraints are not enforced.)

(También necesitaría reutilizar el mismo material clave si aún desea que la clave pública en el certificado de CA verifique la firma del certificado).

    
respondido por el Bruno 18.02.2015 - 23:51
fuente
1

El resumen de respuestas que querías:

  • El campo Issuer es un DN que identifica quién firmó el certificado.
  • Un DN (nombre distinguido) es uno de esos extravagantes "C = EE. UU., O = HAL, OU = Descubrimiento uno, CN = Dave Bowman" cadenas
  • ¡Pero tener el nombre correcto solo cuenta si estás en las raíces locales de confianza!

Pero a su pregunta principal: nada tiene que cambiar con respecto al certificado Intermedio para hacer referencia a un certificado Root recién actualizado. Es posible emitir un nuevo certificado para la raíz sin invalidar el anterior ni romper el enlace al certificado intermedio. El "Emisor" es una cadena, no un número de serie, por lo que una nueva emisión del certificado raíz que se coloca correctamente en el almacén de confianza puede extender el vencimiento sobre el original.

Me encontré con un caso de este último mes; Tengo un certificado que está firmado por el certificado intermedio Entrust L1C, que a su vez está firmado por CN = Entrust.net Certification Authority (2048). La copia de ese certificado raíz fue la siguiente hasta hace poco:

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 946059622 (0x3863b966)
Signature Algorithm: sha1WithRSAEncryption
    Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
    Validity
        Not Before: Dec 24 17:50:51 1999 GMT
        Not After : Dec 24 18:20:51 2019 GMT
    Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)

Durante una actualización del sistema operativo a fines de enero, el certificado raíz fue reemplazado silenciosamente por una versión más nueva. Tenga en cuenta que el número de serie y las fechas de validez cambian, pero que la cadena del Emisor no:

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 946069240 (0x3863def8)
Signature Algorithm: sha1WithRSAEncryption
    Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
    Validity
        Not Before: Dec 24 17:50:51 1999 GMT
        Not After : Jul 24 14:15:12 2029 GMT
    Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)

Dados esos dos archivos raíz diferentes, openssl verificó correctamente la cadena de certificados usando uno de estos:

$ md5sum entrust.*.pem
da9ff9cd8e8e2256e9efcf5c4ef3891f  entrust.L1C.pem
244f3bbf6b112e7d399342c097db22a5  entrust.new.root.pem
0315b2915a0f74cc3498cfdd54933452  entrust.old.root.pem
$ openssl verify -CAfile entrust.old.root.pem entrust.L1C.pem
entrust.L1C.pem: OK
$ openssl verify -CAfile entrust.new.root.pem entrust.L1C.pem
entrust.L1C.pem: OK
$

Para puntos de bonificación:

El protocolo de enlace TLS generalmente comienza así:

  

C - > S Hola del cliente

     

S - > C Hola del servidor

     

S - > C Certificado de servidor

Y los certificados se envían en una secuencia, desde la más específica - > intermedio - > raíz. En realidad, puede tomar los bytes de un sniffer como Wireshark y guardarlos en un archivo y tratarlos como un .der (certificado codificado en binario). Hice eso con los certificados anteriores y utilicé openssl para traducirlos de .der a .pem para mi conveniencia.

    
respondido por el gowenfawr 18.02.2015 - 23:21
fuente

Lea otras preguntas en las etiquetas