在本指南中,你将学习如何在邮件服务器上安装 ACME SSL 证书,特别是使用支持ACME + EAB 的商业供应商在Postfix、Dovecot 和 Exim 上安装。我们将使用acme.sh注册你的 ACME 账户,为你的邮件主机名签发证书,然后将证书直接插入邮件服务器的 TLS 配置中。

本指南假设有一个基于 Linux 的邮件服务器和一个商业 CA,该 CA 提供 ACME 目录 URL 和 EAB 凭据(密钥 ID + HMAC)。由于不同发行版和主机设置的邮件环境各不相同,因此请将本指南视为一个清晰、可靠的蓝图,但在使用过程中一定要检查自己服务器的路径、服务名称和 TLS 设置。
开始之前
如果这些基础知识都已准备就绪,您将会更加顺利:
- 邮件主机名,例如 mail.example.com,并带有指向邮件服务器的 A/AAAA 记录
- 指向该主机名的MX 记录(常见设置)
- 使用sudo 或root通过 Shell/SSH 访问邮件服务器
- 提供 ACME 目录 URL(如 https://acme.yourca.com/v2/acme)、EAB 密钥 ID 和 EAB HMAC 密钥的商业 CA 帐户
- 邮件堆栈:Postfix/Exim 用于 SMTP,Dovecot 用于 IMAP/POP3
我们将使用DNS-01 验证,因为即使您的邮件服务器不运行公共网站,它也能正常工作,而且在生产中通常是首选。
步骤 1:在邮件服务器上安装 acme.sh
您将直接在邮件服务器上安装 ACME 客户端,这样它就能更新证书并将证书写入磁盘,供 Postfix/Dovecot/Exim 读取。
在邮件服务器上:
curl https://get.acme.sh | sh
source ~/.bashrc
acme.sh --version
如果看到版本号,说明客户端已安装就绪。如果source ~/.bashrc 行不起作用,请退出并重新登录,然后再次运行acme.sh --version 。
步骤 2:注册 ACME 账户(使用 EAB)
接下来,您需要使用商业 CA 面板上的 EAB 凭证,在商业 CA 注册 ACME 帐户。acme.sh 通过--eab-kid 和--eab-hmac-key 支持 EAB。
在邮件服务器上运行此功能:
acme.sh --register-account \
--server https://acme.yourca.com/v2/acme \
--eab-kid YOUR_EAB_KID \
--eab-hmac-key YOUR_EAB_HMAC_KEY \
--accountemail [email protected]
更换:
https://acme.yourca.com/v2/acme使用您 CA 的ACME 目录 URLYOUR_EAB_KID与密钥 IDYOUR_EAB_HMAC_KEY的HMAC 密钥[email protected]用您的真实管理电子邮件发送过期通知
每个账户只需执行一次。如果命令失败,几乎总是 URL 或 EAB 值有错字。
步骤 3:通过 DNS-01 签发证书
现在,您需要为用户将要连接的主机名申请证书,例如mail.example.com (或imap.example.com,smtp.example.com 。只需选择您在客户端配置中实际使用的主机名)。
签发证书(手动 DNS)
运行:
acme.sh --issue \
-d mail.example.com \
--dns dns_manual \
--server https://acme.yourca.com/v2/acme
--dns dns_manual 告诉acme.sh ,您将在 DNS 面板中手动添加 TXT 记录。
客户端将输出类似内容:
Please add a TXT record:
_acme-challenge.mail.example.com → some-long-token-value
添加 TXT 记录
在 DNS 提供商的面板中,创建 TXT 记录:
- 名称:
_acme-challenge.mail.example.com - 值:由
acme.sh
等待几分钟让 DNS 传播,然后用 DNS 验证:
dig TXT _acme-challenge.mail.example.com +short
如果在那里看到了令牌,请再次运行acme.sh --issue 命令完成验证。验证成功后,acme.sh 会将文件存储在~/.acme.sh/mail.example.com/ 下。
在该目录中至少有
- fullchain.cer – 证书加中间链
- mail.example.com.key– 私有密钥
- ca.cer– CA 证书(如果您的 CA 单独提供)。
我们将在接下来的步骤中使用它们。
第 4 步:配置 Postfix 以使用 ACME 证书(SMTP)
Postfix 需要知道新证书和密钥的位置。Postfix 中的 TLS 由smtpd_tls_cert_file 和smtpd_tls_key_file 等选项控制。
首先,将文件复制到一个稳定的位置,例如
sudo mkdir -p /etc/ssl/mail
sudo cp ~/.acme.sh/mail.example.com/fullchain.cer /etc/ssl/mail/mail-fullchain.cer
sudo cp ~/.acme.sh/mail.example.com/mail.example.com.key /etc/ssl/mail/mail.key
sudo chown root:root /etc/ssl/mail/*
sudo chmod 600 /etc/ssl/mail/mail.key
然后告诉 Postfix 使用它们:
sudo postconf -e 'smtpd_use_tls = yes'
sudo postconf -e 'smtpd_tls_security_level = may'
sudo postconf -e 'smtpd_tls_cert_file = /etc/ssl/mail/mail-fullchain.cer'
sudo postconf -e 'smtpd_tls_key_file = /etc/ssl/mail/mail.key'
sudo postconf -e 'smtp_tls_security_level = may'
smtpd_*设置控制接收邮件(向您发送邮件的客户端)smtp_*设置控制外发邮件(您的服务器向他人发送邮件)
应用更改:
sudo systemctl restart postfix
如果您的发行版仍使用service ,请相应调整命令。
步骤 5:配置 Dovecot 以使用 ACME 证书(IMAP/POP3)
Dovecot 可 处理 IMAP 和 POP3。您可以通过将ssl_cert 和ssl_key 指向我们刚刚准备的相同文件来配置 TLS。
打开 Dovecot 的 SSL 配置:
sudo nano /etc/dovecot/conf.d/10-ssl.conf
更新(或添加)这几行:
ssl = yes
ssl_cert = </etc/ssl/mail/mail-fullchain.cer
ssl_key = </etc/ssl/mail/mail.key
保存文件并重新加载 Dovecot:
sudo systemctl restart dovecot
现在,通过 TLS 发送的 IMAP/POP3 将显示相同的 ACME 商业证书。
可选:在 Exim 中使用相同的证书
如果使用Exim而不是 Postfix 作为邮件服务器,整合方式也类似。Exim 对 TLS 使用tls_certificate 和tls_privatekey 选项。
在 Exim 配置(路径取决于发行版,通常是/etc/exim4/exim4.conf.template或/etc/exim4/conf.d/ 下的 split config)中设置:
tls_certificate = /etc/ssl/mail/mail-fullchain.cer
tls_privatekey = /etc/ssl/mail/mail.key
然后重新加载 Exim:
sudo systemctl restart exim4
如果服务名称略有不同,请查看您的发行包文档。
步骤 6:测试邮件 TLS
您可以从任何其他安装了OpenSSL 的机器上进行测试。
测试 SMTP(Postfix 或 Exim)
openssl s_client -starttls smtp -connect mail.example.com:587 -showcerts
测试 IMAP(Dovecot)
openssl s_client -starttls imap -connect mail.example.com:143 -showcerts
如果输出结果显示您的商业 CA 和主机名相匹配,就没问题了。
第 7 步:保持续订和重新加载自动化
acme.sh 已经安装了一个 cron 作业,每天检查更新情况。当证书快到期时,它会自动更新并更新~/.acme.sh/mail.example.com/ 中的文件。
要使 Postfix/Dovecot/Exim 始终使用最新版本,您有两个选择:
- 将配置直接指向~/.acme.sh/mail.example.com/
中的文件(例如,smtpd_tls_cert_file = /root/.acme.sh/mail.example.com/fullchain.cer),并确保只有 root 才能读取它们。 - 编写一个小型部署脚本,将更新后的文件复制到
/etc/ssl/mail/,然后重启或重新加载服务器。
脚本示例
#!/usr/bin/env bash
DOMAIN="mail.example.com"
SRC="$HOME/.acme.sh/$DOMAIN"
DEST="/etc/ssl/mail"
sudo cp "$SRC/fullchain.cer" "$DEST/mail-fullchain.cer"
sudo cp "$SRC/$DOMAIN.key" "$DEST/mail.key"
sudo chown root:root "$DEST/"*
sudo chmod 600 "$DEST/mail.key"
sudo systemctl restart postfix dovecot
该脚本会将新签发的 ACME 证书和私钥复制到服务器的邮件 SSL 目录中,设置正确的所有权和权限,然后重启 Postfix 和 Dovecot,使它们立即开始使用更新后的证书。请使用你的证书而不是占位符。
然后将其接入acme.sh :
acme.sh --install-cert -d mail.example.com \
--key-file ~/.acme.sh/mail.example.com/mail.example.com.key \
--fullchain-file ~/.acme.sh/mail.example.com/fullchain.cer \
--reloadcmd "/path/to/your/deploy-script.sh"
从现在起,续费将自动进行。
常见问题与故障排除
第一次这样做时,可能会遇到一些问题。下面介绍如何快速解决这些问题。
为什么 ACME 验证失败时会显示 “未授权 “或 “无效响应”?
当 CA 无法验证您的 DNS TXT 记录时,就会出现这种情况。请检查这一点:
- TXT 记录正是
_acme-challenge.mail.example.com - 标记没有多余的引号或空格
- DNS 已传播 (
dig TXT _acme-challenge.mail.example.com +short) - 您没有将mail.example.com与example.com混淆
如果不确定,请删除 TXT 记录,重新运行acme.sh --issue ,并重新添加 ACME 给出的准确值。
为什么会出现 “accountDoesNotExist “或 EAB 相关错误?
当您的 ACME 帐户注册与 CA 的 EAB 凭据不匹配时,就会出现这种情况。
修复:
- 重新检查 ACME 目录 URL(生产版与暂存版)
- 确保准确复制密钥 ID 和 HMAC,不留任何隐藏空格
- 使用正确的数值重新运行一次注册命令
商业 CA 拒绝任何与其发布的资料不符的 EAB 注册。
为什么 SMTP/IMAP 仍然显示旧证书?
这意味着服务没有重新加载新证书,或者是从不同路径读取的。检查:
- Postfix/Dovecot/Exim 中的 TLS 路径与实际文件相匹配
- 您重新启动了正确的服务 (
systemctl restart postfix dovecot exim4) - 没有第二个实例、容器或代理服务旧证书
您可以使用
openssl s_client -connect mail.example.com:465 -servername mail.example.com
最后的话
有了这个设置,你的邮件服务器就能向 SMTP 和 IMAP/POP3 客户端提供正式的商业 ACME 证书,而acme.sh则在后台悄悄地处理证书更新。您可以完全控制证书链和文件名,您的用户不会再看到安全警告,您也不必每隔几个月就登录并手动上传新文件。
一旦完成一次,您就可以使用相同的 ACME 账户和流程,对其他主机名、辅助 MX 服务器或其他邮件堆栈重复相同的模式。

