使用带有开源证书颁发机构的 SSL 消除垃圾邮件

将 Let's Encrypt 证书与 MailCleaner 结合使用,以实现 STARTTLS 和 SSL。 这是方法。
75 位读者喜欢这个。
Chat via email

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 外部 FQDN,并且路径以 /.well-known/acme-challenge/ 开头)重定向到 MailCleaner 服务器上的 TCP 端口 8090。

选项 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

 

接下来阅读什么
Here's a photo of Victor Lopes
系统管理员。 MCSA、Security+。 开源爱好者。 开发爱好者。 加拿大 UBC 的 NSSP 项目。

2 条评论

不错的产品,但基于 Debian 8

当前的虚拟设备(可供分发的 VM)是 Debian 8,但软件包都是最新的,并且代码库正在积极开发中。 该代码可能已经与 Debian 9 或 10 兼容,并且现在 Debian 8 已达到生命周期结束,我相信他们将很快发布这些 VM 的新版本。

回复 ,作者 bart

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.