On 02 Dec 2015, at 17:38, NederHost/Sebastiaan Hoogeveen <[email protected]> wrote: > > Hi, > > In case of tl;dr: I fixed a bug in TLS support for LMTP which caused chained > certificates not to work, and another one which caused certificate read > errors to be ignored; the patches are attached to this email. > > While testing LMTP with TLS and certificate verification by Postfix I > discovered that certificate chains are not exchanged properly when using > LMTP, even though everything works fine for POP3 and IMAP (both with or > without STARTTLS). On LMTP only the server certificate is included in the TLS > handshake, no intermediate certificates are provided by the server. > > The first problem I fixed is that in > lib-ssl-iostream/iostream-openssl-context.c errors from the > ssl_ctx_use_certificate_chain function are silently ignored because the > function returns 0 for a failure but the caller checks for values smaller > than 0. This problem is fixed in the tiny patch > dovecot-2.2.19-ssl_ctx_certificate_chain_returnvalue.diff.
Applied. > After applying this patch the following error message appears in the logs for > LMTP only (IMAP and POP3 still work fine): > > dovecot: lmtp(20683): Error: SSL context initialization failed, disabling > SSL: Can't load SSL certificate: error:0608308E:digital envelope > routines:EVP_PKEY_get1_EC_KEY:expecting a ec key > > It turns out this issue is not related to the reading of the certificate or > its associated chain. Somewhere before ssl_ctx_use_certificate_chain is > called an error is put in the OpenSSL error queue which is never retrieved. > Only after loading the server certificate is the queue checked and because of > the previously existing error the chain is not loaded. I think the error is > related to setting specific protocol options in ssl_iostream_context_set > (which may be different for LMTP than for IMAP or POP3) but I did not > investigate this. http://hg.dovecot.org/dovecot-2.2/rev/302c3c7e11f8 should fix it. > I made the problem go away by making the following two changes: > > 1. The ssl_ctx_use_certificate_chain function now empties the OpenSSL error > queue before doing its work by calling ERR_get_error() until the queue is > empty. > > 2. The openssl_iostream_error function in a similar fashion empties the queue > and returns only the error message for the most recent error (this prevent > earlier errors from 'hiding' later/more relevant ones). > > After applying this second patch LMTP now works properly with certificate > chains. Note that this patch makes previously unhandled errors simply > 'disappear' from the queue, which may be a Very Bad Thing. I guess there is a > more elegant way of handling this "queued error" issue but this works for me > now and I'm actually not a C programmer. These two fixes are included in > dovecot-2.2.19-lmtp_ssl_bug.diff. I changed this to work the same in lib-ssl-iostream as it works in login-common/ssl-proxy-openssl.c (I wonder why it didn't originally work the same way..) and also merged more of the error handling code in login-common and lib-ssl-iostream.
