在本指南中,我们将展示如何在典型的 Postfix-Dovecot 邮件服务器上为传入和传出连接启用受信任的 SSL/TLS 加密的可能方法。
我们使用了 PositiveSSL 证书进行测试;不过,ZTABOX 提供的任何证书都能保护此类型的邮件服务器。测试是在以下服务器堆栈上进行的:
- Ubuntu 16.04
- Postfix 3.1.0
- Dovecot 2.2.22
如果您尚未为您的邮件服务器主机名获得有效的 SSL 证书,请随时购买一个,生成 CSR 代码并激活它。
当证书发出后,可以从 ZTABOX 电子邮件或由证书授权机构发送到证书管理联系电子邮件地址的履行电子邮件中下载。
在服务器上上传和串联证书文件
- 证书文件 yourdomainname.crt 需要与 CA 包一起上传到服务器,CA 包可以是单个文件(yourdomainname.ca-bundle)或是分开的文件(COMODORSADomainValidationSecureServerCA.crt, COMODORSAAddTrustCA.crt, AddTrustExternalCARoot.crt,如我们的情况)。我们已将证书和 CA 包文件保存在/etc/ssl/certs/ 目录中,并将相应的私钥 (yourdomainname.key)保存在/etc/ssl/private/ 活页夹中。
- 使用以下命令之一串联上传的文件:
- 创建一个包含叶子(服务器)证书和 CA 链的文件:- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/yourdomainname.ca-bundle >> /etc/ssl/certs/certificate.crt
- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/COMODORSADomainValidationSecureServerCA.crt /etc/ssl/certs/COMODORSAAddTrustCA.crt /etc/ssl/certs/AddTrustExternalCARoot.crt >> /etc/ssl/certs/certificate.crt
- Postfix 和 Dovecot 可以接受存储在单个文件中的证书、CA 链和私钥。使用以下命令之一来创建它:- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/yourdomainname.ca-bundle /etc/ssl/private/yourdomainname.key >> /etc/ssl/certs/certificate_and_key.crt
- cat /etc/ssl/certs/yourdomainname.crt /etc/ssl/certs/COMODORSADomainValidationSecureServerCA.crt /etc/ssl/certs/COMODORSAAddTrustCA.crt /etc/ssl/certs/AddTrustExternalCARoot.crt /etc/ssl/private/yourdomainname.key >> /etc/ssl/certs/certificate_and_key.crt
要检查新创建文件的内容,运行 cat /etc/ssl/certs/certificate.crt 或 cat /etc/ssl/certs/certificate_and_key.crt。确保输出中证书和密钥块之间或内部不包含多余的空白。如果您看到空格,可以在如 'vi' 或 'nano' 的文本编辑器中打开文件并手动删除它们。
编辑 Postfix 和 Dovecot 配置文件以在特定端口启用 SSL/TLS
通过互联网发送和接收邮件依赖于一个复杂的端点和中介实例系统(邮件服务器和客户端软件),根据其执行的功能被标记为邮件用户代理 (MUA)、邮件提交代理 (MSA)、邮件传输代理 (MTA) 和邮件交付代理 (MDA)。通常,电子邮件会在上述每种类型的各方之间传递,并且在每一步都使用不同的传输协议,即提交协议、简单邮件传输协议 (SMTP)、邮局协议 (POP3) 和互联网消息访问协议 (IMAP)。
以下表格指定了用于特定传输协议执行的端口。
| 协议 | 用途 | 明文/加密会话 | 仅加密会话 |
|---|---|---|---|
| POP3 | 传入邮件 | 110 | 995 |
| IMAP | 传入邮件 | 143 | 993 |
| SMTP | 传出邮件 | 25 | 465 |
| 提交 | 传出邮件 | 587 |
在明文(未加密)或安全(加密)模式下使用端口 25、110、143 和 587 的可能性来自于机会性 TLS 方法,根据该方法,当存在活动的明文会话时,将调用 STARTTLS 命令。
使用端口 465、993 和 995 的技术侧面类似于 HTTP 协议在 SSL/TLS 上的使用:1) 安全端口与其 "未安全" 对应端口分开;2) 建立加密会话在任何数据交换之前进行。
注意:虽然端口 465 在 IANA 的文档中并未正式标准化为 SMTPS 端口,但邮件服务器管理员一直在使用和使用它来提供加密的传出邮件流量。
事实上,这两种描述的技术现在都广泛应用于互联网邮件系统中,良好的安全实践是在您计划使用的每个邮件端口上应用 SSL 证书。
现在让我们继续,为传入和传出邮件端口启用 SSL 证书。
端口 25 (SMTP 与 STARTTLS)
打开 Postfix 的 main.cf 配置文件进行编辑。它通常存储在 /etc/postfix/ 目录中。找到 main.cf 内的 TLS 参数部分,并根据以下显示的方式更改某些指令的值:
- 如果证书和私钥保存在分开的文件中:
smtpd_tls_cert_file=/etc/ssl/certs/certificate.crt
smtpd_tls_key_file=/etc/ssl/private/yourdomainname.key - 如果证书和私钥保存在单个文件中:
smtpd_tls_cert_file=/etc/ssl/certs/certificate_and_key.crt
smtpd_tls_key_file=$smtpd_tls_cert_file - 确保 smtpd_use_tls 指令设置为 yes:
smtpd_use_tls=yes
关闭 main.cf 文件并保存更改。

