Ubuntu服务器Let's Encrypt证书续期后自动复制至指定目录的最优方案
解决Let's Encrypt证书续期后自动同步证书的方案
方法一:使用Certbot的deploy钩子(推荐)
Certbot本身支持钩子脚本,证书成功续期部署后会自动触发指定脚本,比定时轮询更精准,避免误操作。
- 创建同步脚本,比如
/usr/local/bin/sync-le-cert.sh:
#!/bin/bash # 源证书目录(Let's Encrypt默认路径) SOURCE_DIR="/etc/letsencrypt/live/你的域名" # 目标目录(opt下应用所需的证书路径) TARGET_DIR="/opt/你的应用/certs" # 确保目标目录存在 mkdir -p "$TARGET_DIR" # 复制证书文件(根据应用需求调整,比如fullchain.pem、privkey.pem) cp -f "$SOURCE_DIR/fullchain.pem" "$TARGET_DIR/" cp -f "$SOURCE_DIR/privkey.pem" "$TARGET_DIR/" # 可选:重启应用加载新证书(替换为你的服务名) # systemctl restart 你的应用服务名
- 给脚本添加执行权限:
chmod +x /usr/local/bin/sync-le-cert.sh
- 配置Certbot永久生效:
编辑/etc/letsencrypt/cli.ini,添加以下内容:
deploy-hook = /usr/local/bin/sync-le-cert.sh
或者手动续期时临时指定:
certbot renew --deploy-hook "/usr/local/bin/sync-le-cert.sh"
方法二:用inotifywait监听目录变化
如果必须通过检测目录更新触发同步,可以使用inotify-tools工具监听证书目录的修改事件。
- 安装inotify-tools:
# Debian/Ubuntu系统 apt install inotify-tools -y # RHEL/CentOS系统 yum install inotify-tools -y
- 创建监听脚本
/usr/local/bin/watch-le-cert.sh:
#!/bin/bash SOURCE_DIR="/etc/letsencrypt/live/你的域名" TARGET_DIR="/opt/你的应用/certs" mkdir -p "$TARGET_DIR" # 监听目录的创建、修改事件 inotifywait -m -e create -e modify "$SOURCE_DIR" | while read -r directory events filename; do # 仅处理.pem格式的证书文件 if [[ "$filename" =~ \.pem$ ]]; then cp -f "$SOURCE_DIR/$filename" "$TARGET_DIR/" # 可选:重启应用 # systemctl restart 你的应用服务名 fi done
- 添加执行权限:
chmod +x /usr/local/bin/watch-le-cert.sh
- 设置为后台服务(用systemd):
创建/etc/systemd/system/le-cert-watcher.service文件:
[Unit] Description=Watch Let's Encrypt certs and sync to app directory After=network.target [Service] ExecStart=/usr/local/bin/watch-le-cert.sh Restart=always User=root [Install] WantedBy=multi-user.target
- 启动并设置开机自启:
systemctl daemon-reload systemctl start le-cert-watcher.service systemctl enable le-cert-watcher.service
注意事项
- 替换脚本中的
你的域名和你的应用为实际值; - 确认应用所需的证书文件名,部分应用可能需要重命名证书(比如将
privkey.pem改为server.key); - 若应用需重启才能加载新证书,务必在脚本中添加重启命令,否则仍会因旧证书导致崩溃;
- 优先使用Certbot钩子方案,仅在续期成功时触发,无多余无效操作。
内容的提问来源于stack exchange,提问作者DevOps_N_Training
相关产品推荐
相关产品推荐

