在网站部署过程中,HTTPS 已经成为标配。如果拥有多个子域名,例如:
blog.example.comapi.example.comcdn.example.companel.example.com那么申请一张 通配符证书(Wildcard Certificate) 会更加方便。
通过 *.example.com 可以覆盖所有一级子域名,避免为每个子域名单独申请证书。
本文将介绍如何使用 acme.sh 免费申请和自动续期通配符 SSL 证书。
什么是 acme.sh
acme.sh 是一个纯 Shell 编写的 ACME 客户端,具有以下特点:
- 轻量级,无需 Python
- 支持 Linux、macOS、BSD
- 支持 Let’s Encrypt、ZeroSSL 等 CA
- 支持自动续期
- 支持数十种 DNS API
为什么通配符证书必须使用 DNS 验证
普通证书可以通过 HTTP 验证:
example.comwww.example.com但是通配符证书:
*.example.com只能通过 DNS TXT 记录验证。
因此以下方式无法申请通配符证书:
--standalone--webroot必须使用:
--dns安装 acme.sh
执行官方安装脚本:
curl https://get.acme.sh | sh安装完成后重新加载环境变量:
source ~/.bashrc检查版本:
acme.sh --version注册账户
推荐使用邮箱注册:
acme.sh --register-account -m your@email.com切换默认 CA 为 ZeroSSL:
acme.sh --set-default-ca --server zerossl如果更喜欢 Let’s Encrypt:
acme.sh --set-default-ca --server letsencryptCloudflare DNS 自动验证
以 Cloudflare 为例。
创建 API Token
进入 Cloudflare 控制台:
My Profile→ API Tokens→ Create Token授予以下权限:
Zone → DNS → EditZone → Zone → Read保存 Token。
配置环境变量
export CF_Token="xxxxxxxxxxxxxxxx"export CF_Account_ID="xxxxxxxxxxxxxxxx"为了避免重启后失效,可写入:
~/.bashrc或者:
~/.profile申请通配符证书
执行:
acme.sh --issue \ --dns dns_cf \ -d example.com \ -d '*.example.com'参数说明:
-
-d example.com 覆盖根域名
-
-d ‘*.example.com’ 覆盖所有一级子域名
-
—dns dns_cf 使用 Cloudflare DNS API 验证
申请成功后会显示:
Your cert is in:~/.acme.sh/example.com/目录结构类似:
example.com.cerexample.com.keyfullchain.cerca.cer安装证书
例如安装到 Nginx:
mkdir -p /etc/nginx/ssl执行:
acme.sh --install-cert -d example.com \ --key-file /etc/nginx/ssl/example.com.key \ --fullchain-file /etc/nginx/ssl/example.com.pem \ --reloadcmd "systemctl reload nginx"这样在证书续期后会自动重载 Nginx。
Nginx 配置示例
server { listen 443 ssl http2; server_name example.com *.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / { root /var/www/html; index index.html; }}检查配置:
nginx -t重载:
systemctl reload nginx自动续期
acme.sh 安装后会自动创建定时任务。
查看:
crontab -l手动测试续期:
acme.sh --renew -d example.com --force查看所有证书:
acme.sh --list常见问题
申请失败:Invalid DNS Record
原因:
- API Token 权限不足
- 域名解析未托管到 Cloudflare
- DNS TXT 记录未及时同步
建议等待几分钟后重试。
只申请了 *.example.com
如果命令只有:
-d '*.example.com'则证书不会覆盖:
example.com正确写法:
-d example.com-d '*.example.com'查看当前 CA
acme.sh --info -d example.com输出类似:
CA: https://acme.zerossl.com/v2/DV90总结
相比传统的证书申请方式,acme.sh 具有轻量、稳定、自动续期等优势。结合 Cloudflare、腾讯云 DNSPod、阿里云 DNS 等 DNS API,可以实现全自动申请和续期通配符证书。
推荐组合:
acme.sh + Cloudflare DNS + ZeroSSL或者:
acme.sh + Cloudflare DNS + Let's Encrypt基本可以实现零人工干预的 HTTPS 证书管理。