Centos7 +Nginx+ Let's Encrypt 自动续费SSL证书

Centos7 +Nginx+ Let’s Encrypt 自动续费SSL证书

1. 安装 Certbot 的 Nginx 插件

此错误表明缺少 Certbot 的 Nginx 插件。在 CentOS 7 中,需通过 EPEL 仓库安装 python2-certbot-nginx 包:

# 确保 EPEL 仓库已启用
sudo yum install epel-release
# 安装 Certbot 及 Nginx 插件
sudo yum install certbot python2-certbot-nginx

安装完成后,验证插件是否加载:

certbot plugins

输出中应包含 nginx 插件

image-20250407140557739

2.生成证书

1.自动申请并配置证书

若 Nginx 未安装在默认路径(如 /etc/nginx),需手动指定配置目录。例如,自定义路径为 /opt/nginx/conf

#执行命令,输入邮箱,一直yes 就行。此情况适用于非标准安装环境
certbot --nginx --nginx-server-root=/usr/local/nginx/conf -d lzyou.top -d www.lzyou.top
  • -d 指定域名,支持多个域名或子域名。
  • 按提示输入邮箱(用于证书到期提醒)并同意服务协议。
  • 证书将保存在 /etc/letsencrypt/live/example.com/ 目录下。

image-20250407141529740

2.手动验证(可选)

若自动配置失败,使用 certonly 模式手动生成证书:

sudo certbot certonly --nginx -d example.com -d www.example.com

需手动在 Nginx 配置中添加 SSL 路径:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

特殊情况:conf文件编码异常

image-20250407140909012

解决方案

1. 检查并修复 Nginx 配置文件编码

  • 步骤 1:验证文件编码 使用 file 命令检查 nginx.conf 的编码格式:

    file -i /usr/local/nginx/conf/nginx.conf

    若输出非 charset=utf-8(如 charset=iso-8859-1),需转换编码。

  • 步骤 2:转换编码为 UTF-8 使用 iconv 工具转换文件编码:

    cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak  # 备份
    iconv -f iso-8859-1 -t UTF-8 /usr/local/nginx/conf/nginx.conf -o /usr/local/nginx/conf/nginx.conf
    • 若文件含中文字符且原编码为 GBK,需替换 -f GBK 为实际编码(如 GB2312ISO-8859-1)。
    • 若无 iconv,通过 yum install libiconv 安装。
  • 步骤 3:删除非法字符 手动检查 nginx.conf 中的特殊符号(如中文标点、Emoji),确保所有内容为 英文或 UTF-8 兼容字符

3.定时检查并自动续期

1. 确保Cron服务已安装并运行

  • 安装Cron(若未安装):

    sudo yum install crontabs
    sudo systemctl start crond
    sudo systemctl enable crond
  • 验证Cron状态

    systemctl status crond  # 应显示“active (running)”

2. 创建自动续期任务

  • 编辑Cron定时任务

    crontab -e
  • 添加以下内容(按i进入编辑模式):

    15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx"
    • 含义:每天凌晨3:15执行certbot renew检查证书续期,成功后通过--renew-hook自动重载Nginx服务(避免中断当前连接)。
    • 关键参数:
      • --quiet:抑制非必要输出,减少日志体积。
      • --renew-hook:仅在证书成功续期后触发Nginx重载

3. 验证命令有效性

  • 手动测试续期

    certbot renew --dry-run  # 模拟续期流程,检查配置是否正确
  • 强制续期测试(非必要):

    certbot renew --force-renewal  # 强制更新证书(慎用)

4. 日志监控与错误处理

  • 查看续期日志

    tail -f /var/log/letsencrypt/letsencrypt.log
  • 增强Cron任务日志记录(可选):

    Bash# 在Cron任务中添加日志输出:
    15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx" >> /var/log/letsencrypt/renew.log 2>&1

4. 其他注意事项

  • 防火墙配置: 确保 80 和 443 端口开放:

    sudo firewall-cmd --add-service={http,https} --permanent
    sudo firewall-cmd --reload
  • 证书续期验证: 测试自动续期功能:

    certbot renew --dry-run

  目录