端口 587 (提交与 STARTTLS) 和 465 (SMTPS)
打开位于 /etc/postfix/ 目录中的 Postfix 的 master.cf 文件,并取消注释(如有需要可进行编辑)以下行:
- 为端口 587 打开和保护:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes - 为端口 465 打开和保护:
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
现在可以关闭 master.cf 文件。

端口 110 (POP3 与 STARTTLS)、143 (IMAP 与 STARTTLS)、993 (IMAPS) 和 995 (POP3S)
要为 Dovecot 启用 SSL 证书,打开 10-ssl.conf 文件,通常位于 /etc/dovecot/conf.d/ 目录中,并编辑以下行:
- 如果证书和私钥保存在分开的文件中:
ssl_cert = ssl_key = - 如果证书和私钥保存在单个文件中:
ssl_cert = ssl_key = - ssl 指令应设置为 yes:
ssl = yes
现在您可以关闭 10-ssl.conf 文件并保存更改。完成了。应用上述更改后,证书已为所有传入端口安装。

如果您的 Dovecot 版本为 1.x,配置文件中的 SSL 指令略有不同:
- 确保 /etc/dovecot/dovecot.conf 有以下行:
protocols = imap pop3 imaps pop3s
- 按如下方式编辑 /etc/dovecot/conf.d/10-ssl.conf 文件:
ssl_disable = no
- 如果证书和私钥保存在分开的文件中
ssl_cert_file = ssl_key_file =- 如果证书和私钥保存在单个文件中
ssl_cert_file = ssl_key_file =
进阶调整
这一部分简要描述了一些额外的设置,对于微调您的邮件服务器的 SSL/TLS 处理非常有用。随意阅读Postfix和Dovecot的官方文档以了解更多相关信息。
- 可以在 Postfix 中使用 'wrapper' 模式的 STARTTLS 端口,通过 smtpd_tls_wrappermode 指令实现,这意味着从一开始就初始化安全连接,而不是宣布支持 STARTTLS 并等待来自远程客户端的请求。该指令应添加到 /etc/postfix/master.cf(见下例):
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes - 在 Dovecot 上,您可以将 ssl 指令设置为所需值 (ssl=required),这意味着在任何登录尝试之前强制进行 SSL 握手。因此,密码将仅通过加密通道传送,而使用 ssl = yes 时邮件客户端不需要优先使用 SSL/TLS。此设置适用于明文和非明文身份验证机制。
- 要禁用明文身份验证机制,您可以使用 disable_plaintext_auth 指令 (/etc/dovecot/conf.d/10-auth.conf):
disable_plaintext_auth=yes
- 要消除由于加密强度低而最好不使用的密码,您可以在 Dovecot 上设置以下指令 (/etc/dovecot/dovecot.conf):
ssl_dh_parameters_length = 2048
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL - 在 Postfix 中,smtpd_tls_ciphers 参数控制最低的密码等级,默认设置为中等级别,足以提供稳健的安全性。如果需要排除某些密码或协议以进行机会性(STARTTLS)或强制性(常规 SSL)加密,请在 /etc/postfix/main.cf 中使用以下指令并为它们分配相应的值:
- 针对强制 TLS
smtpd_tls_mandatory_exclude_ciphers = [cipher]
smtpd_tls_mandatory_protocols = ![protocol]- 针对机会性 TLS
smtpd_tls_exclude_ciphers = [cipher]
smtpd_tls_protocols = ![protocol] - 要优先使用服务器端的密码列表而不是客户端的,您可以使用以下指令:
- 在 Dovecot (/etc/dovecot/conf.d/10-ssl.conf)
ssl_prefer_server_ciphers = yes- 在 Postfix (/etc/postfix/main.cf)
tls_preempt_cipherlist = yes
检查 SSL 安装
使用 OpenSSL
OpenSSL 工具包允许检查服务器上的 SSL 证书安装,可以远程或本地进行。要检查 STARTTLS 端口,运行以下命令,将 [port] 替换为端口号,将 [protocol] 替换为 smtp、pop3 或 imap 值(见以下示例):
openssl s_client -connect example.com:[port] -servername example.com -starttls [protocol]
同样的命令但不加 -starttls 开关可用于检查非 STARTTLS 端口:
openssl s_client -connect example.com:[port] -servername example.com

使用在线检查工具
还有许多在线工具可以检查您的邮件服务器是否支持 SSL/TLS。您只需输入服务器主机名和端口号或现有的电子邮件帐户,然后运行测试,通常只需几分钟即可完成。您可以在下面找到这些测试工具的链接:
SSL-Tools
CheckTLS
MXToolbox
High-Tech Bridge