Fondo:
- Servidor Ubuntu 14.10 de 64 bits en aws.amazon.com/ec2
- Certificado de servidor PositiveSSL económico de COMODO
- 1 certificado de servidor, 2 certificados de CA intermedia y 1 certificado de CA raíz como archivo ZIP de COMODO
- WebCit de la Ciudadela httpsd
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 se alinean correctamente a lo largo de la cadena, pero:
verify error:num=19:self signed certificate in certificate chain
Openssl no acepta el certificado de CA raíz, aunque se encuentra de forma predeterminada 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
cuyos enlaces
/usr/share/ca-certificates/mozilla/AddTrust_External_Root.crt
son idénticos.
¿Que esta mal aquí?
Respuesta1
OpenSSL al menos hasta la actual (1.0.2a) tiene unabichodonde s_client
sin -CA{path,file}
argumentoen realidad no utiliza el almacén de confianza predeterminadocomo debería y, por lo tanto, no puede verificar los certificados que sean válidos según ese almacén de confianza. (También s_server
y s_time
, pero es poco común preocuparse por la verificación en ellos).https://serverfault.com/questions/607233/how-to-make-openssl-s-client-using-default-ca. Se anuncia una solución en desarrollo, pero es posible que tarde algún tiempo en publicarse y distribuirse. Mientras tanto, debe especificar explícitamente los -CA*
argumentos. Tenga en cuenta que openssl verify
no tiene este error y, por lo tanto, informó correctamente el certificado/cadena como válido.
ACTUALIZACIONES26/08/2015:la solución fue lanzada12/06/2015 en 1.0.1o y 1.0.2c. Además, mientras investigaba algo más descubrí queEs posible que los paquetes de RedHat hayan estado bien. Más específicamente, el RPM de origen de CentOS, que openssl-1.0.1e-30.el6.11
según tengo entendido es una copia del de RedHat (pero no puedo confirmarlo fácilmente), contiene openssl-1.0.1c-default-paths.patch
cambios con s_client.c s_server.c s_time.c
fecha del 2012/12/06 que parecen equivalentes (aunque no textualmente iguales) al de 2015. /06/12 correcciones ascendentes. Suponiendo que este parche se aplicó en los paquetes RedHat y CentOS, que no puedo volver atrás y verificar fácilmente, habrían funcionado como se esperaba.
Respuesta2
Recientemente me enfrenté a un problema similar con los certificados de Comodo cuando desarrollaba 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 similar a este (deberá usar diferentes nombres de certificados según lo que haya descargado):
cat EssentialSSLCA_2.crt ComodoUTNSGCCA.crt UTNAddTrustSGCCA.crt AddTrustExternalCARoot.crt > yourDomain.ca-bundle
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:
openssl verify -untrusted yourDomain.ca-bundle cert.pem
Ese ejemplo fue adaptado deeste artículo de StackExchange sobre Unix y Linux.
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-certificates
sudo mkdir /usr/share/ca-certificates/extra
Copie el archivo '.crt' al directorio
sudo cp foo.crt /usr/share/ca-certificates/extra/foo.crt
Deje que Ubuntu agregue la ruta del archivo '.crt' relativa a /usr/share/ca-certificates a /etc/ca-certificates.conf
sudo dpkg-reconfigure ca-certificates
Respuesta3
Ya no se confía en el certificado raíz de Comodo; busque en Google "certificado robado de Comodo" si no sabe por qué.
Si bien un certificado de comodo puede ser barato, su valor es mucho menor que su precio: en realidad no tiene valor, la cadena de confianza está rota.