MailCleaner 是一款功能丰富的开源反垃圾邮件解决方案。其可供分发的虚拟设备 (VM) 开箱即用,为 Web 界面和 MTA 服务配备了自签名证书。
这要求您提供自己的有效、公共信任的证书。使用 Let's Encrypt 证书是实现这一目标的绝佳方式,因为它免费、安全且自动化。
在请求 Let's Encrypt 证书时,最重要的步骤是主机名验证。如果您不了解它,请查阅文档。
防火墙要求
首先,您需要定义您将使用的主机名,包括您的 MX 记录,并且它们必须指向您用于发布 MailCleaner 服务器的 IP 地址。
如果您选择在 MailCleaner 盒子上使用本地端口 80 执行验证,您将必须包含一些命令来在证书请求期间临时停止 Apache 服务。这就是我建议使用备用端口的原因,在我们的示例中,它将是 TCP 端口 8090。
在这种情况下,您有几个选项
选项 1:在您的反向代理中创建规则,以将 Let's Encrypt 验证请求转发到您的 MailCleaner 服务器。您必须将发送到 TCP 端口 80 的每个请求重定向到 MailCleaner 服务器上的 TCP 端口 8090,其中目标主机名是您的 MailCleaner 外部 FQDN,并且路径以 /.well-known/acme-challenge/
开头。
选项 2:例如,使用 NAT 规则,将发送到 TCP 端口 80 的流量重定向到 MailCleaner 服务器上的 TCP 端口 8090。
选项 3:将发送到 TCP 端口 80 的流量重定向/允许到 MailCleaner 服务器上的实际 TCP 端口 80,这不太安全,不太灵活,并且不推荐。
或者,您可以让证书请求和名称验证在其他地方(例如在您的防火墙中)执行,并创建一个例程将证书文件复制到您的 MailCleaner 盒子。如果您有一个带有 ACME 包的 pfSense 防火墙,例如,您可以尝试将本文中的概念与这篇 操作指南 合并。
安装 Certbot
Certbot 是一款用于请求和管理 Let's Encrypt 证书的开源工具。
要在您的 MailCleaner 服务器上安装 Certbot,请以 root
身份登录(在控制台中或通过 SSH)并运行
$ wget https://dl.eff.org/certbot-auto
$ mv certbot-auto /usr/local/bin/certbot-auto
$ chown root /usr/local/bin/certbot-auto
$ chmod 0755 /usr/local/bin/certbot-auto
测试证书名称验证
如果您使用备用端口,则需要在 MailCleaner 服务器上的本地防火墙中打开它
iptables -A INPUT -p tcp -m tcp --dport 8090 -j ACCEPT
注意:MailCleaner 将本地防火墙规则保存在其数据库中,并在每次服务器加载时设置 iptables
配置。您必须将端口 8090 添加到 MailCleaner 的 MySQL 数据库中的防火墙表中;否则,每次续订过程都会失败。要了解如何执行此操作,请查看文章如何安装 MailCleaner 2020.01中标题为“访问 MailCleaner 的 MySQL 数据库”的部分。
现在,让我们尝试使用 Let's Encrypt 的暂存(测试)服务器颁发我们的证书。请将适当的值替换为您的电子邮件地址和您的 MailCleaner 服务器主机名。
选项 1:如果您使用备用端口 8090,请使用此命令行
$ certbot-auto certonly --standalone --preferred-challenges http \
--http-01-port 8090 --email myemail@domain.com --no-eff-email \
--agree-tos --staging -d myhostname.mydomain.com
如果您有多个名称,只需在末尾添加“-d
”即可
-d mx1.mydomain.com \
-d mx2.mydomain.com \
-d spam.mydomain.com
选项 2:如果您使用本地端口 80,请使用此命令行
$ certbot-auto certonly --standalone --preferred-challenges http \
--email myemail@domain.com --no-eff-email --agree-tos --staging \
-d myhostname.mydomain.com \
--pre-hook "/usr/mailcleaner/etc/init.d/apache stop" \
--post-hook "/usr/mailcleaner/etc/init.d/apache start"
注意:在发出此命令后,您将遇到一个引导程序例程,用于识别丢失的依赖项,主要是 Python 包。让它安装必要的软件。
如果一切顺利,您应该会看到如下结果
root#mailcleaner:~#
root@mailcleaner:~# certbot-auto certonly \
--standalone --preferred-challenges http \
--http-01-port 8090 --email victor@domain.com \
--no-eff-email --agree-tos --staging \
-d mail.example.com
Saving debug log to /var/log/letsencrypt/
Plugins selected: Authenticator standalone
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mail.example.com
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
Your certificate and chain have been saved at:
/etc/letsencrypt/live/mail.example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/ live/mail.example.com/privkey.pem
[...]
root@mailcleaner:~#
如果进展不顺利,请记住此过程中的大多数错误都是由 Let's Encrypt 服务器无法访问您的服务器引起的。检查您的防火墙配置是否真的正常。
请求您的证书
当证书颁发过程在暂存服务器上正常工作时,继续并请求您的生产证书(删除暂存参数)
certbot-auto certonly --standalone --preferred-challenges http --http-01-port 8090 --email myemail@domain.com --no-eff-email --agree-tos --force-renewal -d myhostname.mydomain.com
注意:如果您不使用备用端口 8090,请调整命令行。如果是这种情况,请不要忘记 pre-hook 和 post-hook。
结果屏幕非常相似。您现在将在以下路径中获得有效的证书
/etc/letsencrypt/live/my__hostname_.yourdomain.com_/
root#mailcleaner:~# ls /etc/letsencrypt/live/mail.example.com
cert.pem chain.pem fullchain.pem privkey.pem README
root@mailcleaner:~#
自动化证书分配和续订
这个难题的最后一块是由 “GRahamJB” 在这个 MailCleaner 论坛主题中提供的精彩脚本。您可以从此处下载脚本。
让我们将此脚本保存在我们的服务器中。创建以下文件
$ nano /usr/local/bin/set-certificates.pl
然后粘贴脚本的内容并保存 (Ctrl + X
)。并授予脚本运行权限
$ chmod +x /usr/local/bin/set-certificates.pl
现在运行脚本以将您的证书分配给 Web 界面和 MTA 服务
root@mailcleaner:~# set-certificates.pl --set_web \
--set_mta_in --set_mta_out \
--key /etc/letsencrypt/live/mail.example.com/privkey.pem \
--data /etc/letsencrypt/live/mail.example.com/cert.pem \
--chain /etc/letsencrypt/live/mail.example.com/chain.pem
Stopping Apache: stopped.
Starting Apache: started.
Stopping Exim stage 1: stopped.
Starting Exim stage 1: started.
Stopping Exim stage 4: stopped.
Starting Exim stage 4: started.
root@mailcleaner:~#
既然我们知道它有效,请安排这些命令每周运行一次,使用 cron 和 Certbot 的内置续订例程
$ nano /etc/letsencrypt/renewal/yourhostname.yourdomain.com.conf
检查选项是否正确,并在末尾添加以下行(您刚刚运行的相同的 set-certificates.pl,前面加上 renew_hook =
)
.
.
# Options used in the renewal process
[renewalparams]
authenticator = standalone
account = 9d670ed7c63c6238f90f042f852fc33e
pref_challs = http-01,
http01_port = 8090
server = https://acme-v02.api.letsencrypt.org/directory
# Set MailCleaner certs
renew_hook = set-certificates.pl --set_web --set_mta_in --set_mta_out --key /etc/letsencrypt/live/myhostname.mydomain.com/privkey.pem --data /etc/letsencrypt/live/myhostname.mydomain.com/cert.pem --chain /etc/letsencrypt/live/myhostname.mydomain.com/chain.pem
请注意,“renew_hook = set-cert…
”命令必须是一行。保存文件并运行以下命令进行测试
$ certbot-auto renew --force-renewal
如果续订成功,您将看到类似于下面的结果。请注意我们的 renew_hook
命令是如何被调用的。证书已在 MailCleaner 中更新,并且必要的服务已重启。
root@mailcleaner:~# certbot-auto renew --force-reneval
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Processing /etc/ letsencrypt/renewal/mail.example.com.conf
Plugins selected: Authenticator standalone, Installer None
Renewing an existing certificate
Running deploy-hook command: set-certificates.pl \
--set_web --set_mta_in --set_mta_out \
--key /etc/letsencrypt/live/mail.example.com/privkey.pem \
--data /etc/letsencrypt/live/mail.example.com/cert.pem \
--chain /etc/letsencrypt/live/mail.example.com/chain.pem
Output from deploy-hook conmtwand set-certificates.pl:
Stopping Apache: stopped.
Starting Apache: started.
Stopping Exim stage 1: stopped.
Starting Exim stage 1: started.
Stopping Exim stage 4: stopped.
Starting Exim stage 4: started.
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/mail.example.com/fullchain.pem
Congratulations, all renewals succeeded.
The following certs have been renewed:
/etc/letsencrypt/live/mail.example.com/fullchain.pem (success)
root@mailcleaner:~#
现在,让我们将该续订命令添加到 cron
$ crontab -e
添加以下行并保存文件。这将使 Certbot 每周日凌晨 2:00 运行
0 2 * * 7 /usr/local/bin/certbot-auto renew
如果 crontab 没有以您期望的方式打开,请运行 select-editor
以选择您喜欢的编辑器(例如 nano)。如果您想查看结果,请运行 crontab -l
。
默认情况下,Certbot 仅在证书的剩余有效期少于 30 天时才会续订证书。如果证书未到期,Certbot 将不会续订它(当然也不会调用 hooks)。
测试结果
如果您访问 MailCleaner 的 Web 界面,您将看到 SSL 证书有效。并且如果您在服务器中运行以下命令,您可以看到在 STARTTLS 上呈现的证书是您刚刚设置的新的 Let's Encrypt 证书
$ openssl s_client -connect localhost:25 -starttls smtp
2 条评论