acme.sh证书自动续签
原创2022年11月14日大约 3 分钟
1.场景
我有一个pve虚拟机系统,需要部署ssl证书,同时我还有其他的云服务器以及内网服务器都需要证书,这些证书的根域名都是chensina.cn,而使用acme.sh申请的证书一般都是免费90天,到期就需要重新生成。重新生成后又要复制到其他远程服务器,然后重启对应的服务, 比较麻烦,所以这里写一个脚本自动完成。
2. 实现流程
- 在pve机器上写个定时脚本定时执行证书申请(配置定时任务一周一次即可)
- 安装证书到pve机器本地(需要重启pveproxy服务)
- scp复制到其他远程服务器上
- 远程服务器上的服务重启(使用脚本监听证书,自动执行重启)
3. acme.sh安装使用
略
4.脚本
4.1pve上的脚本
1.脚本
#!/bin/bash
# 定义证书路径,chensino是我的pve节点名字,请换成自己的
LOCAL_FILE_KEY="/etc/pve/nodes/chensino/pveproxy-ssl.key"
LOCAL_FILE_PEM="/etc/pve/nodes/chensino/pveproxy-ssl.pem"
ACME_SH_PATH="/root/.acme.sh/acme.sh"
# 测试命令(测试脚本时使用这个,letsencrypt提供的测试环境,添加--staging即可,否则频繁请求他的正式环境接口很容易就被限制了,被限制后就无法请求,要等一天)
#RESULT=$($ACME_SH_PATH --issue --dns dns_ali -d "*.chensina.cn" -d chensina.cn --force --server letsencrypt --staging)
# 更新证书,使用-d chensina.cn 指定根域名,-d "*.chensina.cn"指定泛域名证书,泛域名证书是不能用于根域名的,根域名必须单独申请
RESULT=$($ACME_SH_PATH --issue --dns dns_ali -d "*.chensina.cn" -d chensina.cn --force --server)
echo "结果:$RESULT"
if [ $? -ne 0 ]; then
echo "证书更新失败,脚本退出。"
exit 1
fi
#删除本地的证书,
rm $LOCAL_FILE_KEY
rm $LOCAL_FILE_PEM
#等待证书生成
sleep 30
# 重新安装新证书到PVE
$ACME_SH_PATH --install-cert -d *.chensina.cn \
--key-file $LOCAL_FILE_KEY \
--fullchain-file $LOCAL_FILE_PEM \
--reloadcmd "systemctl restart pveproxy"
# 使用 scp 将文件传输到远程云服务,同时把证书文件改名为ssl.key和ssl.pem(和你的nginx配置的名字一致即可)
# 192.168.1.105 nginx
scp -P 2222 $LOCAL_FILE_KEY root@192.168.1.105:/home/root/DockerServices/nginx/ssl/ssl.key
scp -P 2222 $LOCAL_FILE_PEM root@192.168.1.105:/home/root/DockerServices/nginx/ssl/ssl.pem
# 192.168.1.105 minio(docker服务部署的minio不用重启,证书复制过去就立马生效)
scp -P 2222 $LOCAL_FILE_KEY root@192.168.1.105:/home/root/DockerServices/minio/minio/config/certs/private.key
scp -P 2222 $LOCAL_FILE_PEM root@192.168.1.105:/home/root/DockerServices/minio/minio/config/certs/public.crt
- 配置定时执行
crontab -e
##输入内容定时每天凌晨一点执行更新
0 1 * * * bash 你脚本路径
4.2远程服务器192.168.1.105
- 安装监听软件
#.安装inotify-tools监听证书文件变化
#debian系使用
apt install inotify-tools
# redhat系使用
#yum install inotify-tools
- 监听脚本,监听证书变化后重启服务,
我的脚本名字watch_ssl.sh
#!/bin/bash
# 要监控的证书文件路径
CERT_PATH="/etc/nginx/ssl/ssl.pem"
KEY_PATH="/etc/nginx/ssl/ssl.key"
# 监控证书文件的修改事件
inotifywait -m -e close_write "$CERT_PATH" "$KEY_PATH" | while read -r filename event; do
echo "Detected change in $filename. Reloading NGINX..."
# 重新加载 NGINX
nginx -s reload
done
- 启动监听脚本
nohup bash watch_ssl.sh&
- 把监听脚本注册为系统服务(可选)
vim /etc/systemd/system/watch_ssl.service
[Unit]
Description=Watch SSL Certificate Changes and Reload NGINX
After=network.target
[Service]
ExecStart=/root/watch_ssl.sh
Restart=always
[Install]
WantedBy=multi-user.target
#启动服务:
systemctl start watch_ssl.service
#停止服务:
systemctl stop watch_ssl.service
#开机自启动
systemctl enable watch_ssl.service
#取消开机自启动
systemctl disable watch_ssl.service