通配符 SSL 证书用一张证书保护一个域名及其所有子域名。无需为 www.example.com、blog.example.com 和 api.example.com 分别获取证书,一张 *.example.com 通配符即可全部覆盖。
通配符如何工作
通配符字符 * 匹配任何单级子域名:
| 证书 | 覆盖 | 不覆盖 |
|---|---|---|
*.example.com | www.example.com、blog.example.com、api.example.com、anything.example.com | example.com(裸域名)、sub.blog.example.com(嵌套) |
*.example.com + example.com | 所有子域名 + 裸域名 | 嵌套子域名 |
*.sub.example.com | a.sub.example.com、b.sub.example.com | sub.example.com、example.com |
关键限制: 通配符只匹配一级。*.example.com 不覆盖 a.b.example.com。
通配符 vs 多域名(SAN)
| 通配符 | 多域名(SAN) | |
|---|---|---|
| 覆盖 | 一级的所有子域名 | 特定列出的域名 |
| 灵活性 | 任何子域名自动生效 | 必须明确列出每个域名 |
| 新子域名 | 即时覆盖 | 需要新证书 |
| 跨域 | 否(一个基础域名) | 是(example.com + other.com) |
| 需要 DNS-01 | ✅ 是 | 否(HTTP-01 或 DNS-01) |
使用通配符当: 你有多个子域名或经常添加新的。 使用 SAN 当: 你有少量固定的特定域名/子域名。
何时使用通配符证书
适合的场景:
- 你有多个子域名(
app.、api.、docs.、blog.、staging.等)且不想为每个管理单独的证书 - 你经常添加新子域名——它们无需重新签发即可自动覆盖
- 开发/测试环境中子域名名称经常变化
通配符不适合的场景:
- 你需要覆盖不同的基础域名(
example.com+example.org)—— 使用 SAN 证书 - 你需要子域名级别的隔离——如果一个子域名的密钥泄露,通配符证书覆盖所有子域名
- 你不能修改 DNS 记录——通配符签发需要 DNS-01,这需要 DNS 访问权限
安全考虑
通配符证书意味着一个私钥保护所有子域名。如果密钥泄露,攻击者可以冒充任何子域名——不仅仅是一个。
缓解措施:
- 限制私钥访问 —— 只有需要它的服务器应该有密钥文件
- 使用短期证书 —— Let’s Encrypt 90 天有效期限制暴露窗口
- 考虑为高安全子域名使用独立证书(如
admin.example.com可能需要自己的证书)
获取免费通配符证书
Let’s Encrypt 通过 DNS-01 验证免费支持通配符证书。大多数竞争对手(ZeroSSL、SSL For Free)将通配符限制为付费套餐。
使用 GetHTTPS:
- 输入
*.example.com(如果要裸域名则加上example.com) - 添加 GetHTTPS 提供的 DNS TXT 记录
- 等待 DNS 传播(GetHTTPS 会为你预检)
- 验证并下载证书文件
安装通配符证书
与任何证书相同——服务器不知道这是通配符:
Nginx:
server {
listen 443 ssl http2;
server_name *.example.com example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
}
Apache:
<VirtualHost *:443>
ServerName example.com
ServerAlias *.example.com
SSLEngine on
SSLCertificateFile /etc/ssl/cert.pem
SSLCertificateKeyFile /etc/ssl/privkey.pem
SSLCertificateChainFile /etc/ssl/chain.pem
</VirtualHost>
常见问题
为什么通配符不能用 HTTP-01?
HTTP-01 通过在 http://hostname/.well-known/acme-challenge/... 放置文件来验证特定主机名。通配符覆盖无限子域名——没有单一服务器来放置文件。DNS-01 通过区域级别的 TXT 记录证明对整个域名的控制。
*.example.com 覆盖 example.com 吗?
不覆盖。裸域名是独立的。在证书请求中同时添加 *.example.com 和 example.com。GetHTTPS 和 Certbot 都支持在一张证书中包含两者。
能从 ZeroSSL 获取免费通配符吗?
不能。ZeroSSL 将通配符证书限制为付费套餐($10/月+)。Let’s Encrypt 免费提供通配符。
同一域名能有多张通配符证书吗?
可以。没有技术限制。你可以有 *.example.com 和 *.staging.example.com 作为独立证书。Let’s Encrypt 的速率限制是每注册域名每周 50 张证书。
通配符证书覆盖嵌套子域名吗?
不覆盖。*.example.com 覆盖 www.example.com 和 api.example.com,但不覆盖 dev.api.example.com。对于嵌套子域名,你需要单独的通配符如 *.api.example.com。
如何测试通配符证书对特定子域名是否有效?
将子域名的 DNS 指向你的服务器,然后测试:
echo | openssl s_client -connect subdomain.example.com:443 -servername subdomain.example.com 2>/dev/null | openssl x509 -noout -subject -dates
证书应显示 CN=*.example.com 或 SAN 字段中有 *.example.com。如果得到连接错误,说明子域名的 DNS 没有指向托管通配符证书的服务器。
能在多台服务器上使用通配符证书吗?
可以。在处理子域名的每台服务器上安装相同的 fullchain.pem 和 privkey.pem。证书不知道自己在哪台服务器上——它只验证主机名。