Fondo:
- Ubuntu Server 14.10 de 64 bits en aws.amazon.com/ec2
- Certificado de servidor PositiveSSL barato de COMODO
- 1 certificado de servidor, 2 certificados de CA intermedios y 1 certificado de CA raíz como archivo ZIP de COMODO
- Citadel WebSite https
Problema:
La cadena de certificados concatenados parece ser correcta pero la verificación falla.
openssl s_client myhost:port
muestra la cadena de certificados y los pares emisor-sujeto alineados correctamente a través de la cadena, pero:
verify error:num=19:self signed certificate in certificate chain
El certificado raíz CA no es aceptado por openssl, aunque se encuentra por defecto en el almacén de confianza del servidor Ubuntu.
Específicamente: AddTrustExternalCARoot.crt
recibido por correo electrónico de COMODO y /etc/ssl/certs/AddTrust_External_Root.pem
que enlaza con /usr/share/ca-certificates/mozilla/AddTrust_External_Root.crt
Son identicos.
¿Que esta mal aquí?
linux
ssl
certificate
Reinhard Seifert
fuente
fuente
openssl s_client
el html de la página aparece y w3m también muestra la página después quejándose del certificado no confiable. Pero Firefox simplemente no muestra la página, sin ninguna advertencia sobre el certificado.openssl verify -CAfile chained.crt chained.crt
pasa "OK" (chained.crt es el certificado encadenado con certificado de servidor, certificados intermedios y certificado de CA raíz)! Para mí esto es un comportamiento inconsistente y extraño de openssl. La cadena de certificados es correcta, el último certificado está en el almacén de confianza y openssl lo reconoce como un único certificado y como un archivo de CA, pero no cuando es el último en una cadena. ¿Es esto un error?Respuestas:
OpenSSL al menos hasta la corriente (1.0.2a) tiene un insecto dónde
s_client
con ningún-CA{path,file}
argumento en realidad no usa el almacén de confianza predeterminado como debería y, por lo tanto, no puede verificar los certificados que son válidos de acuerdo con ese almacén de confianza. (Tambiéns_server
ys_time
, pero preocuparse por la verificación en esos casos es raro.) Ver https://serverfault.com/questions/607233/how-to-make-openssl-s-client-using-default-ca . Se anuncia una solución en dev, pero puede tardar un tiempo en ser lanzado y distribuido. Mientras tanto, debe especificar explícitamente la-CA*
argumento (s) Tenga en cuenta queopenssl verify
no tiene este error y, por lo tanto, informó correctamente el certificado / cadena como válido.Actualizaciones 26/08/2015: arreglo fue lanzado 12/06/2015 en 1.0.1o y 1.0.2c. Además, mientras investigaba algo más encontré que Los paquetes de RedHat pueden haber estado bien . Más específicamente la fuente de RPM de CentOS para
openssl-1.0.1e-30.el6.11
Lo que entiendo es una copia de la RedHat que contiene (pero no puedo confirmar fácilmente)openssl-1.0.1c-default-paths.patch
que contiene cambios as_client.c s_server.c s_time.c
con fecha 2012/12/06 que parecen equivalentes a (aunque no textualmente lo mismo que) las correcciones ascendentes de 2015/06/12. Asumiendo que este parche se aplicó en los paquetes RedHat y CentOS, que no puedo volver atrás y verificar fácilmente, funcionarían (ed) como se esperaba.fuente
Recientemente tuve un problema similar con los certificados de Comodo cuando desarrollé un script con Ruby. Al final, fue que OpenSSL no lo tenía en la tienda, aunque parecía que sí.
Para probar esto, descargue todos los certificados intermedios de Comodo y cree un paquete de certificados algo como esto (deberá usar diferentes nombres de certificados según lo que haya descargado):
Comodo tiene un artículo sobre cómo hacer esto.
Una vez hecho esto, intente verificar el certificado nuevamente usando OpenSSL y especificando el almacén de certificados en la línea de comando:
Ese ejemplo fue adaptado de este artículo de Unix y Linux StackExchange .
Una vez que haya determinado qué certificado es, debería ser posible agregar el certificado al almacén de certificados local, que se detalla aquí para Ubuntu , y es algo como:
Cree un directorio para certificados de CA adicionales en / usr / share / ca-certificate
Copie el archivo '.crt' al directorio
Permita que Ubuntu agregue la ruta del archivo '.crt' relativa a / usr / share / ca-certificate a /etc/ca-certificates.conf
fuente
openssl verify AddTrustExternalRootCA.crt
(que es el culpable al final de la cadena) solo para el certificado raíz, luego pasa "OK", es decir, openssl conoce muy bien los certificados vinculados en / etc / ssl / certs.openssl verify -CAfile CAbundle.crt myserver_com.crt
Luego pasa la prueba "OK".SSL_CTX_set_default_verify_paths()
o algunas rutinas X509_STORE relacionadas. OpenSSL línea de comando se supone que debe usar la tienda predeterminada, pero actualmente no lo hace para algunos funciones que incluyens_client
debido a un error; mira mi respuesta OTOHverify
hace Úsalo, lo que probablemente se sumó a la confusión aquí.El certificado raíz de comodo ya no es confiable: busque "certificado robado de comodo" en google si no sabe por qué.
Si bien un certificado de comodo puede ser barato, su valor es mucho menor que su precio: en efecto, es inútil, la cadena de confianza se rompe.
fuente
openssl verify AddTrustExternalCARoot.crt
directamente, pero no se acepta como el último certificado en una cadena.