As with most other internet services, Dovecot can be configured to use TLS encryption — and, unlike some others (such as web servers or SMTP servers), there’s little reason not to enforce it.
Notes:
- Like other recent TLS tutorials on this blog, this is, of course, not a full Dovecot guide — that would be far too complex for a blog post. Instead, it’s just focused on enabling/configuring TLS encryption. I’ll be assuming you already have Dovecot configured, and are able to access mailboxes on your server using an email client.
- I’ll be focusing on IMAP only, not POP3 or anything else.
- The server will be configured to require encryption, for both privacy and security reasons. I don’t know of any modern email client that doesn’t allow encrypted connections (and even then, you might work around it by configuring an encrypted tunnel, but that falls out of this post’s scope).
1. Getting a certificate
While I believe most modern email clients will support ECDSA certificates, such clients are not a known quantity like, say, web browsers are, so I suggest that you create an RSA certificate, unless you already have one whose Common Name (CN) matches your server’s public name (e.g. mail.domain.com). Dovecot versions 2.2.31 and newer support configuring alternative certificates so that you could support both kinds at the same time, but there’s probably little gain in doing that, since most clients will likely default to RSA anyway (and, unless you’re using Let’s Encrypt, certificates are not free).
So, put your certificate and private key in /etc/dovecot/. Let’s assume the certificate is called myserver-full.crt 1, and the private key is myserver.key. You should protect the private key from any users on your server, so do, for instance,
2. Configuring Dovecot for TLS
I’m assuming your Dovecot installation has a basic configuration file in /etc/dovecot/dovecot.conf, but the real “meat” of the configuration is in included files in /etc/dovecot/conf.d/. Your system may be slightly different, but I’m sure you can adapt. 🙂 Also, the numbers at the beginning of the file names may differ in your system.
This one isn’t really related to TLS, but it’s a good idea: edit /etc/dovecot/conf.d/20-imap.conf, and look for a line like this:
mail_plugins = $mail_plugins
and add to it (separated by a space):
imap_zlib
After all, there’s no reason not to use compression here, and bandwidth (especially on mobile) is still precious.
Now, edit /etc/dovecot/conf.d/10-ssl.conf, and add 2:
(The ssl_cipher_list line, besides setting secure defaults, sets the ChaCha20 protocol as the first one to be tried, since it’s considered one of the fastest and most secure. Note that it’ll require Dovecot linked to LibreSSL or OpenSSL 1.1.x to use that cipher, though Dovecot won’t complain if it doesn’t have access to it; it’ll just use the normal, secure defaults.)
If you don’t change anything else from the default configuration, the server will be listening on port 143 (IMAP) and port 993 (IMAPS). “But,” you ask, “isn’t standard IMAP unencrypted? I thought you were enforcing encryption…” Yes, but the standard IMAP port can be “upgraded” to TLS by entering the STARTTLS command, and email clients not only support that, but typically default to it (if not, just make sure you enable it). The server will refuse to authenticate any users on port 143 before they’ve “STARTTLSed”.
If you wanted to use only IMAP+STARTTLS, or only IMAPS, just edit /etc/dovecot/conf.d/10-master.conf, look for the “service” configuration, and disable the one you don’t want. But I see no problem with keeping both enabled.
Thoughts? Questions?
(To do the same to SMTP / Postfix, please see How to configure TLS encryption in Postfix.)
Hi,
“mail_plugins = $mail_plugins imap_zlib” didn’t work for me I had to put “mail_plugins = $mail_plugins zlib” (no imap_) – this is with 1:2.1.7-7+deb7u1
Cheers.
Hi,
yes, according to https://wiki2.dovecot.org/Plugins/Compress, the syntax for 2.1 is slightly different. Thanks for the tip, it may be useful to other readers. 🙂
i have this ssl_protocols = !SSLv2 !SSLv3 and my dovecot give to me an alert
config: Warning: SSLv2 not supported by OpenSSL. Please consider removing it from ssl_protocols.