适用场景:
• 仅为example.com申请单域名证书
• 为example.com及其全部子域名*.example.com申请一张泛域名证书
• 自动续期、自动部署到 Nginx/Docker 等
工具:acme.sh(纯 Shell,ZeroSSL / Let’s Encrypt 双 CA 支持)
1. 安装 acme.sh
# 任意 Linux 发行版通用
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
source ~/.bashrc # 重新加载 PATH
acme.sh --version # 验证安装安装完成后:
• 脚本位于 ~/.acme.sh/
• 自动创建每日 0 点的续期 cron:crontab -l 可见
2. 选择 CA(Let’s Encrypt 或 ZeroSSL)
# 默认 CA 为 ZeroSSL;若想用 Let’s Encrypt
acme.sh --set-default-ca --server letsencrypt3. 申请方式总览
| 场景 | 推荐方式 | 是否需要 80 端口 | 备注 |
|---|---|---|---|
| 服务器已运行 Web 服务 | HTTP-01(webroot) | 是 | 简单快捷 |
| 无 Web 服务或 80 被占用 | HTTP-01(standalone) | 是 | 临时占用 80 |
| 泛域名 / 多域名 | DNS-01(API) | 否 | 一次签发 *.example.com |
4. 单域名证书示例
4.1 服务器已有 Web(Nginx/Apache)
# 以 Nginx 根目录 /var/www/html 为例
acme.sh --issue \
-d example.com \
-w /var/www/htmlacme.sh 会自动在 /var/www/html/.well-known/acme-challenge/ 放置验证文件。
4.2 无 Web 服务
# 需 80 端口空闲,自动起临时 web
acme.sh --issue \
-d example.com \
--standalone5. 泛域名证书示例(DNS-API 方式)
5.1 准备 DNS API 密钥(以腾讯云为例)
在域名商控制台获取:
• SecretId
• SecretKey
export Tencent_SecretId="AKIDxxxxxxxx"
export Tencent_SecretKey="xxxxxxxxxxxxxxxx"5.2 一键申请
acme.sh --issue \
--dns dns_tencent \
-d example.com \
-d '*.example.com'注意:
• 必须同时写 -d example.com -d '*.example.com'
• 泛域名仅支持 DNS-01 验证
6. 安装(部署)证书到 Nginx
acme.sh 不会直接修改服务器配置,而是把证书复制到你指定的目录,并帮你 reload 服务。
# 创建统一存放目录
sudo mkdir -p /etc/ssl/acme
# 安装证书
acme.sh --install-cert -d example.com \
--key-file /etc/ssl/acme/example.com.key \
--fullchain-file /etc/ssl/acme/fullchain.cer \
--reloadcmd "nginx -t && systemctl reload nginx"Nginx 配置片段:
server {
listen 443 ssl http2;
server_name example.com *.example.com;
ssl_certificate /etc/ssl/acme/fullchain.cer;
ssl_certificate_key /etc/ssl/acme/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
}测试并重载:
sudo nginx -t && sudo systemctl reload nginx7. 自动续期
无需额外配置,acme.sh 已写入 cron。如需手动测试:
acme.sh --renew -d example.com --force8. 常用命令速查
| 目的 | 命令 |
|---|---|
| 查看已有证书 | acme.sh --list |
| 强制续期 | acme.sh --renew -d example.com --force |
| 删除证书 | acme.sh --remove -d example.com |
| 升级 acme.sh | acme.sh --upgrade |
9. 故障排查
| 现象 | 原因 | 解决 |
|---|---|---|
Standalone mode :: 80 port is used | 80 被占用 | 改用 webroot 或临时关闭占用进程 |
DNS API 报错 Invalid SecretId | 变量名/权限错误 | 重新核对 DNS 商 API 密钥 |
| 泛域名证书浏览器无效 | 只写了 *.example.com 没写根域 | 重新申请时同时带 -d example.com |
10. 参考
- acme.sh 官方文档:https://github.com/acmesh-official/acme.sh
- Let’s Encrypt 证书链说明:https://letsencrypt.org/certificates/