自动续签ssl证书
这篇笔记记录了用 acme.sh 为域名自动申请和续签 Let’s Encrypt SSL 证书的完整配置过程,重点场景是通过 DNS-01 验证签发 jacin.me 及其通配符证书,适合需要为泛域名部署 HTTPS 的站点维护者或运维人员。操作从安装 acme.sh、加载环境变量开始,随后切换默认 CA 到 Let’s Encrypt、注册账号,并以 Cloudflare 为例说明如何创建具备 Edit zone DNS 权限的 API Token,提醒 Token 只显示一次需要提前保存。配置部分使用 CF_Token 与 CF_Account_ID 作为 dns_cf 插件的凭证,执行 acme.sh --issue -d jacin.me -d '*.jacin.me' --dns dns_cf 后会在 ~/.acme.sh/jacin.me_ecc/ 下生成证书、私钥、中间证书和 fullchain.cer。文章还说明了如何通过 crontab 检查 acme.sh 自动续签任务,把 Cloudflare 凭证写入 account.conf 以便后续续签复用,并用 acme.sh --list 查看证书创建时间和 Renew 时间。续签机制上,acme.sh 会在到期续签时把新证书覆盖到原路径,因此 Nginx 只要引用 fullchain.cer 和对应 key,并在续签后执行 nginx -s reload 或 systemctl reload nginx,就能让新 TLS 握手平滑切换到新证书而不影响已有连接。
目录#
[[toc]]
acme 安装#
curl https://get.acme.sh | sh
# 加载环境变量
source ~/.bashrc
获取 DNS API 凭证#
因为是 DNS-01 验证,你需要在 DNS 托管商(Cloudflare / 阿里云 / 腾讯云 等)申请 API Key。
以 Cloudflare 为例:
- 登录 Cloudflare → 右上角头像 → My Profile → API Tokens
- 新建一个 Edit zone DNS 权限的 Token

添加

⚠️ 只会显示一次,记得保存。
配置 acme.sh 环境变量#
acme.sh --set-default-ca --server letsencrypt
acme.sh --register-account -m your@email.com
# 永久保存 Cloudflare Token
export CF_Token="你的API Token"
export CF_Account_ID="你的Cloudflare账号ID"
acme.sh --issue -d jacin.me -d '*.jacin.me' --dns dns_cf
执行完这个脚本就是可以了。
cloudflare id 可以点击自己的域名 ,在 网页上的 url那一长串的就是 id。

执行完成以后 证书 路径信息:
证书文件: /root/.acme.sh/jacin.me_ecc/jacin.me.cer
私钥文件: /root/.acme.sh/jacin.me_ecc/jacin.me.key
中间证书: /root/.acme.sh/jacin.me_ecc/ca.cer
完整链证书(就是默认的公钥证书): /root/.acme.sh/jacin.me_ecc/fullchain.cer
查看定时任务:
crontab -l | grep acme
34 1 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
编辑:
vim ~/.acme.sh/account.conf
>>>>>>
CF_Token='你的API Token'
CF_Account_ID='你的Cloudflare账号ID'
cat ~/.acme.sh/account.conf | grep CF_
下次 acme.sh 自动续签时就会用这两个值,不需要手动 export。 查看续签时间:
root@test-dc2:~# acme.sh --list
Main_Domain KeyLength SAN_Domains CA Created Renew
jacin.me "ec-256" *.jacin.me LetsEncrypt.org 2025-08-15T14:37:28Z 2025-10-13T14:37:28Z
root@test-dc2:~#
-
当 acme.sh 在“Renew”日或之后跑续签,它会生成一份新的证书和私钥,放到相同的路径(比如 ~/.acme.sh/jacin.me_ecc/fullchain.cer 和 .key)覆盖旧文件。
-
平滑过渡
只要你在续签后执行一次 nginx -s reload(或 systemctl reload nginx),Nginx 会无缝加载新的证书用于 新 的 TLS 握手,而老 的连接依然用旧证书保持不变,直到它们自然关闭。
-
不影响服务
- 对终端用户而言,整个过程是透明的,新旧证书之间切换几乎无感知。
- 只要你保证重载了 Nginx,就一直在使用最新的、绝对不会过期的证书链。
nginx需要的证书#
server {
listen 443 ssl;
server_name jacin.me *.jacin.me;
ssl_certificate /root/.acme.sh/jacin.me_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/jacin.me_ecc/jacin.me.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
}
执行:
sudo nginx -s reload
评论
还没有评论,来发第一个吧