Estou tentando gerar um erro de verificação de certificado da openssl s_client
seguinte forma:
$ 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
O certificado do servidor web.de é certificado pela Deutsche Telekom CA, não pela TURKTRUST, portanto, o comando acima deve falhar, certo?
Mas informa:
Verify return code: 0 (ok)
Por quê?
Quero dizer que um comando analógico gnutls-cli falha conforme o esperado:
$ { 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...
Fazendo uma verificação cruzada, ou seja, usando em vez disso --x509cafile /etc/ssl/certs/ca-certificates.crt
com gnutls-cli, recebo:
[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted
(o que também é esperado)
Openssl s_client imprime para ca-certificates.crt:
Verify return code: 0 (ok)
O mesmo resultado que para TURKTRUST ...
Primeiro, suspeitei do openssl usando uma configuração padrão para -CApath
( por exemplo, / etc / ssl / certs) - mas quando eu strace
no processo, apenas vejo o open
syscall para o argumento de CAfile
.
(todos os testes feitos em um servidor Ubuntu 10.04)
Atualização: copiei o certificado TURKTRUST para um sistema Fedora 20 e executei a primeira instrução openssl - lá recebo um resultado diferente:
Verify return code: 19 (self signed certificate in certificate chain)
fonte
-verify_return_error
o comando termina com o status de saída 1. Com o Fedora 29 e o openssl-1.1.1-3.fc29.x86_64, tudo ainda funciona como esperado, ou seja, a solução alternativa não é necessário.-no-CAfile
( Não carregue os certificados de CA confiáveis no local do arquivo padrão ) e-no-CApath
( Não carregue os certificados de CA confiáveis no local do diretório padrão ), mas meu sistema não, por isso não os testei.