Certbot 的部署钩子

Certbot 的部署钩子

每当我在服务器 (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.pemPostfix,并在其发生变化时重新加载。

  • /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
    

相关内容