域名证书
域名证书功能通过 ACME 协议自动申请和续期 SSL/TLS 证书,支持 Let's Encrypt 和 ZeroSSL,使用 DNS 验证方式,无需开放 80/443 端口。
技术原理
SSL/TLS 证书与 HTTPS
SSL/TLS 证书是 HTTPS 安全通信的基础,它通过非对称加密建立安全连接:
客户端 服务器
│ │
│──── ClientHello ─────────────→│
│←─── ServerHello + 证书 ───────│
│ (验证证书合法性) │
│──── 生成会话密钥 ─────────────→│
│←─── 加密通信开始 ──────────────│证书链说明:
- 根证书(Root CA):浏览器内置信任的顶级证书颁发机构
- 中间证书(Intermediate CA):由根 CA 签发,用于签发终端证书
- 终端证书(End-entity):你的域名证书,由中间 CA 签发
ACME 协议原理
ACME(Automatic Certificate Management Environment)是 Let's Encrypt 使用的自动化证书管理协议:
NetPanel ACME 服务器(Let's Encrypt)
│ │
│──── 申请证书(域名列表)────────→│
│←─── 下发验证挑战(Challenge)───│
│ │
│ [DNS-01 验证] │
│──── 调用 DNS API 添加 TXT 记录 ──→ DNS 服务商
│──── 通知验证完成 ───────────────→│
│←─── 验证通过,颁发证书 ──────────│
│ │
│──── 自动删除 TXT 记录 ──────────→ DNS 服务商DNS-01 vs HTTP-01 验证方式对比
| 对比项 | DNS-01 验证 | HTTP-01 验证 |
|---|---|---|
| 验证方式 | 在 DNS 中添加 TXT 记录 | 在 Web 服务器放置验证文件 |
| 端口要求 | 无需开放任何端口 | 需要开放 80 端口 |
| 通配符证书 | ✅ 支持 | ❌ 不支持 |
| 自动化程度 | 需要 DNS API | 需要 Web 服务器配合 |
| 适用场景 | 内网服务、无公网端口 | 已有 Web 服务器 |
| NetPanel 支持 | ✅ 主要方式 | ❌ 不支持 |
NetPanel 使用 DNS-01 验证
NetPanel 采用 DNS-01 验证方式,无需开放 80/443 端口,特别适合家庭内网环境。只需配置 DNS 服务商的 API 密钥即可全自动完成证书申请和续期。
功能概述
- 自动申请免费 SSL 证书(Let's Encrypt / ZeroSSL)
- 使用 DNS-01 验证,无需开放 HTTP 端口
- 证书到期前自动续期
- 申请的证书可供 Caddy 等功能使用
- 支持通配符证书(
*.example.com)
工作原理
DNS-01 验证流程:
- ACME 服务器要求在域名的 DNS 中添加特定 TXT 记录
- NetPanel 自动调用 DNS 服务商 API 添加该记录
- ACME 服务器验证 TXT 记录,验证通过后颁发证书
- NetPanel 自动删除临时 TXT 记录
前置条件
使用域名证书功能前,需要先在 域名账号 页面配置对应服务商的 API 密钥,用于自动添加 DNS 验证记录。
配置说明
进入 域名证书 页面,点击 新建 按钮:
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| 名称 | 字符串 | ✅ | — | 证书名称 |
| 域名 | 字符串 | ✅ | — | 申请证书的域名,多个用换行分隔 |
| 域名账号 | 选择 | ✅ | — | 用于 DNS 验证的域名账号 |
| CA 服务商 | 枚举 | ✅ | Let's Encrypt | 证书颁发机构 |
| 邮箱 | 字符串 | ✅ | — | 用于接收证书到期提醒 |
| 自动续期 | 布尔 | ❌ | true | 证书到期前自动续期 |
| 续期提前天数 | 整数 | ❌ | 30 | 提前多少天开始续期 |
CA 服务商说明
| 服务商 | 说明 | 限制 |
|---|---|---|
| Let's Encrypt | 最广泛使用的免费 CA | 每周每域名限 50 张 |
| ZeroSSL | 另一家免费 CA,可作为备选 | 需要注册账号 |
| Let's Encrypt (Staging) | 测试环境,不受速率限制 | 证书不被浏览器信任 |
配置示例
申请单域名证书
| 字段 | 值 |
|---|---|
| 名称 | example.com 证书 |
| 域名 | example.com |
| 域名账号 | 选择阿里云账号 |
| CA 服务商 | Let's Encrypt |
| 邮箱 | admin@example.com |
申请通配符证书
通配符证书(*.example.com)可以覆盖所有一级子域名,只有 DNS-01 验证方式才支持通配符证书。
| 字段 | 值 |
|---|---|
| 名称 | 通配符证书 |
| 域名 | *.example.com(第一行)example.com(第二行) |
| 域名账号 | 选择 Cloudflare 账号 |
| CA 服务商 | Let's Encrypt |
| 邮箱 | admin@example.com |
通配符证书说明
*.example.com覆盖:www.example.com、app.example.com、api.example.com等*.example.com不覆盖:example.com(根域名)、a.b.example.com(二级子域名)- 建议同时申请
*.example.com和example.com两个域名
申请多域名证书(SAN)
一张证书覆盖多个不同域名:
| 字段 | 值 |
|---|---|
| 名称 | 多域名证书 |
| 域名 | example.comwww.example.comapi.example.com |
证书管理
查看证书状态
在证书列表中,每张证书会显示:
- 到期时间:证书的有效期截止日期
- 状态:有效 / 即将到期 / 已过期 / 申请中 / 申请失败
- 证书路径:证书文件在服务器上的存储路径
手动续期
点击证书右侧的 续期 按钮,可立即触发证书续期,无需等待自动续期。
在 Caddy 中使用证书
申请成功的证书可以在 Caddy 网站服务 中直接选择使用,无需手动配置证书路径。
常见问题排查
Q:证书申请失败,提示 DNS 验证失败?
原因: DNS TXT 记录未及时传播,ACME 服务器验证时未能查询到记录。
解决步骤:
- 检查域名账号的 API 密钥是否正确,权限是否包含 DNS 编辑
- 手动查询 TXT 记录是否已添加:bash
nslookup -type=TXT _acme-challenge.example.com 8.8.8.8 - 等待 DNS 传播(通常 1-5 分钟),然后重试
- 检查域名是否在该账号下管理(非其他账号)
Q:提示"too many certificates already issued"?
原因: 触发了 Let's Encrypt 的速率限制(每周同一域名最多 50 张证书)。
解决方案:
- 等待速率限制重置(每周一重置)
- 测试阶段使用 Let's Encrypt Staging 环境
- 申请通配符证书代替多张单域名证书
Q:证书申请成功,但浏览器仍提示不安全?
可能原因:
- 证书未正确配置到 Web 服务器(检查 Caddy 配置)
- 使用了 Staging 环境证书(不被浏览器信任)
- 证书域名与访问域名不匹配
Q:自动续期失败怎么办?
排查步骤:
- 检查 DNS 服务商 API 密钥是否过期或被撤销
- 查看系统日志中的续期错误信息
- 手动点击 续期 按钮触发续期
- 确认域名 DNS 解析仍由该账号管理
注意事项
速率限制
Let's Encrypt 对同一域名有速率限制(每周最多 50 张证书)。测试时建议使用 Let's Encrypt Staging 环境,避免触发限制。
DNS 传播等待
DNS-01 验证需要等待 DNS 记录传播。如果申请失败,可能是 DNS 传播延迟导致,稍后重试即可。
证书存储位置
证书文件默认存储在数据目录的 certs/ 子目录下,格式为 PEM 文件(cert.pem 和 key.pem)。