阿里云和腾讯云的免费ssl证书只有3个月的有效期了,所以为了避免麻烦,这里介绍下用linux脚本的形式实现ssl证书的自动续期。
在 CentOS 7 上查看定时任务可以使用以下命令:
查看当前用户的定时任务:
crontab -l
查看所有用户的定时任务(需要 root 权限):
sudo cat /var/spool/cron/*
查看系统级别的定时任务:
sudo cat /etc/crontab
查看
/etc/cron.d/
目录下的定时任务:sudo ls /etc/cron.d/
如果需要查看具体的任务内容,可以使用
cat
命令,例如:sudo cat /etc/cron.d/your-cron-file
通过这些命令,你可以查看 CentOS 7 系统中配置的各种定时任务。
要找到之前安装的用于自动更新 SSL 证书的服务,可以尝试以下方法:
检查
certbot
或letsencrypt
:
常用的自动更新 SSL 证书工具是certbot
(之前叫letsencrypt
)。你可以尝试以下命令,看看是否已经安装:certbot --version
或
letsencrypt --version
如果返回了版本号,说明系统上安装了
certbot
。查看
cron
任务和systemd
服务:
自动更新证书通常会配置定时任务,可能通过cron
或systemd
服务进行。可以检查定时任务和服务:查看
cron
任务:crontab -l sudo cat /etc/crontab sudo ls /etc/cron.d/
看看是否有与
certbot
、letsencrypt
或其他 SSL 证书更新相关的任务。查看
systemd
服务:systemctl list-timers
检查是否有与 SSL 证书自动更新相关的定时器(比如
certbot.timer
)。
查看已安装的软件包:
检查系统中是否安装了相关的软件包,比如certbot
、acme.sh
等:rpm -qa | grep -i certbot rpm -qa | grep -i acme
这将列出与 SSL 证书更新相关的软件包。
查看安装日志:
可以查看系统日志,找找是否有安装记录:grep certbot /var/log/yum.log
或者其他与 SSL 更新相关的关键字。
如果找到了相关的服务,比如 certbot
,你可以手动运行命令更新证书:
sudo certbot renew
然后重新加载或重启 Nginx:
sudo systemctl reload nginx
或者
sudo systemctl restart nginx
我的系统安装的是:
[root@VM_0_7_centos ~]# certbot --version
certbot 1.11.0
[root@VM_0_7_centos ~]#
[root@VM_0_7_centos ~]# letsencrypt --version
certbot 1.11.0
既然 certbot
已经安装在系统上并且可以正常运行,那么可以使用它来更新 SSL 证书。以下是更新证书的步骤:
手动更新证书: 使用以下命令来尝试手动更新所有到期的证书:
sudo certbot renew
这会自动更新所有快要到期的证书。
重启或重新加载 Nginx: 更新证书后,需要重新加载或重启 Nginx 来应用新的证书:
sudo systemctl reload nginx
或者
sudo systemctl restart nginx
检查自动更新配置: Certbot 通常会自动设置一个定时任务来定期检查并更新证书。如果你想确认这个定时任务是否存在并正常运行,可以检查
/etc/cron.d/
或systemd
中的certbot
定时器:- 查看
cron
任务:sudo cat /etc/cron.d/certbot
- 查看
systemd
定时器:
如果有systemctl list-timers | grep certbot
certbot.timer
,说明它会自动运行。
- 查看
手动添加自动更新任务(如果不存在): 如果没有找到自动更新任务,可以手动添加一个
cron
任务:sudo crontab -e
添加以下行来每天凌晨检查证书更新:
0 0 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
这会每天凌晨运行
certbot renew
并在需要时重新加载 Nginx。
现在,你可以手动更新证书并确保自动更新任务正常工作,以避免证书再次过期。
你说得对,证书的有效期是三个月,所以不需要每天运行更新任务。通常,certbot
会在证书还有 30 天过期时自动更新。因此,每隔两个月或每月检查一次即可。下面是设置合理的自动更新频率的方法:
设置自动更新任务
每两个月运行一次: 可以使用
cron
配置每两个月运行一次certbot renew
。编辑cron
配置:sudo crontab -e
添加以下行,让它在每两个月的第一天凌晨运行:
0 0 1 */2 * /usr/bin/certbot renew --quiet && systemctl reload nginx
每月运行一次: 如果希望更稳妥一些,可以设置每月运行一次:
sudo crontab -e
添加以下行,让它在每月的第一天凌晨运行:
0 0 1 * * /usr/bin/certbot renew --quiet && systemctl reload nginx
certbot renew
只会在证书即将过期时才更新,因此即使频率较高,也不会影响性能。
验证自动更新任务
之后,你可以使用以下命令来模拟 cron
运行,确保自动更新任务能正确执行:
sudo certbot renew --dry-run
这个命令会模拟更新过程而不会真正更改证书,可以用来验证配置是否正确。
可以使用容器的名称来代替容器 ID,这样即使容器 ID 发生变化,你仍然可以通过容器名称来重启它。根据你的输出,容器的名称是 my_nginx
,你可以在脚本中使用这个名称来重启容器。
修改 renew_certificates.sh
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58789624322e docker.io/nginx:latest "/docker-entrypoin..." 2 months ago Up 3 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp my_nginx
将脚本中的容器 ID 替换为容器名称 my_nginx
:
#!/bin/bash
sudo certbot renew
# 重启 Nginx 容器
docker restart my_nginx
/home/server/nginxnew/services/conf/reload_nginx_docker.sh
这样,即使容器 ID 发生变化,只要容器名称不变,脚本就可以正常工作。
测试修改后的脚本
你可以运行以下命令来测试修改后的脚本,确保它能够正确执行:
sudo /home/server/nginxnew/services/conf/renew_certificates.sh
这会检查证书是否需要续订并重启名为 my_nginx
的容器。
Comments