Skip to content

AutoSSL 通配符 DNS 验证

通配符证书必须使用 DNS 验证。它不能通过一键 HTTP 部署命令、Nginx 插件、Apache 插件或 webroot 验证签发。

当证书包含以下通配符域名时,请使用本教程:

text
example.com
*.example.com

选择验证方式

如果需要自动续期,推荐使用 DNS API。这是生产环境部署通配符证书的推荐方式。

如果 DNS 服务商没有可用 API,或者只是临时测试,可以使用 手动 DNS。但手动 DNS 在续期时也需要人工更新 TXT 记录,不适合长期自动化。

准备信息

请先准备订单中的 AutoSSL ACME 信息:

text
Server URL: https://acme.sectigo.com/v2/DV
ACME account ID / EAB MAC ID: 你的 ID
EAB MAC key: 你的 key

确认域名由你准备使用的 DNS 服务商管理。签发 *.example.com 时,你需要有权限在 example.com 下创建 TXT 记录。

Cloudflare DNS API

下面以 Certbot + Cloudflare DNS 为例,签发通配符证书,并把证书保存到 /etc/sectigo

1. 创建 Cloudflare API Token

在 Cloudflare 创建 API Token,权限选择:

text
Zone -> DNS -> Edit
Zone -> Zone -> Read

建议把 Token 限制到指定 Zone,例如 example.com

2. 安装 Certbot 和 DNS 插件

Ubuntu/Debian:

bash
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-dns-cloudflare

RHEL / AlmaLinux / Rocky / CentOS:

bash
sudo dnf install -y epel-release || sudo yum install -y epel-release
sudo dnf install -y certbot python3-certbot-dns-cloudflare || sudo yum install -y certbot python3-certbot-dns-cloudflare

3. 保存 DNS API Token

bash
sudo mkdir -p /etc/sectigo/dns
sudo tee /etc/sectigo/dns/cloudflare.ini >/dev/null <<'EOF'
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
EOF
sudo chmod 600 /etc/sectigo/dns/cloudflare.ini

4. 签发通配符证书

运行前请替换对应值:

bash
sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/sectigo/dns/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 60 \
  --config-dir /etc/sectigo \
  --work-dir /var/lib/sectigo \
  --logs-dir /var/log/sectigo \
  --non-interactive \
  --agree-tos \
  --register-unsafely-without-email \
  --server "https://acme.sectigo.com/v2/DV" \
  --eab-kid "YOUR_ACME_ACCOUNT_ID_OR_EAB_MAC_ID" \
  --eab-hmac-key "YOUR_EAB_MAC_KEY" \
  --domain "example.com" \
  --domain "*.example.com" \
  --cert-name "example.com"

证书文件位置:

text
/etc/sectigo/live/example.com/fullchain.pem
/etc/sectigo/live/example.com/privkey.pem

5. 配置到网站服务

Nginx 配置示例:

nginx
ssl_certificate     /etc/sectigo/live/example.com/fullchain.pem;
ssl_certificate_key /etc/sectigo/live/example.com/privkey.pem;

然后重新加载:

bash
sudo nginx -t
sudo systemctl reload nginx

Apache 配置示例:

apache
SSLCertificateFile /etc/sectigo/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/sectigo/live/example.com/privkey.pem

然后重新加载:

bash
sudo apachectl configtest
sudo systemctl reload apache2 || sudo systemctl reload httpd

集中托管模式

如果你希望由 12SSL 统一管理通配符证书的签发、续期和部署,我们可以使用集中托管模式。

在这种模式下,证书管理服务器负责:

  • 自动向 CA 申请和续期证书
  • 通过 DNS API 创建 _acme-challenge TXT 验证记录
  • 记录证书状态、到期时间和续期结果
  • 在续期成功后把证书部署到指定服务器
  • 在部署失败或续期失败时提供状态记录,便于排查

订单中的 ACME 信息和证书状态会由系统自动保存,证书页面也会显示这些信息。为了完成集中托管和自动 DNS 验证,你只需要额外提供:

text
DNS 服务商类型
DNS Zone
DNS API Token
部署目标服务器信息

DNS API Token 建议只授权指定域名的 DNS 记录编辑权限。我们不建议,也不会要求你提供 DNS 账号登录密码。

如果证书需要部署到多台服务器,还需要保存每台服务器的部署信息,例如服务器地址、Web 服务类型、证书路径和重载方式。对于安全要求更高的环境,可以使用客户端 Agent 或受限 SSH Key,让私钥保存在你的服务器本地。

自动续期

创建和一键部署工具一致的续期任务:

bash
sudo tee /etc/systemd/system/sectigo-certbot-renew.service >/dev/null <<'EOF'
[Unit]
Description=Renew Sectigo AutoSSL certificates with Certbot

[Service]
Type=oneshot
ExecStart=/bin/bash -lc 'certbot renew --config-dir /etc/sectigo --work-dir /var/lib/sectigo --logs-dir /var/log/sectigo --quiet'
EOF

sudo tee /etc/systemd/system/sectigo-certbot-renew.timer >/dev/null <<'EOF'
[Unit]
Description=Daily Sectigo AutoSSL certificate renewal

[Timer]
OnCalendar=*-*-* 03:18:00
RandomizedDelaySec=2h
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now sectigo-certbot-renew.timer

只要 DNS API Token 保持有效,续期通常不需要人工介入。

手动 DNS 验证

只有在无法使用 DNS API 时,才建议使用手动 DNS。

bash
sudo certbot certonly \
  --manual \
  --preferred-challenges dns \
  --config-dir /etc/sectigo \
  --work-dir /var/lib/sectigo \
  --logs-dir /var/log/sectigo \
  --agree-tos \
  --register-unsafely-without-email \
  --server "https://acme.sectigo.com/v2/DV" \
  --eab-kid "YOUR_ACME_ACCOUNT_ID_OR_EAB_MAC_ID" \
  --eab-hmac-key "YOUR_EAB_MAC_KEY" \
  --domain "example.com" \
  --domain "*.example.com" \
  --cert-name "example.com"

Certbot 会提示你添加一条或多条 TXT 记录,例如:

text
_acme-challenge.example.com

在 DNS 服务商处添加 TXT 记录,等待 DNS 生效后,再回到 Certbot 提示继续。

手动 DNS 不适合无人值守续期,因为续期时 TXT 值会变化。

常见问题

  • 找不到 TXT 记录:等待更长 DNS 生效时间,或确认记录添加在权威 DNS 服务商处。
  • DNS 位置填错:签发 *.example.com 时,TXT 通常是 _acme-challenge.example.com,不是 _acme-challenge.*.example.com
  • 后续续期失败:请使用 DNS API Token,并确认 Token 有编辑 TXT 记录权限。
  • 证书已签发但网站仍显示旧证书:检查网站服务中的证书路径,并重新加载网站服务。