Use openssl para verificar individualmente los componentes de una cadena de certificados

8

Esto está relacionado con otra pregunta, ¿Cómo verificar una firma de una entidad por otra usando OpenSSL CLI?

Usé openssl s_client -showcerts -connect www.google.com:443 para recopilar tres certificados de google. Llámalos g0 , g1 , g2 , donde:

  • g0 es un certificado de hoja firmado por la CA intermedia de Google
  • g1 contiene la clave pública de la CA intermedia y está firmada por GeoTrust CA
  • g2 tiene la clave pública de GeoTrust y está firmada por EquiFax CA

Mi objetivo es demostrar que esta es una cadena de firmas válida, paso a paso, utilizando la CLI de OpenSSL. El intento intuitivo es este:

$ openssl verify -CAfile g1 g0

Pero resulta que OpenSSL está utilizando certificados de su tienda de confianza (consulte Cómo verificar una firma de una entidad por otra usando OpenSSL CLI? ). Así que en lugar de eso, mato la tienda de confianza como @dave_thompson_085 sugirió en un comentario a la pregunta mencionada anteriormente. Pero esto no parece funcionar:

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

Entonces, ¿cómo emito correctamente este comando verify de tal manera que puedo verificar específicamente si g1 ha firmado g0 ?

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
    
pregunta Fixee 21.03.2016 - 00:01
fuente

2 respuestas

6

Resolví mi problema más o menos de la siguiente manera:

Hay una opción para verify llamada -partial_chain que permite verificar la salida de OK sin encontrar una cadena que llegue a un certificado raíz de confianza autofirmado. Sin embargo, -partial_chain no existe en la versión de OpenSSL que tengo, ni en ninguna versión posterior de 1.0.1. Aquí está el resumen:

  • OpenSSL 1.0.1f: este es el último para Ubuntu 14.04; tiene la solución del corazón
  • OpenSSL 1.0.1s: este es el último de la línea 1.0.1 y es probable que sea el último; debe instalarse a mano en Ubuntu 14.04
  • OpenSSL 1.0.2g: actualmente la última versión de la línea 1.0.2; esto soporta -partial_chain
  • OpenSSL 1.1: actualmente está en versión alfa y tiene aún más opciones, pero no lo exploré

Entonces, con 1.0.2g o posterior, uno puede hacer lo siguiente:

$ openssl verify -CApath /dev/null -partial_chain -trusted g1 g0
g0: OK
$ openssl verify -CApath /dev/null -partial_chain -trusted g2 g1
g1: OK
$ openssl verify -CApath /dev/null -trusted /etc/ssl/certs/EquiFax_Secure_CA.pem g2
g2: OK

(Tenga en cuenta que -partial_chain no fue necesario en el último comando, ya que el certificado raíz de Equifax está autofirmado)

Esto satisface mi pregunta, pero requiere una versión de OpenSSL que aún no está disponible en algunas distribuciones, a menos que realice una instalación manual. Si está atascado con una versión anterior a la 1.0.2, probablemente tenga que usar el método de @Anthony Geoghegan.

Nota: hay una opción en la lista verify docs llamada -no-CApath que supuestamente elimina la necesidad de -CApath /dev/null , pero no está disponible en 1.0.2g o anterior, según mis pruebas Supongo que está disponible en 1.1.

    
respondido por el Fixee 21.03.2016 - 16:38
fuente
4

El comando OpenSSL verify crea una cadena de certificados completa (hasta que alcanza un certificado CA autofirmado) para verificar un certificado. Desde su página de manual:

  

Primero se construye una cadena de certificados a partir de la fuente   Certificado y finalizando en la CA raíz. Es un error si toda la cadena.   no se puede construir.

Solo devuelve un resultado positivo si puede verificar la cadena completa .

  

Si falla alguna operación, el certificado no es válido.

Sin embargo, los siguientes resultados de comando proporcionan suficiente información para mostrar que el certificado g0 está firmado por el certificado g1 .

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

Error 2 indica que uno de los certificados de la cadena no pudo ser encontrado.

  

2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: no se pudo obtener el certificado del emisor

     

no se pudo encontrar el certificado del emisor de un certificado buscado. Esta   normalmente significa que la lista de certificados de confianza no está completa.

Lo importante aquí es que la profundidad es 1. Esto indica que el certificado que se está verificando se verificó en el primer nivel, profundidad 0 (por la g1 certificado).

Si el certificado g1 no se usó para firmar el certificado g0 , el error estaría en la primera etapa, profundidad 0 y en su lugar recibiría Error 20 :

error 20 at 0 depth lookup:unable to get local issuer certificate
  

20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: no se puede obtener el emisor local   certificado

     

no se pudo encontrar el certificado del emisor: esto ocurre si el emisor   No se puede encontrar el certificado de un certificado que no es de confianza.

    
respondido por el Anthony Geoghegan 21.03.2016 - 02:16
fuente

Lea otras preguntas en las etiquetas