744 字
4 分钟
通过 acme.sh 轻松申请 Let's Encrypt 通配符证书

在网站部署过程中,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#

执行官方安装脚本:

Terminal window
curl https://get.acme.sh | sh

安装完成后重新加载环境变量:

Terminal window
source ~/.bashrc

检查版本:

Terminal window
acme.sh --version

注册账户#

推荐使用邮箱注册:

Terminal window
acme.sh --register-account -m your@email.com

切换默认 CA 为 ZeroSSL:

Terminal window
acme.sh --set-default-ca --server zerossl

如果更喜欢 Let’s Encrypt:

Terminal window
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。

配置环境变量#

Terminal window
export CF_Token="xxxxxxxxxxxxxxxx"
export CF_Account_ID="xxxxxxxxxxxxxxxx"

为了避免重启后失效,可写入:

Terminal window
~/.bashrc

或者:

Terminal window
~/.profile

申请通配符证书#

执行:

Terminal window
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:

Terminal window
mkdir -p /etc/nginx/ssl

执行:

Terminal window
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;
}
}

检查配置:

Terminal window
nginx -t

重载:

Terminal window
systemctl reload nginx

自动续期#

acme.sh 安装后会自动创建定时任务。

查看:

Terminal window
crontab -l

手动测试续期:

Terminal window
acme.sh --renew -d example.com --force

查看所有证书:

Terminal window
acme.sh --list

常见问题#

申请失败:Invalid DNS Record#

原因:

  • API Token 权限不足
  • 域名解析未托管到 Cloudflare
  • DNS TXT 记录未及时同步

建议等待几分钟后重试。

只申请了 *.example.com#

如果命令只有:

Terminal window
-d '*.example.com'

则证书不会覆盖:

example.com

正确写法:

Terminal window
-d example.com
-d '*.example.com'

查看当前 CA#

Terminal window
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 证书管理。

通过 acme.sh 轻松申请 Let's Encrypt 通配符证书
https://blog.leuxx.de/posts/33/
作者
Leu
发布于
2026-06-27
许可协议
CC BY-NC-SA 4.0

评论