每当我在服务器 (Alma Linux) 上更新 SSL 证书时,我都会重新启动 Postfix。我通常在证书到期前几天或一周重新启动。但是邮件连接总是在旧证书到期当天失败,此时我必须再次重新启动 Postfix。
每次都会发生这种情况,我至少这样做了 5 次。每次只需重新启动 Postfix 即可解决问题。Postfix 中对证书的引用是 Let's encrypt 文件夹,在更新证书时不会对 Postfix 配置进行任何其他操作。以下是 main.cf 中的配置:
#SSL
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.net/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.net/privkey.pem
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
那么,我如何才能让 Postfix 在安装时采用新证书呢?否则,我必须等到电子邮件关闭后再重新启动,从而导致客户端停机。
答案1
Certbot在更新 Let's Encrypt 证书/etc/letsencrypt/live/
时始终将符号链接更新到最新文件中/etc/letsencrypt/archive/
,因此如果在更新后重新加载或重新启动 Postfix,则不会发生这种情况。
但是,重新加载也应该是自动化的。这通常使用 Certbot 的钩子,但您的情况可能需要采用替代方法,此时 SystemD 可能会变得方便。
Certbot 的部署钩子
当 Certbot 检测到证书需要续订时,
--pre-hook
钩子--post-hook
会在每次尝试续订之前和之后运行。如果您希望钩子仅在成功续订后运行,请使用--deploy-hook
如下命令。certbot renew --deploy-hook /path/to/deploy-hook-script
您可以在中放置一个重新加载脚本/etc/letsencrypt/renewal-hooks/deploy/
,因为问题中的路径表明该目录结构正在使用中。
#!/bin/sh
systemctl reload postfix
SystemD 路径单元
如果您不信任 Certbot 在证书更新且可用时运行此程序,则可以使用 SystemD路径单位监视/etc/letsencrypt/live/mail.example.com/fullchain.pem
Postfix,并在其发生变化时重新加载。
/etc/systemd/system/mail-certificate-watcher.service
:[Unit] Description=Reload Postfix on mail.example.com certificate changes After=network.target [Service] Type=oneshot ExecStart=/usr/bin/systemctl reload postfix.service [Install] WantedBy=multi-user.target
/etc/systemd/system/mail-certificate-watcher.path
:[Path] PathModified=/etc/letsencrypt/live/mail.example.com/fullchain.pem [Install] WantedBy=multi-user.target
记得启用并启动它:
systemctl enable mail-certificate-watcher.path systemctl start mail-certificate-watcher.path