06月20, 2024

免费ssl证书自动续期

阿里云和腾讯云的免费ssl证书只有3个月的有效期了,所以为了避免麻烦,这里介绍下用linux脚本的形式实现ssl证书的自动续期。

在 CentOS 7 上查看定时任务可以使用以下命令:

  1. 查看当前用户的定时任务:

    crontab -l
  2. 查看所有用户的定时任务(需要 root 权限):

    sudo cat /var/spool/cron/*
  3. 查看系统级别的定时任务:

    sudo cat /etc/crontab
  4. 查看 /etc/cron.d/ 目录下的定时任务:

    sudo ls /etc/cron.d/

    如果需要查看具体的任务内容,可以使用 cat 命令,例如:

    sudo cat /etc/cron.d/your-cron-file

通过这些命令,你可以查看 CentOS 7 系统中配置的各种定时任务。

要找到之前安装的用于自动更新 SSL 证书的服务,可以尝试以下方法:

  1. 检查 certbotletsencrypt
    常用的自动更新 SSL 证书工具是 certbot(之前叫 letsencrypt)。你可以尝试以下命令,看看是否已经安装:

    certbot --version

    letsencrypt --version

    如果返回了版本号,说明系统上安装了 certbot

  2. 查看 cron 任务和 systemd 服务:
    自动更新证书通常会配置定时任务,可能通过 cronsystemd 服务进行。可以检查定时任务和服务:

    • 查看 cron 任务:

      crontab -l
      sudo cat /etc/crontab
      sudo ls /etc/cron.d/

      看看是否有与 certbotletsencrypt 或其他 SSL 证书更新相关的任务。

    • 查看 systemd 服务:

      systemctl list-timers

      检查是否有与 SSL 证书自动更新相关的定时器(比如 certbot.timer)。

  3. 查看已安装的软件包:
    检查系统中是否安装了相关的软件包,比如 certbotacme.sh 等:

    rpm -qa | grep -i certbot
    rpm -qa | grep -i acme

    这将列出与 SSL 证书更新相关的软件包。

  4. 查看安装日志:
    可以查看系统日志,找找是否有安装记录:

    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 证书。以下是更新证书的步骤:

  1. 手动更新证书: 使用以下命令来尝试手动更新所有到期的证书:

    sudo certbot renew

    这会自动更新所有快要到期的证书。

  2. 重启或重新加载 Nginx: 更新证书后,需要重新加载或重启 Nginx 来应用新的证书:

    sudo systemctl reload nginx

    或者

    sudo systemctl restart nginx
  3. 检查自动更新配置: Certbot 通常会自动设置一个定时任务来定期检查并更新证书。如果你想确认这个定时任务是否存在并正常运行,可以检查 /etc/cron.d/systemd 中的 certbot 定时器:

    • 查看 cron 任务:
      sudo cat /etc/cron.d/certbot
    • 查看 systemd 定时器:
      systemctl list-timers | grep certbot
      如果有 certbot.timer,说明它会自动运行。
  4. 手动添加自动更新任务(如果不存在): 如果没有找到自动更新任务,可以手动添加一个 cron 任务:

    sudo crontab -e

    添加以下行来每天凌晨检查证书更新:

    0 0 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx

    这会每天凌晨运行 certbot renew 并在需要时重新加载 Nginx。

现在,你可以手动更新证书并确保自动更新任务正常工作,以避免证书再次过期。

你说得对,证书的有效期是三个月,所以不需要每天运行更新任务。通常,certbot 会在证书还有 30 天过期时自动更新。因此,每隔两个月或每月检查一次即可。下面是设置合理的自动更新频率的方法:

设置自动更新任务

  1. 每两个月运行一次: 可以使用 cron 配置每两个月运行一次 certbot renew。编辑 cron 配置:

    sudo crontab -e

    添加以下行,让它在每两个月的第一天凌晨运行:

    0 0 1 */2 * /usr/bin/certbot renew --quiet && systemctl reload nginx
  2. 每月运行一次: 如果希望更稳妥一些,可以设置每月运行一次:

    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 的容器。

本文链接:https://www.daguanren.cc/post/mian-fei-ssl-zheng-shu-zi-dong-xu-qi.html

-- EOF --

Comments