通过 acme.sh 轻松申请 Let's Encrypt 通配符证书

通过acme.sh申请通配符证书

在网站部署过程中,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 证书管理。

免责声明
⏱ 已运行: 加载中...