I am trying to yield a certificate verification error with openssl s_client like this:
$ 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
The certificate of the web.de server is certified by the Deutsche Telekom CA, not TURKTRUST, thus the above command should fail, right?
But it reports:
Verify return code: 0 (ok)
Why?
I mean an analog gnutls-cli command fails as expected:
$ { 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...
Doing a crosscheck, i.e. using instead --x509cafile /etc/ssl/certs/ca-certificates.crt with gnutls-cli I get:
[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted
(which is also expected)
Openssl s_client prints for ca-certificates.crt:
Verify return code: 0 (ok)
The same result as for TURKTRUST ...
First I suspected openssl using a default setting for -CApath (i.e. /etc/ssl/certs) - but when I strace the process I just see just the open syscall for the argument of CAfile.
(all tests done on a Ubuntu 10.04 server)
Update: I've copied the TURKTRUST certificate to a Fedora 20 system and executed the first openssl statement - there I get a different result:
Verify return code: 19 (self signed certificate in certificate chain)