Estoy tratando de generar un error de verificación de certificado openssl s_client
como este:
$ openssl s_client -crlf -verify 9 \
-CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
-starttls smtp -host mx-ha03.web.de -port 25
El certificado del servidor web.de está certificado por Deutsche Telekom CA, no por TURKTRUST, por lo que el comando anterior debería fallar, ¿verdad?
Pero informa:
Verify return code: 0 (ok)
¿Por qué?
Me refiero a que un comando analógico gnutls-cli falla como se esperaba:
$ { echo -e 'ehlo example.org\nstarttls' ; sleep 1 } | \
gnutls-cli --starttls --crlf \
--x509cafile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
--port 25 mx-ha03.web.de
[..]
*** Verifying server certificate failed...
Haciendo una verificación cruzada, es decir, usando en su lugar --x509cafile /etc/ssl/certs/ca-certificates.crt
con gnutls-cli obtengo:
[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted
(que también se espera)
Openssl s_client imprime para ca-certificados.crt:
Verify return code: 0 (ok)
El mismo resultado que para TURKTRUST ...
Primero sospeché de openssl usando una configuración predeterminada para -CApath
(es decir, / etc / ssl / certs), pero cuando llego strace
al proceso solo veo la open
llamada al sistema para el argumento de CAfile
.
(todas las pruebas realizadas en un servidor Ubuntu 10.04)
Actualización: Copié el certificado TURKTRUST en un sistema Fedora 20 y ejecuté la primera instrucción openssl; allí obtengo un resultado diferente:
Verify return code: 19 (self signed certificate in certificate chain)