Próbuję wygenerować błąd weryfikacji certyfikatu w openssl s_client
następujący sposób:
$ 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
Certyfikat serwera web.de jest certyfikowany przez Deutsche Telekom CA, a nie TURKTRUST, więc powyższe polecenie powinno zawieść, prawda?
Ale informuje:
Verify return code: 0 (ok)
Dlaczego?
Mam na myśli, że analogiczne polecenie gnutls-cli kończy się niepowodzeniem zgodnie z oczekiwaniami:
$ { 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...
Robiąc crosscheck, tzn. Używając zamiast tego --x509cafile /etc/ssl/certs/ca-certificates.crt
z gnutls-cli otrzymuję:
[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted
(co jest również oczekiwane)
Otwarcie s_client drukuje dla certyfikatów ca.crt:
Verify return code: 0 (ok)
Taki sam wynik jak dla TURKTRUST ...
Najpierw podejrzewałem, że openssl używa domyślnego ustawienia dla -CApath
(tj. / Etc / ssl / certs) - ale kiedy jestem strace
w trakcie procesu, widzę tylko open
wywołanie systemowe dla argumentu CAfile
.
(wszystkie testy wykonane na serwerze Ubuntu 10.04)
Aktualizacja: Skopiowałem certyfikat TURKTRUST do systemu Fedora 20 i wykonałem pierwszą instrukcję openssl - tam otrzymuję inny wynik:
Verify return code: 19 (self signed certificate in certificate chain)