一、前言
通配符证书(Wildcard Certificate)可以用一个证书保护同一主域名下的所有子域名,例如 *.dwq1.com 可以覆盖 blog.dwq1.com、api.dwq1.com 等等。Let's Encrypt 免费且支持通配符证书(需使用 DNS 验证),配合 Certbot 工具,整个申请和续期过程非常丝滑。
本文将介绍在 Ubuntu 22.04 上使用 Certbot 申请 Let's Encrypt 通配符证书的两种方式:
- Nginx 验证:适用于已经使用 Nginx 提供 HTTP 服务的场景(但注意:通配符证书 必须 使用 DNS 验证,Nginx/HTTP 验证无法申请通配符证书。Nginx 验证适用于普通单域名/多域名证书)
- AliDNS 验证:通过阿里云 DNS API 自动完成 DNS 挑战,适合通配符证书和自动化续期
二、环境准备
2.1 安装 Certbot 和 Nginx 插件
# 更新软件源并安装
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
# 检查版本
certbot --version
2.2 安装 Certbot DNS 插件
# 阿里云 DNS 插件
sudo apt install -y python3-certbot-dns-aliyun
# 或者通过 pip 安装(如果 apt 仓库没有)
sudo apt install -y python3-pip
sudo pip3 install certbot-dns-aliyun
三、方式一:Nginx 验证(适用于普通单域/多域证书)
⚠️ 重要提醒:Let's Encrypt 的 Nginx/HTTP 验证不支持通配符证书,通配符证书只能使用 DNS 验证。本节适用于申请普通单域名或多域名证书的场景。
3.1 前置条件
- Nginx 已安装并运行
- 域名已解析到服务器 IP
- 服务器 80 端口可公网访问
3.2 启动 Certbot Nginx 插件
# 交互式申请(会自动修改 Nginx 配置)
sudo certbot --nginx -d dwq1.com -d www.dwq1.com
# 仅申请证书,不修改 Nginx 配置
sudo certbot certonly --nginx -d dwq1.com -d www.dwq1.com
3.3 手动指定证书目录
Certbot 成功后,证书存放在:
# 证书文件
/etc/letsencrypt/live/dwq1.com/fullchain.pem
# 私钥文件
/etc/letsencrypt/live/dwq1.com/privkey.pem
3.4 Nginx 配置 SSL
server {
listen 443 ssl http2;
server_name dwq1.com www.dwq1.com;
ssl_certificate /etc/letsencrypt/live/dwq1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dwq1.com/privkey.pem;
# 推荐的安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.html;
}
# HTTP 自动跳转 HTTPS(certbot --nginx 会自动添加)
server {
listen 80;
server_name dwq1.com www.dwq1.com;
return 301 https://$host$request_uri;
}
3.5 测试并重载
# 测试 Nginx 配置语法是否正确
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx
四、方式二:AliDNS 验证(适用于通配符证书)
通配符证书必须使用 DNS 验证,通过在域名中设置特定的 TXT 记录来证明域名所有权。
4.1 获取阿里云 AccessKey
- 登录 RAM 访问控制
- 创建子用户,授予
AliyunDNSFullAccess权限 - 获取
AccessKey ID和AccessKey Secret
4.2 创建阿里云 AccessKey 凭证文件
# 创建凭证目录和文件(权限设为 600 保护密钥)
sudo mkdir -p /etc/letsencrypt/
sudo tee /etc/letsencrypt/aliyun.ini << 'EOF'
dns_aliyun_access_key = 你的AccessKeyID
dns_aliyun_access_key_secret = 你的AccessKeySecret
EOF
sudo chmod 600 /etc/letsencrypt/aliyun.ini
4.3 申请通配符证书
# 使用 AliDNS 插件申请通配符证书
certbot certonly --dns-aliyun \
--dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
-d "dwq1.com" \
-d "*.dwq1.com"
Certbot 会自动通过阿里云 API 添加和删除 TXT 记录,全程无需手动操作。等待 DNS 记录生效后即可完成验证。
4.4 验证证书内容
# 查看证书信息
certbot certificates
# 检查通配符域名是否包含在内
certbot certificates | grep -A5 dwq1.com
输出应包含类似如下信息:
Certificate Name: dwq1.com
Domains: dwq1.com *.dwq1.com
Expiry Date: 2026-07-27 12:00:00
Certificate Path: /etc/letsencrypt/live/dwq1.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/dwq1.com/privkey.pem
五、Nginx 配置通配符证书
通配符证书配置与普通证书完全相同:
server {
listen 443 ssl http2;
server_name *.dwq1.com dwq1.com;
ssl_certificate /etc/letsencrypt/live/dwq1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dwq1.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.html;
}
六、自动续期
Let's Encrypt 证书有效期 90 天,建议每天执行一次续期检查:
6.1 配置 Cron 任务
# 编辑 crontab
sudo crontab -e
# 添加以下内容(每天凌晨 3 点执行续期检查,成功后重载 Nginx)
0 3 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"
6.2 手动测试续期
# 模拟续期(不会真正续期,仅测试配置)
sudo certbot renew --dry-run
# 强制续期(即使未到期也会续期,适用于切换验证方式后测试)
sudo certbot renew --force-renewal
七、常见问题
7.1 通配符证书为什么不能用 Nginx/HTTP 验证?
Let's Encrypt 协议规定:通配符证书只能通过 DNS-01 挑战验证。这是为了确保证书申请者真正拥有该域名的控制权,防止恶意通配符证书签发。
7.2 DNS 验证失败怎么办?
检查以下几点:
- AccessKey 权限是否正确(至少需要
AliyunDNSFullAccess) - 凭证文件格式是否正确
- 域名是否在阿里云管理(跨平台需要对应 DNS 插件)
- 检查日志:
cat /var/log/letsencrypt/letsencrypt.log
7.3 证书吊销
# 吊销证书
sudo certbot revoke --cert-path /etc/letsencrypt/live/dwq1.com/cert.pem
# 吊销后删除证书
sudo certbot delete --cert-name dwq1.com
八、总结
| 验证方式 | 支持通配符 | 自动化程度 | 适用场景 |
|---|---|---|---|
| Nginx 验证 | ❌ 不支持 | ✅ 全自动 | 普通单域/多域证书 |
| AliDNS 验证 | ✅ 支持 | ✅ 全自动 | 通配符证书、多域名证书 |
推荐做法:使用 AliDNS 验证 + Cron 自动续期,一次配置后完全无需人工干预,通配符证书覆盖所有子域名,省心省力。
文章评论