On 1/22/2014 3:46 PM, Viktor Dukhovni wrote: > On Wed, Jan 22, 2014 at 03:07:33PM -0500, Ben Johnson wrote: >
Thanks for expanding upon Wietse's response, Viktor. >> I created the certificate with the following command: >> >> $ cat example_com.crt PositiveSSLCA2.crt AddTrustExternalCARoot.crt > >> /root/ssl/example.com.pem > > To verify that the file is well-formed try the below: > > openssl crl2pkcs7 -nocrl -certfile /root/ssl/example.com.pem | > openssl pkcs7 -print_certs -text | > less > > You should see the verbose decoding of the certificates in the > correct order. > And I do. That's a handy command to have around; thanks for that. >> # TLS parameters >> smtpd_tls_cert_file = /root/ssl/example.com.pem >> smtpd_tls_key_file = /root/ssl/example.com.key >> smtpd_use_tls = yes >> >> But when I attempt to verify the certificate chain, I always receive >> "19:self signed certificate in certificate chain". > > There nothing wrong with that, the client did not have a suitable > CAfile or CApath configured. Very few SMTP clients do. > >> $ openssl s_client -connect example.com:25 -starttls smtp > > No -CAfile or -CApath options in this command-line. > I see. I had actually tried adding a -CApath, but I didn't think it was working correctly because no matter what path I supplied, the certificate always ended with (what I understand to be) a "success" response: Verify return code: 0 (ok) In fact, I can even use a completely non-existent path on my system, and still receive "0 (ok)", e.g.: $ openssl s_client -connect example.com:25 -starttls smtp -CApath /fake/path ... Verify return code: 0 (ok) Is there a rational explanation for this behavior? I would expect the openssl executable to complain that the supplied CApath is invalid (doesn't exist), and for the TLS session to end with something other than "Verify return code: 0 (ok)". This does seem to be the case when using -CAfile, however. If I do something like $ openssl s_client -connect example.com:25 -starttls smtp -CAfile /fake/file I see the type of output that I would expect in the former scenario with -CApath: 140106251884192:error:02001002:system library:fopen:No such file or directory:bss_file.c:169:fopen('/fake/file','r') 140106251884192:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:172: 140106251884192:error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib:by_file.c:274: [... all other expected output here ...] Verify return code: 19 (self signed certificate in certificate chain) In other words, -CApath doesn't really seem to work. At all. Unless I am misunderstanding something fundamental. >> 0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=example.com >> i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA >> Limited/CN=PositiveSSL CA 2 >> 1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA >> Limited/CN=PositiveSSL CA 2 >> i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust >> External CA Root >> 2 s:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust >> External CA Root >> i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust >> External CA Root > > This chain is good. > >> What might the problem be? Isn't the last certificate in the chain >> *supposed to be* self-signed? > > There is no problem. > That's a relief! Looks like I am in good shape here, but I am curious about the -CApath issue described above, nonetheless. Thanks again for your help, Wietse and Viktor! -Ben