在 Linux 下使用 acme.sh 为 Nginx 配置免费 SSL 证书并实现自动续期,是一个非常流行且高效的方案。acme.sh 是一个纯 Shell 脚本,轻量且功能强大。
整个流程主要分为 安装、签发、部署 和 验证 四个步骤。
🚀 第一步:安装 acme.sh
安装过程非常简单,一条命令即可完成。acme.sh 会自动将自身安装到你的家目录,并配置好环境变量和默认的定时续期任务。
执行安装命令(请将 my@example.com 替换为你的邮箱,用于接收证书到期通知):
curl https://get.acme.sh | sh -s email=my@example.com
安装完成后,重新加载一下环境变量,让 acme.sh 命令立即生效
source ~/.bashrc
验证安装是否成功
acme.sh –version
📜 第二步:签发 SSL 证书
Webroot 模式 (推荐)
这种方式适用于你的服务器已经运行了 Nginx,并且 80 端口可以被证书颁发机构(CA)访问。acme.sh 会在你的网站目录下生成一个临时验证文件来完成域名所有权校验。
- 命令示例:bash acme.sh –issue -d yourdomain.com -d www.yourdomain.com –webroot /var/www/html
- -d: 指定你的域名,可以指定多个(如主域名和 www 子域名)。
- –webroot: 指定你网站的根目录,acme.sh 会在此目录下创建验证文件夹。
第三步:安装并配置 Nginx
证书签发成功后,文件会保存在 ~/.acme.sh/yourdomain.com/ 目录下。但生产环境不建议直接使用此路径,应通过 –install-cert 命令将证书复制到指定位置,并配置 Nginx 在续期后自动重载。
创建 SSL 证书存放目录(如果不存在)
sudo mkdir -p /etc/nginx/ssl
执行安装命令
sudo acme.sh –install-cert -d yourdomain.com \\
–key-file /etc/nginx/ssl/yourdomain.com.key \\
–fullchain-file /etc/nginx/ssl/yourdomain.com.cer \\
–reloadcmd "systemctl reload nginx"
- –key-file: 指定私钥文件的目标路径。
- –fullchain-file: 指定完整证书链文件的目标路径。
- –reloadcmd: 关键命令,指定证书更新后要执行的命令,这里设置为重载 Nginx,实现无缝续期。
-
在 Nginx 的配置中,.pem 和 .cer(或者 yourdomain.com.cer)在本质上没有任何区别,它们通常都是 PEM 格式的文本文件(即 Base64 编码的文本)。
你可以放心地将命令中的后缀从 .cer 改为 .pem,这不仅可行,而且是更标准、更推荐的做法。
你可以直接将命令修改为如下形式(仅修改了文件后缀):
sudo acme.sh –install-cert -d yourdomain.com \\
–key-file /etc/nginx/ssl/yourdomain.com.key \\
–fullchain-file /etc/nginx/ssl/yourdomain.com.pem \\ # 这里改为了 .pem
–reloadcmd "systemctl reload nginx"
修改 Nginx 配置文件,启用 HTTPS: 编辑你的站点配置文件(如 /etc/nginx/conf.d/yourdomain.com.conf),添加或修改 server 块
# 1. HTTP 服务器配置:强制跳转 HTTPS
server {
listen 80;
server_name chxi.ltd; # 替换为你的域名或IP
# 所有 HTTP 请求 301 重定向到 HTTPS
return 301 https://$host$request_uri;
}
# 2. HTTPS 服务器配置:核心 SSL 设置
server {
listen 443 ssl http2; # 开启 SSL 并启用 HTTP/2 (提升性能)
server_name chxi.ltd; # 替换为你的域名
# — 证书配置 (核心) —
ssl_certificate /etc/nginx/ssl/chxi.ltd.cer; # 证书文件路径
ssl_certificate_key /etc/nginx/ssl/chxi.ltd.key; # 私钥文件路径
# — 安全优化配置 (推荐) —
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# 仅启用安全的 TLS 协议 (禁用 TLS 1.0/1.1)
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件配置
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
# — 网站根目录配置 —
location / {
root /usr/share/nginx/html; # 你的网站文件目录
index index.html index.htm;
}
}
测试并重载 Nginx 配置
sudo nginx -t
sudo systemctl reload nginx
🔁 第四步:验证自动续期
acme.sh 在安装时会自动创建一个 cron 定时任务,检查证书有效期,并在证书到期前(通常是60天)自动续期。通常情况下,acme.sh 在安装时会自动为你配置好定时任务(Cron Job),无需手动干预。
检查定时任务: 你可以使用 crontab -l 命令查看是否已存在 acme.sh 的任务。
手动触发续期测试: 如果你想立即测试续期流程是否顺畅,可以强制续期
sudo acme.sh –renew -d yourdomain.com –force
如果一切正常,Nginx 会自动重载,网站将使用新证书,整个过程无需人工干预。
完成以上所有步骤后,你的 Nginx 服务器就已经配置好了免费的 SSL 证书,并且可以永久自动续期了。
如果你不做任何额外配置,acme.sh 默认的自动续期机制会在证书到期前 30 天触发更新。
以下是关于这一机制的详细解释:
1. 核心机制:30天阈值
虽然 acme.sh 的定时任务(Cron Job)默认是每天运行一次检查,但它不会每天都去申请新证书。
- 检查频率:每天一次(默认在凌晨 0 点)。
- 触发条件:只有当证书的剩余有效期少于 30 天时,它才会真正执行续期操作。
2. 为什么要提前 30 天?
这与 Let's Encrypt 等证书颁发机构(CA)的策略有关:
- 证书有效期:目前 Let's Encrypt 签发的证书有效期通常为 90 天。
- 续期窗口:CA 规定只能在证书生命周期的最后 30 天内进行续期。
- 安全缓冲:acme.sh 设定在“到期前 30 天”更新,是为了确保在第一次续期尝试失败(例如网络波动、DNS 验证超时)时,你还有足够的时间(约一个月)去手动干预或让脚本在第二天再次尝试,从而避免证书真正过期导致网站无法访问。
3. 更新后的状态
一旦续期成功:
- 新证书的有效期将从申请成功的那一刻重新计算 90 天。
- acme.sh 会自动替换旧证书文件,并执行你配置的 –reloadcmd(如 service nginx reload)让新证书立即生效。
- 下次检查时,由于新证书还有 90 天有效期(远大于 30 天阈值),脚本会跳过该域名,继续等待下一个周期。
总结
你不需要手动计算时间。只要安装了 acme.sh 且定时任务正常,它会自动在证书到期前 30 天的某个时间点(取决于每天定时任务的具体执行时间)完成更新,实现“无感”续期。
本文亲自在腾讯云上实验.
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中
yum list 只显示最新版本。要查看所有历史版本,必须加上 –showduplicates 参数。
1yum list nginx –showduplicates
nginx 默认显示的版本只有1.14.
可以根据下面配置进行更新
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true




