
Estou tentando criar um script que testará se um site está usando um certificado não autoassinado válido para seu domínio. Significa que não mostraria um aviso no navegador.
Eu tentei com
openssl s_client -connect www.example.com:443 -servername www.example.com
Mesmo que o certificado não seja válido para o domínio, ainda recebo:
Verifique o código de retorno: 0 (ok)
Alguma ideia de como posso conseguir isso?
Responder1
Se você deseja que o openssl realmente verifique o certificado, você precisa instruí-lo a fazer isso.
1. Verificando se o nome do host no certificado corresponde ao nome desejado
Existe uma opção específica para isso, -verify_hostname
. No comando abaixo, eu o uso em serverfault.com, mas estou verificando o nome do 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
No entanto, o código de retorno do processo em si ainda é 0, o que significa que você deve observar a saída em vez de usar o código de retorno em um teste.
2. Verificando se o certificado é de uma CA confiável
Eu o executei no site serverfault.com, sem fornecer uma lista de CAs confiáveis para verificar novamente, para garantir a falha na verificação:
[jenny@galactica tmp] $ openssl s_client -verify 2 -connect serverfault.com:443
[...]
Verify return code: 27 (certificate not trusted)
No entanto, o openssl ainda fornecerá o código de retorno 0, já que o comando foi realmente executado corretamente, dificultando o script.
A melhor maneira de fazer isso seria primeiro baixar o certificado e depois executá openssl verify
-lo:
[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 você pode ver, recebi o código de retorno 18, que significa "certificado autoassinado". Existem vários outros códigos de erro; verifique a página de manual para verify
obter mais informações.