示例中的域名、地址和接口名需要按自己的部署替换。
泛域名证书需要验证域名控制权。本文使用 acme.sh 的 Cloudflare DNS 插件申请 example.com 和 *.example.com 的证书,再通过 --install-cert 部署到 Nginx;DNS-01 不要求服务器对外开放 80 端口。泛域名只覆盖一层子域名,不自动覆盖根域名,所以两个名称都要申请。Let's Encrypt DNS-01 说明
安装与 DNS 凭据
以下在负责续期与部署的同一个账号下执行,示例是 root。可以从 acme.sh 官方仓库 下载并检查安装脚本,也可以按官方安装入口执行:
curl https://get.acme.sh | sh -s [email protected]
/root/.acme.sh/acme.sh --version
在 Cloudflare 创建只允许目标 Zone 的 API Token,赋予 Zone > DNS > Edit 权限,确认 Token 有效且客户端 IP 限制允许续期服务器。单一 Zone 显式提供 CF_Zone_ID,不要使用账号全局 API Key。
read -r -s -p 'Cloudflare API Token: ' CF_Token
printf '\n'
export CF_Token
export CF_Zone_ID='填写目标 Zone ID'
交互输入避免把 Token 写进 shell 历史,但插件会把用于续期的凭据保存到 ~/.acme.sh/account.conf。这仍是敏感文件:限制目录与文件权限,不放入 Git,不上传诊断日志;Token 撤销或到期后也要更新续期凭据。dns_cf 官方说明
签发证书
显式选择 CA 和密钥类型,避免 acme.sh 默认值变化造成 RSA/ECC 路径混淆。下面以 Let's Encrypt 和 ECDSA P-256 为例,替换所有 example.com。星号名称必须加引号,避免 shell 展开为本地文件名。
/root/.acme.sh/acme.sh --set-default-ca --server letsencrypt
/root/.acme.sh/acme.sh --issue --server letsencrypt --dns dns_cf \
-d example.com -d '*.example.com' --keylength ec-256
unset CF_Token
需要 RSA 时改用 --keylength 2048,并在后续安装、续期等命令中去掉 --ecc。不要把“ECC 一定比 RSA 更安全”作为选择依据;合适的密钥强度、客户端兼容性与证书链才是具体判断条件。其他 CA 的注册、EAB 与签发额度以其当前官方文档为准,旧版 CA 对比表和地区可用性结论不再适用。
部署与自动重载
acme.sh 内部目录是工作区,Nginx 不应直接引用其中的证书。使用 --install-cert 复制到固定路径,并保存重载命令,使以后续期能把新证书交给正在运行的服务。
install -d -m 700 /etc/nginx/ssl/example.com
/root/.acme.sh/acme.sh --install-cert -d example.com --ecc \
--key-file /etc/nginx/ssl/example.com/private.key \
--fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
--reloadcmd '/usr/sbin/nginx -t && systemctl reload nginx'
chmod 600 /etc/nginx/ssl/example.com/private.key
这段重载命令针对使用 /usr/sbin/nginx 与 nginx.service 的系统。宝塔等环境应换成实际二进制、配置文件与服务控制命令;我的家庭基础设施中面板 Nginx 位于 /www/server/nginx/sbin/nginx,测试系统另一个 Nginx 的配置并不能验证它。
Nginx 的 HTTPS server 中对应设置:
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/private.key;
在安装前确认 Nginx 当前配置可通过检查;初次搭建可先完成证书复制,再把 HTTPS 配置中的路径切到上述文件,执行 nginx -t 和重载。若改为部署给 Xray,则重载命令应检查并重载或重启实际 Xray 服务,不能只重载 Nginx。acme.sh 部署说明
续期检查
安装程序通常会配置周期任务。先用负责安装的账号检查现有任务,避免重复添加;容器或没有 cron 的系统还需要配置自己的调度机制。
crontab -l
/root/.acme.sh/acme.sh --list
/root/.acme.sh/acme.sh --cron --home /root/.acme.sh
openssl x509 -in /etc/nginx/ssl/example.com/fullchain.pem -noout -dates -subject
续期是否发生由客户端与 CA 的当前策略决定,不应把某个固定天数当作永久约定。检查 DNS 凭据、续期日志、固定路径文件时间和服务重载结果;最后从外部访问真实域名,确认正在提供的新证书。示例域名必须替换为自己控制的真实域名才能完成验证。
撤销、停止管理与手动续期
下面操作含义不同:--revoke 请求 CA 撤销证书;--remove 停止 acme.sh 管理该证书,不等于撤销,也不自动删除已经部署的文件。强制续期会消耗签发额度,通常不需要日常执行。
按目的选择以下一个操作,不要依次执行三个示例。
撤销当前证书:
/root/.acme.sh/acme.sh --revoke -d example.com --ecc
停止自动管理:
/root/.acme.sh/acme.sh --remove -d example.com --ecc
在仍由 acme.sh 管理时强制续期:
/root/.acme.sh/acme.sh --renew -d example.com --ecc --force
需要停止使用时,还要修改消费证书的服务配置,并在确认没有引用后清理部署文件。
评论区