保护你网站的同一个 Let’s Encrypt 证书也可以加密你的邮件连接。本指南涵盖最常见邮件服务器的 TLS 配置。
为什么邮件需要 TLS
没有 TLS,邮件流量(包括密码和邮件内容)以明文发送:
- SMTP(发送邮件)— 端口 25/587 默认未加密
- IMAP(读取邮件)— 端口 143 默认未加密
- POP3(读取邮件)— 端口 110 默认未加密
TLS 加密这些连接的方式与 HTTPS 加密 Web 流量相同。现代邮件客户端期望 TLS 并会对未加密连接发出警告。
证书设置
你可以将 GetHTTPS 生成的同一套证书文件同时用于 Web 服务器和邮件服务器——只要证书覆盖了邮件服务器使用的主机名(如 mail.example.com)。
获取覆盖邮件主机名的证书:
- 在 GetHTTPS 中,添加
mail.example.com(或 MX 记录指向的任何主机名) - 你可以将它与 Web 域名一起包含:
example.com+www.example.com+mail.example.com - 下载文件:
fullchain.pem、privkey.pem
Postfix (SMTP)
编辑 /etc/postfix/main.cf:
# TLS for outbound mail (sending)
smtp_tls_security_level = may
smtp_tls_loglevel = 1
# TLS for inbound mail (receiving) — STARTTLS on port 25/587
smtpd_tls_cert_file = /etc/ssl/gethttps/fullchain.pem
smtpd_tls_key_file = /etc/ssl/gethttps/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_loglevel = 1
对于 submission(端口 587),编辑 /etc/postfix/master.cf:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
重新加载:sudo systemctl reload postfix
Dovecot (IMAP/POP3)
编辑 /etc/dovecot/conf.d/10-ssl.conf:
ssl = required
ssl_cert = </etc/ssl/gethttps/fullchain.pem
ssl_key = </etc/ssl/gethttps/privkey.pem
ssl_min_protocol = TLSv1.2
ssl_prefer_server_ciphers = no
注意文件路径前的 <——Dovecot 使用此语法来内联读取文件内容。
重新加载:sudo systemctl reload dovecot
IMAP/POP3 端口
| 服务 | 未加密 | STARTTLS | 隐式 TLS(推荐) |
|---|---|---|---|
| IMAP | 143 | 143(升级) | 993 |
| POP3 | 110 | 110(升级) | 995 |
| SMTP submission | 587 | 587(升级) | 465 (smtps) |
现代邮件客户端应连接到隐式 TLS 端口(993、995、465)。在 Dovecot 和 Postfix 中同时配置这些端口和 STARTTLS 端口。
验证邮件 TLS
# Test SMTP STARTTLS
openssl s_client -connect mail.example.com:587 -starttls smtp
# Test IMAP implicit TLS
openssl s_client -connect mail.example.com:993
# Test SMTP implicit TLS (smtps)
openssl s_client -connect mail.example.com:465
查找 Verify return code: 0 (ok) 和你的证书详情。
续签
当你续签 Let’s Encrypt 证书时,替换文件并同时重新加载 Web 服务器和邮件服务器:
sudo systemctl reload nginx # web
sudo systemctl reload postfix # SMTP
sudo systemctl reload dovecot # IMAP
如果使用 Certbot 配合 --deploy-hook,将邮件服务器的重新加载添加到 hook 脚本中。
常见问题
可以将同一个证书用于 Web 和邮件吗?
可以——只要证书的 SAN(Subject Alternative Name)包含邮件服务器的主机名。如果你的 MX 指向 mail.example.com,在申请证书时包含该名称。
Let’s Encrypt 适用于邮件服务器吗?
适用。Let’s Encrypt 证书是标准的 X.509 证书,可与任何支持 TLS 的服务配合使用——不仅仅是 Web 服务器。证书不关心它被用于 HTTPS、SMTP、IMAP 还是其他任何用途。
每个邮件协议都需要单独的证书吗?
不需要。一个证书可以同时用于 SMTP(Postfix)、IMAP(Dovecot)和你的 Web 服务器。将所有服务指向相同的 fullchain.pem 和 privkey.pem。
Microsoft Exchange 怎么处理?
Exchange 使用 PFX/PKCS#12 格式。将你的 PEM 文件转换为 PFX,然后通过 Exchange Admin Center → Servers → Certificates → Import 导入。过程类似于 IIS 证书安装。