
Estoy intentando crear un script que pruebe si un sitio web utiliza un certificado no autofirmado válido para su dominio. Lo que significa que no mostraría una advertencia en el navegador.
lo he probado con
openssl s_client -connect www.example.com:443 -servername www.example.com
Aunque el certificado no es válido para el dominio, sigo recibiendo:
Verificar código de retorno: 0 (ok)
¿Alguna idea de cómo puedo lograrlo?
Respuesta1
Si desea que openssl verifique realmente el certificado, debe indicárselo.
1. Comprobar si el nombre de host en el certificado coincide con el nombre que desea
Hay una opción específica para eso -verify_hostname
. En el siguiente comando, lo uso en serverfault.com pero lo comparo con el nombre de host example.com:
[jenny@temeraire crt] $ openssl s_client -verify_hostname example.com -connect serverfault.com:443
CONNECTED(00000003)
[...]
Verify return code: 62 (Hostname mismatch)
---
DONE
Sin embargo, el código de retorno del proceso en sí sigue siendo 0, lo que significa que debe mirar el resultado en lugar de usar el código de retorno en una prueba.
2. Comprobar si el certificado proviene de una CA confiable
Lo ejecuté en el sitio web serverfault.com, sin darle una lista de CA confiables para verificar nuevamente para garantizar que fallará la verificación:
[jenny@galactica tmp] $ openssl s_client -verify 2 -connect serverfault.com:443
[...]
Verify return code: 27 (certificate not trusted)
Sin embargo, openssl aún le dará el código de retorno 0, ya que el comando realmente se ejecutó correctamente, lo que dificulta la creación de scripts.
Una mejor manera de hacerlo sería descargar primero el certificado y luego ejecutarlo openssl verify
:
[jenny@galactica tmp] $ openssl verify selfsignedcert.pem; echo $?
selfsignedcert.pem: C=SE, O="Nevermind", CN=foo.example.com
error 18 at 0 depth lookup: self signed certificate
18
Como puede ver, obtuve el código de retorno 18 que significa "certificado autofirmado". Hay varios otros códigos de error; consulte la página de manual para verify
obtener más información.