Estoy construyendo una propia cadena de certificados con los siguientes componentes:
Root Certificate - Intermediate Certificate - User Certificate
Root Cert es un certificado autofirmado, el Certificado Intermedio está firmado por Root y el Usuario por Intermedio.
Ahora quiero verificar si un Certificado de usuario tiene su anclaje mediante Certificado raíz.
Con
openssl verify -verbose -CAfile RootCert.pem Intermediate.pem
La validación está bien. En el siguiente paso valido el Certificado de usuario con
openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
y la validación muestra
error 20 at 0 depth lookup:unable to get local issuer certificate
¿Qué está mal?
openssl
certificate
Indra
fuente
fuente
man verify
, encontré que el-untrusted
parámetro es el correcto para usar al especificar el certificado intermedio.-untrusted
no comprueba si la cadena de certificados es totalmente válida. Considere pasar tanto el comando intermedio como el root al comando como-CAfile
lo sugieren otras preguntas.openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
Ese es uno de los pocos trabajos legítimos para
cat
:Actualizar:
Como Greg Smethells señala en los comentarios, este comando confía implícitamente en Intermediate.pem . Recomiendo leer la primera parte de la publicación Greg referencias (la segunda parte es específicamente sobre pyOpenSSL y no es relevante para esta pregunta).
En caso de que la publicación desaparezca, citaré los párrafos importantes:
Parece que openssl dejará de verificar la cadena tan pronto como se encuentre un certificado raíz, que también puede ser Intermediate.pem si está autofirmado. En ese caso no se considera RootCert.pem. Así que asegúrese de que Intermediate.pem provenga de una fuente confiable antes de confiar en el comando anterior.
fuente
El problema es que eso
openssl -verify
no hace el trabajo.Como mencionó Priyadi , se
openssl -verify
detiene en el primer certificado autofirmado, por lo tanto, realmente no verifica la cadena, ya que a menudo el certificado intermedio está autofirmado.Tenga en cuenta que la respuesta de Peter es correcta , sin embargo, la salida de
openssl -verify
no es una pista de que todo realmente funcione después. Sí, puede encontrar algunos problemas, pero no todos.Aquí hay un script que hace el trabajo para verificar una cadena de certificados antes de instalarlo en Apache. Quizás esto se pueda mejorar con algunas de las magias más místicas de OpenSSL, pero no soy un gurú de OpenSSL y los siguientes trabajos:
Hay un GitHub Gist de esto que podría tener algunas actualizaciones
Requisitos previos de este script:
/etc/ssl/certs
como de costumbre, por ejemplo, en UbuntuDIR
donde almacene 3 archivos:DIR/certificate.crt
que contiene el certificadoDIR/certificate.key
que contiene la clave secreta para su servicio web (sin frase de contraseña)DIR/certificate.bundle
que contiene el paquete CA. Sobre cómo preparar el paquete, ver abajo../check DIR/certificate
(esto supone que el script se nombracheck
en el directorio actual)CA-Bundle is not needed
. Esto significa que usted (léase/etc/ssl/certs/
:) ya confía en el certificado de firma. Pero esto es muy poco probable en la WWW.¿Cómo crear el
certificate.bundle
archivo?En la WWW, la cadena de confianza generalmente se ve así:
/etc/ssl/certs
certificate.crt
)Ahora, la evaluación se lleva a cabo de abajo hacia arriba, esto significa que primero se lee su certificado, luego se necesita el certificado intermedio desconocido, luego quizás el certificado de firma cruzada y luego
/etc/ssl/certs
se consulta para encontrar el certificado de confianza adecuado.El paquete ca debe estar formado exactamente en el orden de procesamiento correcto, esto significa que el primer certificado necesario (el certificado intermedio que firma su certificado) viene primero en el paquete. Entonces se necesita el certificado de firma cruzada.
Por lo general, su CA (la autoridad que firmó su certificado) ya le proporcionará un archivo ca-bundle tan apropiado. De lo contrario, debe elegir todos los certificados intermedios necesarios y
cat
juntarlos en un solo archivo (en Unix). En Windows, solo puede abrir un editor de texto (comonotepad.exe
) y pegar los certificados en el archivo, el primero necesario en la parte superior y siguiendo a los demás.Hay otra cosa Los archivos deben estar en formato PEM. Algunas CA emiten el formato DER (un binario). PEM es fácil de detectar: es legible en ASCII. Para obtener más información sobre cómo convertir algo en PEM, consulte Cómo convertir .crt a .pem y siga el camino de ladrillos amarillos.
Ejemplo:
Tienes:
intermediate2.crt
el certificado intermedio que firmó sucertificate.crt
intermediate1.crt
otro certificado intermedio, que chamuscóintermediate2.crt
crossigned.crt
que es un certificado de firma cruzada de otra CA, que firmóintermediate1.crt
crossintermediate.crt
que es otro intermedio de la otra CA que firmócrossigned.crt
(probablemente nunca verás tal cosa)Entonces lo correcto
cat
se vería así:¿Y cómo puede averiguar qué archivos se necesitan o no y en qué secuencia?
Bueno, experimenta, hasta que
check
te diga que todo está bien. Es como un juego de rompecabezas de computadora para resolver el enigma. Cada. Soltero. Hora. Incluso para profesionales. Pero mejorará cada vez que necesite hacer esto. Así que definitivamente no estás solo con todo ese dolor. Es SSL, ¿sabes? SSL es probablemente uno de los peores diseños que he visto en más de 30 años de administración profesional de sistemas. ¿Alguna vez se preguntó por qué la criptografía no se ha convertido en la corriente principal en los últimos 30 años? Es por eso. 'Nuff dijo.fuente
Tuve que hacer una verificación de un certificado de letencrypt y lo hice así:
Emita este comando:
fuente
Después de romper un día entero sobre exactamente el mismo problema, sin conocimiento previo de los certificados SSL, descargué el Administrador de almacenes de claves CERTivity e importé mi almacén de claves, y obtuve una visualización clara de la cadena de certificados.
Captura de pantalla :
fuente
openssl verify
.Si solo desea verificar que el emisor de
UserCert.pem
es realmenteIntermediate.pem
haga lo siguiente (el ejemplo usa:)OpenSSL 1.1.1
:y obtendrás:
o
fuente
openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem
en Python 3.7?Puede verificar fácilmente una cadena de certificados con openssl. La cadena completa incluirá el certificado de CA, por lo que debería ver detalles sobre la CA y el certificado en sí.
openssl x509 -in fullchain.pem -text -noout
fuente