在网站部署过程中,HTTPS 已经成为标配。如果拥有多个子域名,例如:
blog.example.com
api.example.com
cdn.example.com
panel.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
项目地址: https://github.com/acmesh-official/acme.sh
为什么通配符证书必须使用 DNS 验证
普通证书可以通过 HTTP 验证:
example.com
www.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 letsencrypt
Cloudflare DNS 自动验证
以 Cloudflare 为例。
创建 API Token
进入 Cloudflare 控制台:
My Profile
→ API Tokens
→ Create Token
授予以下权限:
Zone → DNS → Edit
Zone → 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.cer
example.com.key
fullchain.cer
ca.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 证书管理。