feat: 支持多域名证书申请(SAN证书)

- 在 QUICKSTART.md 中添加多域名申请的详细说明和示例
- 修复多域名申请时只为所有域名创建 webroot 路由的问题
- 支持使用 --additional-domains 参数申请包含多个域名的证书
This commit is contained in:
jingrow 2026-01-03 22:13:58 +08:00
parent db30f3d7f1
commit 8ff3bf27ab
2 changed files with 54 additions and 5 deletions

View File

@ -85,6 +85,8 @@ curl -X PUT 'http://localhost:9180/apisix/admin/routes/certbot-webroot' \
## 5. 测试申请证书Staging 环境)
### 单域名申请
```bash
# 测试申请证书
python3 ssl_manager.py request --domain your-domain.com
@ -93,6 +95,49 @@ python3 ssl_manager.py request --domain your-domain.com
python3 ssl_manager.py check --domain your-domain.com
```
### 多域名申请SAN 证书)
一个证书可以包含多个域名Subject Alternative Names适用于
- 主域名和 www 子域名
- 多个相关域名
- 通配符域名的替代方案
**方法一:使用 `--additional-domains` 参数**
```bash
# 申请包含多个域名的证书
python3 ssl_manager.py request --domain jingrowtools.com --additional-domains www.jingrowtools.com
# 或者使用简写 -a
python3 ssl_manager.py request -d example.com -a www.example.com api.example.com
```
**方法二:多次使用 `-d` 参数(如果支持)**
```bash
# 注意certbot 会自动将所有 -d 参数中的域名包含在一个证书中
python3 ssl_manager.py request --domain example.com --additional-domains www.example.com
```
**说明:**
- 主域名(`--domain`)将作为证书名称
- 所有域名(主域名 + 额外域名)都会被包含在证书的 SANSubject Alternative Names
- 证书申请成功后,会自动同步到 APISIX所有域名都可以使用同一个证书
- 续期时只需要使用主域名:`python3 ssl_manager.py renew --domain example.com`
**示例:**
```bash
# 为 example.com 和 www.example.com 申请证书
python3 ssl_manager.py request --domain example.com --additional-domains www.example.com
# 为多个子域名申请证书
python3 ssl_manager.py request --domain api.example.com --additional-domains api2.example.com api3.example.com
# 检查证书(使用主域名)
python3 ssl_manager.py check --domain example.com
```
## 6. 配置自动续期
### 使用 systemd timer推荐
@ -166,10 +211,13 @@ python3 ssl_manager.py request --domain your-domain.com
## 常用命令
```bash
# 申请证书
# 申请单域名证书
python3 ssl_manager.py request --domain example.com
# 续期证书
# 申请多域名证书SAN 证书)
python3 ssl_manager.py request --domain example.com --additional-domains www.example.com api.example.com
# 续期证书(多域名证书续期时只需指定主域名)
python3 ssl_manager.py renew --domain example.com
# 续期所有证书

View File

@ -375,13 +375,14 @@ class APISIXSSLManager:
additional_domains: 额外域名列表
max_retries: 最大重试次数默认3次
"""
# 确保 webroot 路由存在(为当前域名创建)
self.ensure_webroot_route(domain)
domains = [domain]
if additional_domains:
domains.extend(additional_domains)
# 确保所有域名的 webroot 路由都存在
for d in domains:
self.ensure_webroot_route(d)
# 构建 certbot 命令
cmd = [
self.certbot_path,