>为什么需要 SSL 证书自动续期
在当今互联网环境中,HTTPS 已经成为网站的标准配置。主流浏览器会将未使用 SSL 证书的网站标记为”不安全”,搜索引擎也优先展示 HTTPS 网站。然而,Let’s Encrypt 等免费 CA 签发的 SSL 证书有效期通常只有 90 天,如果不配置自动续期,证书一旦过期网站将无法正常访问。
对于运行 Debian 系统并使用 Nginx 作为 Web 服务器的用户来说,配置 SSL 证书自动续期是一项必备技能。本文将详细介绍几种主流的自动续期方案。
>前置条件
在开始之前,请确保你的服务器满足以下条件:
- >
- 操作系统:Debian 10(Buster)或更高版本
- Web 服务器:Nginx 已安装并正常运行
- 域名:已将域名 A 记录指向服务器公网 IP
- 权限:root 或 sudo 权限
- 端口:80 和 443 端口已在防火墙中开放
>方案一:Certbot + Cron(推荐新手使用)
Certbot 是 EFF 开发的 Let’s Encrypt 客户端,使用最为广泛,配置简单。
>安装 Certbot
>sudo apt update
sudo apt install certbot python3-certbot-nginx -y
首次获取证书
>sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot 会自动修改 Nginx 配置文件,添加 SSL 相关指令。过程中会提示你是否将 HTTP 流量重定向到 HTTPS,建议选择"是"。
>验证自动续期
Certbot 安装完成后,会自动创建一个 systemd timer 或 cron 任务。可以通过以下命令验证:
>sudo systemctl status certbot.timer
如果显示 active (waiting),说明定时器已启用。Certbot 默认每天检查两次证书状态,在证书到期前 30 天自动续期。
>手动测试续期
>sudo certbot renew --dry-run
--dry-run 参数会模拟续期过程而不实际执行,用于验证配置是否正确。如果输出显示成功,说明自动续期配置无误。
>方案二:acme.sh + Cron(推荐进阶用户)
acme.sh 是一个纯 Shell 脚本实现的 ACME 客户端,体积小巧,支持更多 DNS API,适合需要通过 DNS 验证获取通配符证书的场景。
>安装 acme.sh
>curl https://get.acme.sh | sh -s email=your@email.com
source ~/.bashrc
使用 Nginx 模式获取证书
>~/.acme.sh/acme.sh --issue -d yourdomain.com -d www.yourdomain.com --nginx
安装证书到 Nginx
>~/.acme.sh/acme.sh --install-cert -d yourdomain.com \
--key-file /etc/nginx/ssl/yourdomain.com/key.pem \
--fullchain-file /etc/nginx/ssl/yourdomain.com/cert.pem \
--reloadcmd "systemctl reload nginx"
acme.sh 安装完成后会自动创建 cron 任务,默认每 60 天检查并续期证书,可以通过以下命令查看:
>crontab -l | grep acme.sh
方案三:Certbot + DNS 验证(适用于通配符证书)
如果你的服务器在负载均衡器或 CDN 后面,80 端口不可达,可以使用 DNS 验证方式获取通配符证书。
>以 Cloudflare 为例
首先安装 Cloudflare DNS 插件:
>sudo apt install python3-certbot-dns-cloudflare -y
创建 Cloudflare API 凭证文件:
>sudo mkdir -p /etc/cloudflare
sudo nano /etc/cloudflare/cloudflare.ini
写入以下内容:
>dns_cloudflare_api_token = YOUR_API_TOKEN
设置权限:
>sudo chmod 600 /etc/cloudflare/cloudflare.ini
获取通配符证书:
>sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/cloudflare/cloudflare.ini \
-d yourdomain.com \
-d *.yourdomain.com
Nginx SSL 配置优化
无论使用哪种方案,以下 Nginx SSL 配置优化都能提升安全性和性能:
>server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/html;
index index.html;
}
关键优化点包括:仅启用 TLS 1.2 和 1.3、配置会话缓存、启用 HSTS 头。
>续期后自动重载 Nginx
证书续期后,需要重新加载 Nginx 才能使用新证书。如果是 Certbot,可以在 /etc/letsencrypt/renewal-hooks/deploy/ 目录下创建脚本:
>#!/bin/bash
systemctl reload nginx
保存并赋予执行权限:
>sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
如果是 acme.sh,在 --install-cert 时已经通过 --reloadcmd 参数指定了重载命令。
>监控与告警建议
即使配置了自动续期,也建议设置监控:
证书到期检查:使用 openssl s_client -connect yourdomain.com:443 | openssl x509 -noout -dates 定期检查证书有效期
续期日志监控:关注 /var/log/letsencrypt/letsencrypt.log 是否有异常
到期前提醒:设置脚本在证书到期前 14 天发送邮件或消息提醒
>常见问题排查
续期失败最常见的原因:
1. Nginx 未正确配置:确保 server_name 与证书域名匹配
2. 防火墙阻止 80 端口:HTTP-01 验证需要 80 端口可访问
3. DNS 记录未生效:新域名需要等待 DNS 传播
4. 速率限制:Let's Encrypt 有频率限制,每个域名每周最多 50 张证书
5. 磁盘空间不足:续期需要写入新证书文件
遇到问题时,先运行 certbot renew --dry-run 查看详细错误信息。
>总结
Debian + Nginx 环境下 SSL 证书自动续期并不复杂。对于大多数用户,直接使用 Certbot 即可满足需求,安装后自动配置定时任务。如果需要通配符证书或 DNS 验证,acme.sh 提供了更灵活的选择。无论采用哪种方案,关键是要配置续期后自动重载 Web 服务器,并设置适当的监控告警,确保 HTTPS 服务持续可用。