使用 acme.sh + Cloudflare 申请 Let’s Encrypt SSL 证书
在生产环境中,部署 HTTPS 证书是必不可少的。本文介绍如何通过 acme.sh 客户端,结合 Cloudflare DNS API,自动申请并续期 Let’s Encrypt 免费 SSL 证书。
1. 安装 acme.sh
curl https://get.acme.sh | sh
安装后,acme.sh
会放在 ~/.acme.sh/
目录,并自动加入 ~/.bashrc
。
验证是否安装成功:
acme.sh --version
2. 配置 Cloudflare API Token
2.1 创建 API Token
-
进入 My Profile → API Tokens
-
创建一个 自定义 Token,权限配置:
- Zone → DNS → Edit
- Zone → Zone → Read
-
限制作用域仅包含你要申请证书的域名,更安全
-
保存 API Token
2.2 设置环境变量
在 ~/.bashrc
或 ~/.zshrc
添加:
export CF_Token="你的_API_Token"
export CF_Account_ID="你的_Account_ID"
让环境变量生效:
source ~/.bashrc
3. 切换默认 CA 到 Let’s Encrypt
acme.sh 默认 CA 可能是 ZeroSSL,我们改为 Let’s Encrypt:
acme.sh --set-default-ca --server letsencrypt
查看当前 CA:
acme.sh --show-ca
4. 申请证书
以 xzsoft.com
为例,申请主域名和通配符证书:
acme.sh --issue --dns dns_cf -d xzsoft.com -d "*.xzsoft.com"
acme.sh 会通过 Cloudflare API 自动添加 _acme-challenge
TXT 记录,无需手动操作。
5. 安装证书(Nginx 示例)
将证书拷贝到指定目录并配置自动 reload:
acme.sh --install-cert -d xzsoft.com \
--key-file /etc/nginx/ssl/xzsoft.com.key \
--fullchain-file /etc/nginx/ssl/xzsoft.com.crt \
--reloadcmd "systemctl reload nginx"
修改 Nginx 配置:
server {
listen 443 ssl;
server_name xzsoft.com *.xzsoft.com;
ssl_certificate /etc/nginx/ssl/xzsoft.com.crt;
ssl_certificate_key /etc/nginx/ssl/xzsoft.com.key;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
6. 自动续期
acme.sh 会自动添加到 cron
,每天检测证书是否需要续期。无需额外配置。
查看任务:
crontab -l
✅ 总结
通过 acme.sh + Cloudflare DNS API + Let’s Encrypt,可以轻松实现:
- 自动申请主域名与通配符证书
- 自动续期,无需人工干预
- 与 Nginx/Apache 等无缝集成
这样,你的站点就能始终保持 HTTPS 安全访问。 🚀
要不要我帮你再写一个 常见错误排查(ZeroSSL / DNS 验证失败 / API 权限问题) 的补充章节?