macOS - verify certificate with openssl
After installing an application with a certificate one should verify if this was well done. For example for a mail gateway - running SMTP on port 25 - this is typically done with the following command
echo QUIT | openssl s_client -connect mail.gateway.domain:25 -starttls smtp
If everything is fine you get lines like this ( as an example )
CONNECTED(00000003) depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA verify return:1 depth=1 /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3 verify return:1 depth=0 /CN=mail.gateway.domain verify return:1
… and many other lines. Return code “1” means success.
But not so with macOS ( In my case version 10.12.1 ) Trying the same it could be a result like this
CONNECTED(00000003) depth=2 /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority verify error:num=19:self signed certificate in certificate chain verify return:0
or this
CONNECTED(00000003) depth=1 /C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3 verify error:num=20:unable to get local issuer certificate verify return:0
Return code “0” says there is an error.
The issue is “openssl” doesn’t know where the root certificates are located in the file system. To overcome this problem “openssl” has the option
-CApath /path/to/certs
This is in most UNIX systems “/etc/ssl/certs”
Unfortunately macOS doesn’t have it. The certificates are stored in key-chains. You can find all of them if you open the “Keychain Access” application. If you select “System Roots” and “Certificates” you can find all of them. But “openssl” doesn’t use this.
One solution could be to export the certificates with the “Keychain Access” application. But this is a very painful work. Another solution could be to copy all these files from another UNIX / Linux / Solaris system to any directory of your choice and run “openssl” with the “-CApath” option. This is the approach I used.