acme.sh 申请 Let’s Encrypt 通配符证书完全指南

什么是 acme.sh?

acme.sh 是一个纯 shell 脚本实现的 ACME 客户端,用于自动化申请和管理 Let’s Encrypt 等 CA 颁发的 SSL 证书。

特点:

  • 纯 shell 脚本,无依赖
  • 支持多种 DNS 提供商 API
  • 自动续期(cron job)
  • 支持通配符证书

安装 acme.sh

1
2
3
4
5
# 安装(不需要邮箱)
curl https://get.acme.sh | sh

# 激活环境变量
source ~/.bashrc

💡 提示:安装时提示 socat 警告可以忽略,如果你使用 DNS 验证方式,不需要 socat。

设置默认 CA 为 Let’s Encrypt

acme.sh 默认使用 ZeroSSL(需要邮箱注册),推荐切换到 Let’s Encrypt:

1
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

使用 Cloudflare API Token 申请证书

获取 Cloudflare API Token

  1. 登录 Cloudflare Dashboard
  2. 右上角头像 → My Profile
  3. 左侧 API TokensCreate Token
  4. 选择 Edit zone DNS 模板
  5. 配置:
    • Zone - DNS - Edit
    • Zone Resources: Specific zone → 选择你的域名
  6. 创建并复制 Token(只显示一次!)

配置 Token

1
export CF_Token="你的Cloudflare_API_Token"

📝 注意:现在只需要 CF_Token,不再需要 CF_EmailCF_Key!这是新版本的改进。

密钥类型:ECC vs RSA

在申请证书前,了解密钥类型非常重要。acme.sh 支持多种密钥类型。

ECC 和 RSA 对比

特性 RSA ECC
密钥长度 2048-4096 位 256-384 位
安全性 RSA 2048 ≈ ECC 256 同等安全,更短密钥
性能 较慢 更快(2-3倍)
握手速度
证书大小 较大 更小
兼容性 100% 极少老设备不支持

🏆 推荐:ECC 256(acme.sh 默认)

支持的密钥类型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ECC 256 位(推荐,默认)
acme.sh --issue --dns dns_cf -d example.com --keylength ec-256

# ECC 384 位(更安全,稍慢)
acme.sh --issue --dns dns_cf -d example.com --keylength ec-384

# RSA 2048 位(兼容性最好)
acme.sh --issue --dns dns_cf -d example.com --keylength 2048

# RSA 4096 位(最安全但最慢)
acme.sh --issue --dns dns_cf -d example.com --keylength 4096

💡 提示:如果不指定 --keylength,acme.sh 默认使用 ECC 256,这是目前最佳选择。

如何选择?

  • 现代网站 → ECC 256(默认,无需指定)
  • 需要兼容古老设备 → RSA 2048
  • 金融/政府等高安全需求 → ECC 384

申请通配符证书

1
~/.acme.sh/acme.sh --issue --dns dns_cf -d example.com -d "*.example.com"

⚠️ 重要*.example.com 需要用引号包裹,避免被 shell 展开。

参数说明:

  • --issue:申请证书
  • --dns dns_cf:使用 Cloudflare DNS API 验证
  • -d example.com:主域名
  • -d "*.example.com":通配符域名

安装证书到指定目录

申请成功后,将证书安装到你的服务使用的目录:

1
2
3
4
~/.acme.sh/acme.sh --install-cert -d example.com \
  --key-file /path/to/certs/key.pem \
  --fullchain-file /path/to/certs/cert.pem \
  --reloadcmd "systemctl reload nginx"

参数说明:

  • --key-file:私钥保存路径
  • --fullchain-file:完整证书链保存路径
  • --reloadcmd:证书更新后执行的命令(重载服务)

自动续期

acme.sh 安装时会自动创建 cron job,每天检查证书是否需要续期。

查看 cron job:

1
crontab -l | grep acme

手动强制续期:

1
~/.acme.sh/acme.sh --renew -d example.com --force

验证证书

检查证书信息:

1
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -dates

检查 SAN(通配符域名):

1
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"

常见问题

Q: 为什么不需要 CF_Email 了?

A: 新版本的 Cloudflare API 支持使用 API Token 代替 Global API Key。Token 权限更精细、更安全,只需要 CF_Token 一个变量。

Q: 通配符证书为什么需要 DNS 验证?

A: Let’s Encrypt 要求通配符证书必须通过 DNS-01 验证。HTTP-01 和 TLS-ALPN-01 不支持通配符。

Q: 证书续期是重新申请还是延期?

A: 重新申请。每次续期都会生成一个全新的证书,有效期从续期日开始算 90 天。acme.sh 默认在到期前 30 天自动续期。

Q: 证书文件在哪里?

A: 默认存储在 ~/.acme.sh/域名_ecc/ 目录下:

  • fullchain.cer:完整证书链
  • 域名.key:私钥

总结

步骤 命令
安装 curl https://get.acme.sh | sh
设置 CA acme.sh --set-default-ca --server letsencrypt
配置 Token export CF_Token="xxx"
申请证书 acme.sh --issue --dns dns_cf -d example.com -d "*.example.com"
安装证书 acme.sh --install-cert -d example.com ...

使用 acme.sh + Cloudflare API Token,你可以轻松实现 SSL 证书的自动化管理,再也不用担心证书过期了!