Si hallas algún problema en tu código o proyecto, recuerda probar siempre en un entorno de testing antes añadir el código al proyecto final.
Solución:
Más o menos he resuelto mi problema de la siguiente manera:
Hay una opción para verify
llamado -partial_chain
que permite verificar a la salida OK
sin encontrar una cadena que aterrice en 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 Heartbleed
- 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 el último en la línea 1.0.2; esto es compatible
-partial_chain
- OpenSSL 1.1: actualmente está en 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 era 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 la instale manualmente. 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 listada en el verify
documentos llamados -no-CApath
que supuestamente obvia 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.
El OpenSSL verify
El comando crea una cadena de certificados completa (hasta que llega a un certificado de CA autofirmado) para verificar un certificado. Desde su página man:
En primer lugar, se crea una cadena de certificados a partir del certificado proporcionado y que termina en la CA raíz. Es un error si no se puede construir toda la cadena.
Solo devuelve un resultado positivo si puede verificar la cadena completa.
Si alguna operación falla, el certificado no es válido.
Sin embargo, los siguientes resultados del comando proporcionan suficiente información para mostrar que el g0 certificado está firmado por el g1 certificado.
$ 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 no se pudo encontrar uno de los certificados en la cadena.
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. Esto normalmente significa que la lista de certificados de confianza no está completa.
Lo importante aquí es que el profundidad es 1. Esto indica que el certificado que se está verificando fue verificado en el primer nivel, profundidad 0 (por el g1 certificado).
Si el g1 el certificado fue no utilizado para firmar el g0 certificado, el error estaría en la primera etapa, profundidad 0 y en su lugar recibirías 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 pudo obtener el certificado del emisor local
no se pudo encontrar el certificado del emisor: esto ocurre si no se puede encontrar el certificado del emisor de un certificado que no es de confianza.
Puntuaciones y comentarios
Si te mola el tema, puedes dejar una reseña acerca de qué te ha impresionado de esta crónica.