证书页面的上传、ACME 申请与续期、DNS 凭据和源站保护,以及网站「HTTPS」页签、压缩、监听端口与网站端口的设置。
| 术语 | 定义 |
|---|---|
| 证书 | 证书链与私钥。网站的每个域名都须被网站的某一张证书覆盖。 |
| ACME 证书 | 控制台向 Let's Encrypt、ZeroSSL、Google Trust Services 或自定义 ACME 目录申请、自动续期的证书。 |
| ACME 账户 | 控制台在 CA 注册的账户,按目录、EAB 密钥 ID 与邮箱区分,同一组合的证书共用。 |
| DNS 凭据 | DNS 服务商凭据,供 DNS-01 验证写入 TXT 记录。与 DNS 调度的服务商账号相互独立。 |
| HTTPS 设置 | 网站「HTTPS」页签中的证书(最多 4 张)、跳转、HSTS、TLS、HTTP/2、HTTP/3、OCSP 装订与客户端证书选项;压缩在「缓存」页签的「压缩」卡片中设置,与 HTTPS 设置保存在同一组字段中。 |
| 客户端证书 | 访客在 TLS 握手中出示、由网站配置的 CA 签发的证书(双向 TLS)。 |
| 监听端口 | 节点接收 HTTP / HTTPS 流量的端口:80、443 与集群的附加端口;网站在「端口」卡片中选择其中一部分。 |
| 源站保护 | Origin CA 签发只有节点信任的源站证书;回源客户端 CA 签发节点回源时出示的客户端证书。 |
页面:证书(/certificates),侧边栏「网站」组。页签:「证书」(默认)、「源站证书」(/certificates?tab=origin-ca,见 Origin CA)、「回源客户端」(/certificates?tab=origin-client,见 回源客户端证书)。/certificates?request=true(命令菜单的申请证书)直接打开「申请证书」对话框。
「证书」页签的页面操作为「添加 DNS 凭据」「上传证书」「申请证书」,其下依次是证书列表、「DNS 凭据」卡片与「ACME 账户」卡片。证书列表每 5 秒刷新;没有证书时显示「暂无证书」与「申请证书」。
| 证书行 | 内容 |
|---|---|
| 名称与状态 | 见下表 |
| 域名 | 证书的全部名称 |
| 原因 | 签发失败或节点无法加载时的原因,见故障排查 |
| 节点报告 | 「{节点} 无法加载此证书,已拒绝其 TLS 握手」或「{节点} 无法加载此证书,仍在使用上一版」,见上传证书 |
| 有效期 | 「到期时间 {时间} · 剩余 {N} 天」;过期后为「已于 {时间} 过期」 |
| 续期 | 「已开启自动续期」或「未开启自动续期」;开启时另显示「下次续期:{时间}」 |
| 「⋯」 | 「立即续期」(只有 ACME 证书,「等待签发」「签发中」时不可用)与「删除」 |
列表底部显示「共 N 项」。
| 状态 | 条件 |
|---|---|
| 等待签发 | ACME 证书等待后台任务签发或续期 |
| 签发中 | 后台任务正在签发 |
| 可用 | 已签发、未过期 |
| 签发失败 | 最近一次签发或续期失败;已签发的证书继续使用 |
| 已过期 | 已过有效期;续期中的证书保持「等待签发」或「签发中」 |
| 不可用 | 上传的证书使用显式曲线参数(节点无法加载),或有节点报告无法加载且没有上一版可用 |
- 打开 证书,点击「上传证书」。
- 填写「名称」。
- 在「证书链(PEM)」中选择文件(
.pem、.crt、.cer)或粘贴内容,叶证书在前,中间证书依次在后。 - 在「私钥(PEM)」中选择文件(
.pem、.key)或粘贴内容。 - 点击「上传证书」。
- 验证:证书行状态为「可用」,显示「到期时间 … · 剩余 … 天」。
| 要求 | 值 |
|---|---|
| 名称 | 1–100 字符 |
| 证书链 | 1–10 张证书,最大 128 KiB;每张由下一张签发;只能包含证书,合并了私钥的 PEM 被拒绝(「证书链只能包含证书,私钥请填到私钥栏」) |
| 叶证书 | 不是 CA 证书,含 DNS 类型的 SAN,当前处于有效期内 |
| 密钥类型 | 叶证书的密钥为 RSA(2048 位及以上)或 ECDSA P-256、P-384、P-521;其他曲线(secp256k1、Brainpool、SM2、P-224)、Ed25519、Ed448、ML-DSA、RSA-PSS、DSA 被拒绝 |
| 私钥 | 与叶证书匹配,不加密,最大 32 KiB |
| EC 密钥 | 证书与私钥都须使用命名曲线(曲线 OID),不接受显式曲线参数 |
| Origin CA | Origin CA 签发的证书被拒绝(「Origin CA 签发的证书只能用于源站」) |
保存的只有重新编码的证书与 PKCS #8 私钥,粘贴内容里的其他文字不保存。上传写审计 certificate.upload。上传的证书不自动续期(「未开启自动续期」);到期前上传新证书并在网站中改选。
此前上传、使用显式曲线参数的证书节点同样无法加载:
| 项目 | 行为 |
|---|---|
| 后台检查 | 后台任务每次启动时检查已上传的证书:这类证书状态变为「不可用」并显示原因,审计日志记录「证书标记为节点无法加载」(certificate.unloadable)和使用它的网站与 L4 应用 |
| 网站 | 网站与「已有证书」列表不再提供它;已选用它的网站不被自动改动,保存这些网站的「HTTPS」页签时返回同样的错误 |
| 节点 1.1.0 及以上 | 跳过无法加载的证书,照常应用配置版本的其余部分:节点上还有该证书的上一版时继续使用上一版,没有时拒绝用到它的 TLS 握手,不换用其他证书 |
| 更早的节点 | 该集群的所有节点都不应用这个版本 |
| 上报 | 节点上报后,证书行显示节点报告(拒绝握手时状态为「不可用」),节点显示「N 张证书未加载」,并发出告警「节点无法加载证书」 |
| 处理 | 上传命名曲线的证书(见故障排查),在这些网站的「HTTPS」页签改选并保存,或改为「仅 HTTP」,再删除旧证书 |
DNS-01 验证需要先添加凭据。
- 打开 证书,点击「添加 DNS 凭据」。
- 填写「名称」,选择「DNS 服务商」,按表单填写凭据字段。
- 能列出区域的服务商:点击「列出区域」并选择「区域」;其他服务商直接填写「区域」。
- 点击「测试连接」,确认显示「连接正常:区域内有 N 条记录」。
- 点击「创建」。保存前先执行与「测试连接」相同的测试;失败时对话框显示错误,按钮变为「仍然保存」。
- 验证:凭据出现在「DNS 凭据」卡片中,显示其区域与服务商。
| 字段 | 取值 |
|---|---|
| 名称 | 1–100 字符 |
| DNS 服务商 | 服务商目录中的服务商,见服务商与凭据 |
| 凭据字段 | 1–10 个字段,各最长 16384 字符;字段与最小权限见服务商与凭据 |
| 区域 | 域名,不能是泛域名;证书名称须为区域本身或其下的子域名 |
凭据使用主密钥信封加密后保存,只写不读。点击凭据所在行打开「编辑」对话框:可改名,或打开「重新填写凭据」轮换密钥;服务商与区域不能修改。新凭据保存前同样先测试;只改名时不测试;测试失败后修改任一字段,下次保存重新测试。轮换后,使用该凭据且处于「签发失败」的证书和待清理的 TXT 记录立即重试。审计:dns_credential.create、dns_credential.update、dns_credential.delete。
前提:
- HTTP-01:每个证书名称都是某个网站的精确域名(不能是泛域名),已解析到服务该网站的集群的节点,节点 80 端口可从公网访问;该集群有在线节点,在线节点都支持
http01-v1。 - DNS-01:已添加区域覆盖全部证书名称的 DNS 凭据;证书名称不必已加入网站。
- 打开 证书,点击「申请证书」。
- 填写「名称」「域名」「账户邮箱」。
- 选择「证书颁发机构」「密钥类型」和「验证方式」。选择 DNS-01 时选择「DNS 凭据」;选择 ZeroSSL 或 Google Trust Services 时填写「EAB 密钥 ID」和「EAB HMAC 密钥」。
- 点击「申请证书」。
- 验证:证书行状态依次变为「等待签发」「签发中」「可用」,并显示「已开启自动续期」和「下次续期:…」。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 名称 | 1–100 字符 | 无 | 证书在控制台中的名称 |
| 域名 | 1–100 个域名,逗号或空格分隔,不重复;可含 *. 泛域名 |
无 | 证书 SAN |
| 账户邮箱 | 邮箱地址 | 无 | ACME 账户联系邮箱 |
| 证书颁发机构 | Let's Encrypt / ZeroSSL / Google Trust Services / 自定义 ACME 目录 | Let's Encrypt;自定义目录的地址只来自 EDGEWEIR_ACME_DIRECTORY 时为自定义 ACME 目录 |
签发证书的 CA,见证书颁发机构;「自定义 ACME 目录」在系统设置配置后才出现,选择后表单显示目录地址 |
| 密钥类型 | ECDSA P-256 / RSA 2048 | ECDSA P-256 | 证书私钥的类型,续期沿用。需要同时服务只支持 RSA 的旧客户端时,另申请一张 RSA 证书加入网站,见多张证书 |
| 验证方式 | HTTP-01 / DNS-01 | HTTP-01 | 域名控制验证方式;泛域名必须使用 DNS-01,选择 HTTP-01 时「域名」下提示「泛域名需要 DNS-01 验证」,不能提交 |
| DNS 凭据 | 已添加的 DNS 凭据 | 按名称排序的第一个 | 仅 DNS-01:写入 TXT 所用的凭据;每张证书一个区域 |
| 跳过解析检查 | 开 / 关 | 关 | 仅 HTTP-01:不检查名称是否解析到节点(申请时与每次签发前),例如节点前面还有负载均衡 |
| EAB 密钥 ID / EAB HMAC 密钥 | CA 提供的 EAB 凭据,最长 256 / 1024 字符 | 无 | Let's Encrypt 不显示;ZeroSSL 与 Google Trust Services 必填;两者同时填写或都留空;自定义目录留空时使用系统设置中的 EAB(占位文字「留空使用系统设置中的 EAB」)。加密保存 |
申请写审计 certificate.request。同一 ACME 目录、EAB 密钥 ID 与账户邮箱的证书共用一个 ACME 账户:CA 限制每个 IP 新注册的账户数(Let's Encrypt 为 3 小时 10 个)。账户列在「ACME 账户」卡片中,见 ACME 账户。
| CA | ACME 目录 | EAB | CAA 签发者 |
|---|---|---|---|
| Let's Encrypt | https://acme-v02.api.letsencrypt.org/directory |
不需要 | letsencrypt.org |
| ZeroSSL | https://acme.zerossl.com/v2/DV90 |
必填(ZeroSSL 控制台生成) | sectigo.com、trust-provider.com、usertrust.com |
| Google Trust Services | https://dv.acme-v02.api.pki.goog/directory |
必填(gcloud publicca external-account-keys create 生成,7 天内使用、只能注册一次) |
pki.goog |
| 自定义 ACME 目录 | 系统设置 → 证书颁发机构 中的地址,或 EDGEWEIR_ACME_DIRECTORY |
目录要求时填写;申请时留空使用系统设置中的 EAB | 系统设置中保存的目录 meta.caaIdentities 列出的名称;没有时或地址只来自环境变量时不检查 CAA |
自定义目录的地址、EAB 与 CA 证书见系统设置,界面保存的值优先于 EDGEWEIR_ACME_DIRECTORY 与 EDGEWEIR_ACME_CA_FILE。没有指定 CA 的 API 申请在自定义目录的地址只来自环境变量时使用自定义目录,其余情况使用 Let's Encrypt:只用环境变量的已有部署升级后行为不变;此前用环境变量签发的证书在后台任务启动时记为「自定义 ACME 目录」,续期仍向该目录申请。删除自定义目录的配置后,选择它的证书续期失败(「已不再配置自定义 ACME 目录」)。
「ACME 账户」卡片列出控制台注册的账户:邮箱、CA、目录地址、「EAB 密钥 ID」、「创建于 …」与「使用中的证书:N」;没有账户时显示「还没有 ACME 账户」。没有证书使用的账户可以删除(确认「删除 ACME 账户 {email}?」):只删除控制台保存的账户与私钥,不在 CA 注销账户;仍有证书使用时删除按钮不可用,API 返回「ACME 账户仍被证书使用:…」。删除写审计 acme_account.delete。之后用同一目录、EAB 与邮箱申请时重新注册账户。
| 方式 | 行为 |
|---|---|
| HTTP-01 | 每个名称都必须是某个网站的精确域名,否则申请被拒绝(「证书域名与网站或 DNS 区域不匹配:…」):挑战只由服务该名称的集群应答。申请时依次检查:服务这些名称的集群中在线节点都支持 http01-v1(「节点尚不支持:HTTP-01 验证(…)」),集群有在线节点(「集群 … 没有在线节点应答 HTTP-01」),名称解析到节点(「以下名称未解析到节点:…」)。控制台把一张证书的全部挑战一次发布到这些集群(每个集群一个版本,原因「已更新 ACME 验证」,网站已停用时同样发布),集群内所有在线节点在 40 秒内应用后才请求 CA 验证,同时验证 4 个名称。申请时和每次签发前,控制台用系统 DNS 解析各名称(每次 3 秒、最多 2 次):名称没有 A/AAAA 记录,或解析结果中有不属于该集群活动节点的地址(节点配置的调度地址或上报的公网地址)时,申请被拒绝,签发不联系 CA 直接失败(「有域名未解析到节点」);解析超时或节点没有已知公网地址时不拦截。挑战在 80 端口应答,不跳转、不缓存,10 分钟后或签发结束后失效(其他 HTTP-01 token 转给源站,源站可自行签发证书,这类请求不缓存、不挑战);挑战版本不计入保留的配置版本数 |
| DNS-01 | 每个名称都必须在 DNS 凭据的区域内(区域本身或其下的子域名),否则申请被拒绝(「证书域名与网站或 DNS 区域不匹配:…」)。在 _acme-challenge.<域名> 写入 TXT,最长等待 3 分钟传播。同一凭据同时只有一次签发写入记录。签发结束、超时或进程中断后删除本次写入的 TXT 值;删除失败时按 1 分钟起、每次加倍、最长 6 小时的间隔重试,服务商已没有该区域时视为已删除 |
| 项目 | 行为 |
|---|---|
| 自动续期 | 控制台申请的证书默认开启;API 可用 autoRenew: false 关闭 |
| 续期时间 | CA 提供 ARI(ACME Renewal Information)窗口时按窗口;否则在证书有效期过去三分之二时;最晚为到期前 1 分钟。证书行显示「下次续期:…」 |
| 窗口变化 | 签发后按 CA 的建议间隔(1–24 小时,默认 6 小时;查询失败时 1 小时)重新查询 ARI;窗口提前到下次续期时间之前(例如 CA 将提前吊销证书)时,续期改到新窗口内的随机时间,写审计 certificate.renewal_rescheduled |
| 检查周期 | 后台任务每分钟检查到期的证书,每次最多 10 张,新申请与「立即续期」优先,其余按续期时间先后,同时签发 3 张;需要 ROLE=worker 或 ROLE=all 的控制台进程 |
| 续期域名 | HTTP-01 证书续期时去掉已没有网站使用的名称,只要至少还剩一个名称;使用该证书的网站的域名都会保留,网站仍被覆盖。签发成功后证书的域名列表随之更新。网站新增的域名见为 HTTPS 网站添加域名 |
| 生效 | 签发或续期成功后写审计 certificate.issued,为引用该证书的网站所在集群发布新版本(原因「已更新 {证书} 的证书配置」) |
| 失败 | 状态变为「签发失败」,证书行显示原因,保留当前证书;重试间隔为证书剩余有效期的十分之一(10 分钟到 12 小时),首次签发 1 小时后重试,见故障排查。因名称未解析到节点而失败(「有域名未解析到节点」)的 HTTP-01 证书,后台每 5 分钟重新解析,名称都解析到节点后立即重试 |
| 过期 | 续期失败直到证书过期时,状态显示「已过期」,证书行仍显示失败原因 |
| 手动 | 「⋯」中的「立即续期」把状态改为「等待签发」,在下一次检查时执行,写审计 certificate.renew |
| 中断 | 「签发中」超过 10 分钟视为中断,下一次检查重新执行;单次签发最长 8 分钟 |
「删除」在证书行与 DNS 凭据行末的「⋯」中,需要确认(「删除 {名称}?」)。
| 对象 | 规则 |
|---|---|
| 证书 | 被网站引用(第一张或其他证书)时返回「证书仍被网站使用:…」,被 L4 应用的 TLS 卸载引用时返回「证书仍被 L4 应用使用:…」(各列出最多 5 个);处于「签发中」时返回「证书正在处理中」。仍有 DNS-01 TXT 记录待清理时照常删除,不再清理这些记录:审计 certificate.delete 的 leftDnsRecords 列出记录,需在 DNS 服务商处手动删除 |
| DNS 凭据 | 被任一证书引用时返回「DNS 凭据仍被证书使用:…」(最多 5 张) |
网站没有证书,或第一张证书是未签发、已过期的上传证书时,「HTTPS」页签只显示「HTTPS 未启用」卡片。
- 打开 网站,选择网站,进入「HTTPS」页签。
- 控制台先检查能否签发,有阻碍时逐条列出且「启用 HTTPS」不可用;修正后点击「重新检查」。
- 需要时点击「自定义」,修改「证书颁发机构」「账户邮箱」或打开「跳过解析检查」。
- 点击「启用 HTTPS」。
- 验证:卡片标题变为「正在申请证书」;签发后切换为 HTTPS 设置,「证书」为新证书。「强制 HTTPS」保持关闭,需要时在 HTTPS 设置中打开。
| 项目 | 取值 |
|---|---|
| 证书名称、域名 | 网站名称(前 100 字符);网站的精确与泛域名,后缀域名 .a.com 申请 *.a.com,正则域名不申请(后缀与正则域名的限制) |
| 验证方式 | HTTP-01;网站有泛域名或后缀域名时用 DNS-01,凭据为按名称排序后第一个区域覆盖全部域名的 DNS 凭据 |
| 账户邮箱 | 最近注册的 ACME 账户的邮箱,否则最近一次申请的邮箱,否则控制台账户的邮箱;可在「自定义」中修改 |
| 证书颁发机构 | 与「申请证书」的默认值相同;可在「自定义」中改选(ZeroSSL、Google Trust Services 需要填写 EAB,未填时按钮不可用) |
| 密钥类型 | ECDSA P-256 |
| 自动续期 | 开 |
| 签发后 | 证书绑定到网站(「强制 HTTPS」等其他设置不变),发布网站所在集群,写审计 site.https_update(操作者 system);申请后网站新增的域名随即重新签发。网站此时已有其他可用证书时不改动 |
| 检查提示 | 原因 |
|---|---|
| 「集群 … 没有在线节点」 | HTTP-01:网站所在集群没有在线的活动节点 |
| 「以下节点需要升级才能应答 HTTP-01:…」 | HTTP-01:在线节点缺少 http01-v1 |
| 「… 还没有解析记录」「… 未解析到节点」 | HTTP-01:名称没有 A/AAAA 记录,或解析到不属于该集群节点的地址;解析超时或节点没有已知地址时不提示。控制台看到的解析与 CA 不同(内外网分离解析、前面另有代理)时,在「自定义」中打开「跳过解析检查」,这两条不再阻止申请,签发前也不再检查 |
| 「泛域名需要区域覆盖 … 的 DNS 凭据」 | DNS-01:没有这样的 DNS 凭据;提示旁的「添加 DNS 凭据」打开添加对话框 |
| 「DNS 凭据 …:…」 | DNS-01:凭据的连接测试失败 |
| 「网站只有正则域名,没有可签发的名称」 | 网站的域名全部是正则域名 |
| 「… 的 CAA 记录不允许 … 签发」 | 名称或其上级域名的 CAA 记录不允许所选 CA(签发者见证书颁发机构),含 issuewild 与 validationmethods;自定义目录没有 meta.caaIdentities 时不检查 |
检查结果缓存 30 秒。签发中页签每 3 秒刷新状态。签发失败时显示分类后的原因(与证书行相同),可「重试」或「取消」(确认「删除 {名称}?」后删除这张证书)。已有覆盖网站全部域名的可用证书时,页签显示「已有证书」,点击「使用」直接选用。网站使用的 ACME 证书正在签发或签发失败时,HTTPS 设置上方显示同样的状态与「重试」。
-
打开 网站,选择网站,进入「HTTPS」页签(网站还没有证书时见一键启用 HTTPS)。
-
在「证书」中选择证书。列表包含全部已签发、未过期且节点能加载的证书,以及网站已选用的证书;「仅 HTTP」表示不启用 HTTPS。需要更多证书时点击「添加证书」,见多张证书。
-
设置「最低 TLS 版本」「密码套件」「HSTS 有效期(秒)」和各开关。
-
点击「保存」。控制台提示「已保存」,为网站所在集群发布新的配置版本(原因「已更新 {网站} 的证书配置」),写审计
site.https_update。 -
验证:节点应用该版本后:
curl -sI --resolve www.example.com:443:<节点 IP> https://www.example.com/
返回
HTTP/2 200(开启 HTTP/2 时);开启 HSTS 时含strict-transport-security;开启 HTTP/3 时含alt-svc: h3=":443"; ma=86400。
节点报告已应用该版本,才表示配置在该节点生效。保存前表单先校验,字段不合法时提示「检查「{字段}」」。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 证书 | 可用的证书 / 仅 HTTP | 仅 HTTP | 网站的第一张证书。网站的每个域名都须被网站的某一张证书覆盖;网站的泛域名 *.example.com 要求证书含相同的 *.example.com。之后为网站添加的域名见为 HTTPS 网站添加域名 |
| 证书 2–4 | 可用的证书 | 无 | 「添加证书」加入的其他证书,不能重复,见多张证书 |
| 最低 TLS 版本 | TLS 1.2 / TLS 1.3 | TLS 1.2 | 握手接受的最低版本 |
| 密码套件 | 现代 / 兼容 | 现代 | TLS 1.2 密码套件档位,见下表 |
| HSTS 有效期(秒) | 0–63072000 | 0 | 大于 0 时在 HTTPS 响应中发送 Strict-Transport-Security;没有证书时不可编辑 |
| 强制 HTTPS | 开 / 关 | 关 | HTTP 请求跳转到 https://<Host><请求 URI>,状态码与端口见HTTPS 跳转选项;没有证书时不可用;ACME 挑战路径不跳转 |
| HTTP/2 | 开 / 关 | 开 | 该网站的 HTTPS 连接协商 HTTP/2 |
| HTTP/3 | 开 / 关 | 关 | 在网站 HTTPS 端口的同号 UDP 端口提供 QUIC,并发送 Alt-Svc: h3=":<端口>"; ma=86400;开启客户端证书时不可用 |
| HSTS 包含子域名 | 开 / 关 | 关 | HSTS 附加 includeSubDomains |
| HSTS 预加载 | 开 / 关 | 关 | HSTS 附加 preload |
| OCSP 装订 | 开 / 关 | 关 | 在握手中附带 OCSP 响应,见 OCSP 装订 |
| 客户端证书 | 关闭 / 可选 / 必须 | 关闭 | 见客户端证书 |
选择「仅 HTTP」时,「强制 HTTPS」关闭、HSTS 有效期归零,其他证书与客户端证书一并去掉,跳转端口恢复为 443。
| 密码套件 | TLS 1.2 套件 |
|---|---|
| 现代 | ECDHE-ECDSA-AES128-GCM-SHA256、ECDHE-RSA-AES128-GCM-SHA256、ECDHE-ECDSA-CHACHA20-POLY1305、ECDHE-RSA-CHACHA20-POLY1305 |
| 兼容 | 现代档位加 ECDHE-ECDSA-AES256-GCM-SHA384、ECDHE-RSA-AES256-GCM-SHA384 |
| 保存时校验 | 错误 |
|---|---|
| 每张证书已签发、未过期 | 「证书尚未签发或已过期」 |
| 每张证书节点能加载 | 「EC 私钥使用显式曲线参数,请转换为命名曲线」「证书的 EC 公钥使用显式曲线参数,请用命名曲线私钥重新签发」 |
| 网站每个域名被某一张证书覆盖(第一张 ACME 证书正在为新域名重新签发时,这些域名除外) | 「证书域名与网站或 DNS 区域不匹配:…」 |
| 客户端证书不与 HTTP/3 同时开启 | 「客户端证书与 HTTP/3 不能同时开启」 |
| 客户端 CA 有效 | 「客户端 CA 须为 1–10 张当前有效的 CA 证书(PEM)」 |
| 跳转端口为 443 或网站的 HTTPS 端口 | 「跳转端口 {port} 不是网站的 HTTPS 端口」 |
| 不跳转的域名是网站的精确或泛域名 | 「网站没有这些域名:…」 |
| 去掉证书后网站仍有可用端口 | 「网站至少需要一个可用端口」 |
打开「强制 HTTPS」后,开关下方出现跳转选项:
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 跳转状态码 | 301、302、303、307、308 | 301 | 跳转响应的状态码 |
| 跳转端口 | 443 或网站绑定的 HTTPS 端口 | 443 | 跳转目标 URL 的端口;443 时 URL 不带端口 |
| 不跳转的域名 | 网站的精确与泛域名,最多 50 个 | 无 | 这些域名不因「强制 HTTPS」跳转;泛域名写作 *.example.com,网站同时有的精确域名不受它影响。网站的精确与泛域名多于一个时才显示。后缀与正则域名匹配的主机名在证书不覆盖时本来就不跳转 |
配置规则的 forceHttps 照旧按请求打开或关闭跳转:规则打开时也使用这里的状态码与端口,不跳转的域名同样跳转。网站去掉跳转端口所在的 HTTPS 端口时,保存被拒绝;删除网站的域名时它也从不跳转的域名中去掉。用到非默认值的配置需要 edge-ports-v1;集群有活动节点缺少它时这三项不可用,显示「集群中有节点不支持」。
验证:
curl -sI -H 'Host: www.example.com' http://<节点 IP>:8081/a返回所选状态码,location: https://www.example.com:9443/a(跳转端口为 9443 时)。
一个网站最多 4 张证书:「证书」为第一张,「添加证书」加入其余 3 张(「证书 2」…「证书 4」),每张旁的「移除证书」按钮去掉它。网站选择了第一张证书且还有未选用的可用证书时才显示「添加证书」。
| 项目 | 行为 |
|---|---|
| 覆盖 | 每个域名至少被其中一张证书覆盖,不要求每张都覆盖全部域名;否则保存被拒绝,列出未覆盖的域名(「证书域名与网站或 DNS 区域不匹配:…」)。例如 a.example.com 与 b.example.com 各用一张证书 |
| 握手选证书 | 每次握手只出示一张:在覆盖 SNI 的证书中只考虑客户端能用的密钥类型(ECDSA 要求签名算法含该证书曲线的方案,且使用 TLS 1.3 或提供档位内的 ECDHE-ECDSA-* 套件;都不能用时考虑全部),其中精确名称优先于泛域名,再优先 ECDSA,最后按网站中的顺序;没有证书覆盖 SNI 时用第一张 |
| ECDSA 与 RSA | 同一组名称各有一张 ECDSA 与 RSA 证书时,现代客户端得到 ECDSA,只支持 RSA 的旧客户端得到 RSA |
| OCSP 装订 | 按所选证书装订其自己的 OCSP 响应 |
| 添加域名 | 新域名只扩展第一张证书(控制台申请且自动续期时),见为 HTTPS 网站添加域名 |
| 删除证书 | 网站的任一证书都算被使用,删除返回「证书仍被网站使用:…」 |
| 节点能力 | 多于一张证书需要 multi-certificate-v1;集群有活动节点缺少它时「添加证书」不可用,显示「集群中有节点不支持」 |
验证(节点应用该版本后):
openssl s_client -connect <节点 IP>:443 -servername a.example.com </dev/null 2>/dev/null | grep -E 'subject=|Server public key'
openssl s_client -connect <节点 IP>:443 -servername a.example.com -tls1_2 -cipher ECDHE-RSA-AES128-GCM-SHA256 -sigalgs 'rsa_pss_rsae_sha256:RSA+SHA256' </dev/null 2>/dev/null | grep 'Server public key'第一条显示覆盖 a.example.com 的证书(ECDSA 为 256 bit),第二条模拟只支持 RSA 的客户端,显示 2048 bit。
「HTTPS」页签的「客户端证书」要求访客在握手中出示网站信任的 CA 签发的证书(双向 TLS),例如只给内部系统或合作方访问的网站。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 客户端证书 | 关闭 / 可选 / 必须 | 关闭 | 可选:握手时请求证书,没有或无法验证时照常处理请求,结果可在规则中使用;必须:没有通过验证的证书时返回 403。网站没有证书、开启了 HTTP/3 或节点不支持时不可选 |
| 校验深度 | 1–5 | 2 | 客户端证书链的最大深度 |
| CA 证书(PEM) | 1–10 张当前有效的 CA 证书(CA:TRUE),最大 64 KiB;密钥要求与上传的叶证书相同,EC 须为命名曲线 |
无 | 签发客户端证书的 CA;只保存重新编码的证书 |
| 向源站传递证书信息 | 开 / 关 | 关 | 向源站发送下表的请求头 |
「校验深度」「CA 证书(PEM)」「向源站传递证书信息」在选择「可选」或「必须」后显示。
| 项目 | 行为 |
|---|---|
| 「必须」 | 没有证书、证书不是该 CA 签发或已过期时返回 403 错误页,X-Edgeweir-Error: client-cert-required,在网站其他逻辑之前。握手本身不中止,浏览器能看到错误页 |
| 明文 HTTP | 「必须」的网站经 HTTP 到达的请求:开启「强制 HTTPS」时照常跳转,否则返回同样的 403;HTTP-01 挑战照常应答 |
| 请求头 | X-Client-Verify(SUCCESS、FAILED 或 NONE)总是发送;X-Client-Cert-SHA256(DER 的 SHA-256,小写十六进制)、X-Client-Cert-Subject(RFC 2253 格式的主体)与 X-Client-Cert-Serial(大写十六进制序列号)只在证书通过验证时发送 |
| 访客自带的头 | 所有网站都删除访客请求中的这四个头,源站收到的值只来自节点 |
| 规则字段 | tls.client.verified(布尔)、tls.client.cert_sha256、tls.client.subject(字符串),未通过验证时为 false 与空字符串,见规则字段 |
| 会话复用 | 复用的会话保留首次握手的验证结果 |
| HTTP/3 | 与 HTTP/3 不能同时开启:开启客户端证书后 HTTP/3 开关不可用;HTTP/3 已开启时显示「客户端证书与 HTTP/3 不能同时开启」 |
| 节点能力 | client-cert-v1;集群有活动节点缺少它时不可选,显示「集群中有节点不支持」 |
验证:
curl -s -o /dev/null -w '%{http_code}\n' --resolve m.example.com:443:<节点 IP> https://m.example.com/
curl -s --cert client.pem --key client.key --resolve m.example.com:443:<节点 IP> https://m.example.com/「必须」时第一条返回 403,第二条返回源站内容;开启传递时源站收到 X-Client-Verify: SUCCESS。
在网站的「域名」页签保存新的域名时:
| 网站的证书 | 行为 |
|---|---|
网站的某一张证书已覆盖新域名(含上一级的泛域名 *.example.com) |
直接保存 |
| 第一张证书是控制台申请且开启自动续期的证书 | 保存,证书的域名列表加入新域名并立即重新签发(提示「证书 {name} 正在为新域名重新签发」,写审计 certificate.names_extended)。签发完成前新域名先走 HTTP:不接受 TLS 握手、不跳转 HTTPS、没有 HSTS,其他域名照常使用当前证书;新证书签发后新域名改为 HTTPS。集群有活动节点缺少 tls-pending-domains-v1 时,新域名在新证书签发后才生效。HTTP-01 挑战在此期间照常应答。证书正在签发时,本次签发结束后立即再签发一次 |
| 上传的证书,或未开启自动续期的证书 | 拒绝,返回「证书域名与网站或 DNS 区域不匹配:…」,列出未覆盖的域名 |
HTTP-01 证书不能扩展到泛域名,DNS-01 证书只能扩展到其 DNS 凭据区域内的名称;一张证书最多 100 个名称。. 后缀与正则域名不扩展证书:节点只为证书覆盖的主机名(同名或上一级 *.)完成握手,其余主机名中止握手,见后缀与正则域名的限制。
| 项目 | 行为 |
|---|---|
| 会话缓存 | 每个节点 16 MiB 共享内存(约 6.4 万个会话),会话有效 1 小时;TLS 1.2 的会话 ID 只在同一节点复用 |
| 会话票据 | TLS 1.2 与 TLS 1.3 的票据用集群共享的密钥加密,同一集群的节点都能复用;每个集群 3 把密钥,角色每 12 小时轮换(发布原因「轮换 TLS 会话票据密钥」,审计 cluster.session_ticket_keys_rotate),节点用当前密钥加密、用 3 把密钥解密,票据在 1 小时会话有效期内可复用 |
| 网站隔离 | 会话只在创建它的网站复用:带着 A 网站的会话以 B 网站的 SNI 连接时完整握手 |
| 0-RTT | 不接受 TLS 1.3 early data:票据不允许 early data,节点配置显式关闭 |
| 票据密钥 | 集群配置第一次带有证书网站时由控制台生成,信封加密保存;节点经 mTLS 获取后写入状态目录(0600);旧节点忽略它们,不复用会话。界面不显示票据密钥 |
验证:
openssl s_client -connect <节点 IP>:443 -servername www.example.com -sess_out sess.pem </dev/null
openssl s_client -connect <节点 IP>:443 -servername www.example.com -sess_in sess.pem </dev/null | grep -E '^(New|Reused)'第二条输出 Reused, TLSv1.3(加 -tls1_2 时为 TLSv1.2)。
| 项目 | 行为 |
|---|---|
| 响应校验 | 只接受签名、证书身份和有效期都通过验证且状态为 good 的响应;签发者证书须在证书链中 |
| 出站限制 | 拒绝私网等特殊用途地址和跳转;连接 5 秒、单次请求 8 秒,响应最大 1 MiB |
| 刷新 | 每 5 分钟及每次应用配置时检查,剩余有效期少于 1 小时时刷新 |
| 无 OCSP 地址 | 证书没有 OCSP 服务地址时不装订 |
网站「缓存」页签的「压缩」卡片中,Zstandard、Brotli、Gzip 各有一组设置,单独保存(不影响「HTTPS」页签未保存的修改):
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 开启 | 开 / 关 | Gzip 开,Brotli、Zstandard 关 | 按该算法压缩响应 |
| 压缩级别 | Brotli 1–11,Zstandard 1–19,Gzip 1–9 | Brotli 6,Zstandard 3,Gzip 空(占位文字「默认」,节点默认 1) | 级别越高压缩率越高、CPU 开销越大;Gzip 级别不是默认值时需要节点能力 site-content-v1 |
| 最小压缩大小(字节) | 1–1048576 | 256 | 小于该长度的响应不压缩 |
| 压缩内容类型 | MIME 类型,逗号或空格分隔,最多 32 个 | text/html、text/plain、text/css、application/javascript、application/json、image/svg+xml |
压缩的响应类型;text/html 始终压缩 |
| 最大压缩长度(字节) | 不小于 0,三种算法共用 | 空(占位文字「不限」) | Content-Length 超过该值的响应不压缩;长度未知(分块)的响应照常压缩。需要 site-content-v1 |
| 行为 | 说明 |
|---|---|
| 生效 | 保存经 PUT /sites/{id}/https 写入,发布网站所在集群(原因「已更新 {网站} 的证书配置」);没有证书的网站同样压缩 |
| 协商 | 按请求 Accept-Encoding 的 q 值选择一种已开启的算法;q 值相同时顺序为 zstd > br > gzip,q=0 表示不接受。每个响应只由一种算法压缩 |
Vary |
压缩的响应带 Vary: Accept-Encoding |
| 不重复压缩 | 响应已有 Content-Encoding(如源站已压缩)时原样返回 |
| 缓存 | 缓存保存未压缩或源站原样的内容,每次响应时按请求压缩;缓存命中后编码同样按请求协商 |
| 规则 | 覆盖设置可按请求关闭或重新允许某种算法,压缩规则可限定本次响应的算法与 q 值相同时的顺序;只在已开启的算法中选择,不绕过缓存,见覆盖设置 |
| 能力 | 开启 Brotli 需要集群全部活动节点支持 brotli-v1,Zstandard 需要 zstd-v1。有节点不支持时开关不可用,并显示「集群中有节点不支持」;已开启的算法仍可关闭 |
验证(节点应用该版本后):
curl -s -o /dev/null -D - -H 'Accept-Encoding: zstd' --resolve www.example.com:443:<节点 IP> https://www.example.com/
curl -s -o /dev/null -D - -H 'Accept-Encoding: br' --resolve www.example.com:443:<节点 IP> https://www.example.com/分别返回 content-encoding: zstd 与 content-encoding: br,并带 vary: Accept-Encoding。
| 端口 | 协议 | 条件 |
|---|---|---|
| 80/TCP | HTTP、HTTP-01 挑战 | 始终监听;HTTP-01 挑战始终在 80 应答,与网站选择的端口无关 |
| 443/TCP | HTTPS(HTTP/1.1、HTTP/2) | 集群中有选择了证书的已启用网站绑定 443 |
| 集群的附加 HTTP 端口 | HTTP | 始终监听,见集群的监听端口 |
| 集群的附加 HTTPS 端口 | HTTPS(HTTP/1.1、HTTP/2) | 始终监听 |
| HTTPS 端口的同号 UDP | HTTP/3(QUIC) | 该端口上有开启 HTTP/3 的网站 |
HTTPS 请求的 SNI 必须与 Host 一致,否则返回 421(X-Edgeweir-Error: sni-host-mismatch;交给默认网站的请求除外)。Alt-Svc 的端口取请求的 Host 中的端口(没有端口时为 443)。增删端口是结构性变更:节点重新渲染 nginx.conf 并 reload,已有连接由旧 worker 继续服务。
- 打开 集群与节点,选择集群,切换到「设置」页签(
/clusters?tab=network)。 - 在「监听端口」卡片的「附加 HTTP 端口」「附加 HTTPS 端口」中填写端口,逗号或空格分隔;80 与 443 显示为「始终监听」。
- 点击「保存」。控制台提示「已保存」,并发布新的配置版本(原因「修改监听端口」)。
- 在节点主机的防火墙与云安全组中放行这些端口(HTTPS 端口有 HTTP/3 网站时同时放行 UDP),见端口与防火墙。
| 项目 | 规则 |
|---|---|
| 端口 | 1–65535,不含 80、443;附加 HTTP、附加 HTTPS 端口各最多 16 个,去重排序;表单不合法时提示「端口须为 1–65535,不含 80、443,每类最多 16 个」;同一端口不能同时是 HTTP 和 HTTPS(「端口 {port} 不能同时用于 HTTP 和 HTTPS」) |
| 端口池 | 不能落在集群的 L4 端口池内(「端口 {port} 在端口池内:…」);端口池也不能包含监听端口 |
| 移除 | 仍有网站绑定的端口不能移除(「端口 {port} 仍被网站使用:…」) |
| 未变化 | 端口与当前相同时不发布、不写审计 |
| 审计 | cluster.listen_ports_update,元数据为修改前后的端口与版本号 |
| 节点能力 | 有附加端口的配置需要 edge-ports-v1;集群有活动节点缺少它时卡片显示「集群中有节点不支持」,只能移除端口 |
网站「域名」页签的「端口」卡片选择网站在哪些端口提供服务:「HTTP」为 80 与集群的附加 HTTP 端口,「HTTPS」为 443 与集群的附加 HTTPS 端口。默认 80 与 443。点击「保存」后发布网站所在集群。
| 项目 | 规则 |
|---|---|
| 至少一个 | 网站至少要在一个可用端口上提供服务(表单提示「至少选择一个端口」,API 返回「网站至少需要一个可用端口」);没有证书时 HTTPS 端口不算可用 |
| HTTPS 端口 | 需要证书:没有证书时只能保留默认的 443,卡片显示「HTTPS 端口需要证书」(API 返回「HTTPS 端口 {port} 需要证书」);去掉证书时网站必须还有 HTTP 端口 |
| 集群端口 | 只能选择集群的监听端口(「端口 {port} 不是集群的监听端口」) |
| 跳转端口 | 去掉「HTTPS 跳转选项」的跳转端口被拒绝(「跳转端口 {port} 不是网站的 HTTPS 端口」) |
| 未绑定的端口 | 请求到达网站未绑定的端口时按未知域名处理:默认 HTTP 返回 404 平台页(X-Edgeweir-Error: unknown-host),HTTPS 中止 TLS 握手 |
| ACME | HTTP-01 挑战始终在 80 应答;源站自己的 HTTP-01 token 在 80 仍转给源站 |
| 缓存 | 缓存键不含端口:同一网站各端口共用缓存对象 |
| 节点能力 | 绑定非默认端口需要 edge-ports-v1;集群有活动节点缺少它时 80、443 以外未选中的端口不可选,显示「集群中有节点不支持」。网站保持默认端口时配置与之前逐字节相同,不需要 edge-ports-v1 |
让源站只接受边缘节点的连接:节点回源时出示控制台签发的客户端证书(源站验证它),源站使用控制台的 Origin CA 签发的证书(只有节点信任它)。两者可以单独或一起使用,在 证书 页的「源站证书」与「回源客户端」页签管理,在网站「源站」页签的「源站池设置」中开启(「回源 TLS」下的「校验源站证书」「信任」「出示客户端证书」,见源站与缓存)。
「源站证书」页签:没有 Origin CA 时显示「还没有 Origin CA」与「创建 Origin CA」;创建后页面操作为「签发证书」。Origin CA 只用于回源:浏览器和其他客户端不信任它,它签发的证书也不能作为网站证书上传(「Origin CA 签发的证书只能用于源站」)。
| 项目 | 说明 |
|---|---|
| Origin CA | ECDSA P-256,有效期 20 年,私钥信封加密保存在控制台;与节点通道的 CA、回源客户端 CA 各自独立。卡片显示「有效期至 …」、「CA 指纹」与「下载 CA 证书」 |
| 主机名 | 1–50 个,每行一个:域名、*. 泛域名或 IP 地址,重复的只保留一个;须覆盖节点回源时校验的名称(源站的「SNI」,没有时为「回源 Host」或地址) |
| 有效期 | 1、3、5、10、15 年,默认 15 年;不超过 Origin CA 的到期时间 |
| 密钥类型 | ECDSA P-256(默认)或 RSA 2048 |
| CSR(可选) | 提交 CSR 时私钥留在源站,控制台只取它的公钥(RSA 2048–4096 或 ECDSA P-256 / P-384,最大 16 KiB),主机名以表单为准;签名无效或密钥不支持时报错 |
| 私钥 | 控制台生成的私钥只在「证书已签发」对话框中显示一次(「私钥只显示一次」),可「下载私钥」,不保存 |
| 下载 | 证书行的「下载证书」与页签的「下载 CA 证书」都为 PEM;源站只需配置自己的证书与私钥 |
| 吊销 | 「吊销」需要确认(「吊销 {name} 的证书?」);控制台重新签发吊销列表(CRL)并随配置下发,信任 Origin CA 的集群立即发布新配置(原因「吊销源站证书」);节点随后拒绝该证书,主动健康检查同样拒绝。证书标为「已吊销」;吊销不能撤销,回滚配置也保留吊销 |
审计:origin_ca.create、origin_certificate.issue、origin_certificate.revoke。
在源站使用签发的证书,例如 nginx:
ssl_certificate /etc/nginx/origin.pem;
ssl_certificate_key /etc/nginx/origin.key;然后把网站「源站池设置」的「信任」改为「Origin CA」(需要开启「校验源站证书」)。此后该网站只接受 Origin CA 签发且未吊销的源站证书,公共 CA 签发的证书一律拒绝;S3 源站使用公共证书,不能与它一起用(「S3 源站不能用 Origin CA 校验」)。
「回源客户端」页签:没有回源客户端 CA 时显示「还没有回源客户端 CA」与「创建回源客户端 CA」。创建后点击「下载 CA 证书」并配置到源站,例如 nginx:
ssl_client_certificate /etc/nginx/origin-client-ca.pem;
ssl_verify_client on;然后打开网站「源站池设置」的「出示客户端证书」。
| 项目 | 说明 |
|---|---|
| 回源客户端 CA | ECDSA P-256,有效期 10 年,私钥信封加密 |
| 集群证书 | 「集群证书」卡片列出每个集群一张,CN 为集群 ID,O=Edgeweir Origin Client,只用于 TLS 客户端认证,有效期 90 天;第一个开启的网站保存时签发,剩余不足 30 天时由每小时运行的后台任务更换;还没有网站开启时显示「还没有网站出示客户端证书」 |
| 更换 | 新证书随新配置下发(原因「更换回源客户端证书」);旧证书到期前仍然有效,已建立的连接不中断 |
| 出示范围 | 该网站的 HTTPS 源站,HTTP/1.1、HTTP/2 与 gRPC 回源都出示,主动健康检查同样出示;S3 源站不出示 |
| 私钥 | 只经节点通道(mTLS)下发,节点上的私钥文件权限为 0600 |
| 连接复用 | 出示证书与不出示证书的请求、信任方式不同的请求不复用同一条回源连接 |
源站可以按客户端证书的 CN(集群 ID)进一步限制,例如 nginx 的 $ssl_client_s_dn。
两个 CA 都可以换成新的,换的过程中新旧 CA 并存,已有的连接与证书不中断。新 CA 的名称带代数(如 Edgeweir Origin CA G2),私钥同样信封加密;每一步都需要确认并写审计日志。
Origin CA(「源站证书」页签):
- 「轮换 CA」(确认「开始轮换 Origin CA?」):新 CA 立即开始签发源站证书;信任 Origin CA 的集群发布新配置(原因「开始轮换 Origin CA」),节点同时信任新旧 CA,各自按自己的 CRL 检查吊销。这些集群里所有活动节点都要支持
origin-ca-rotation-v1,否则拒绝(「节点尚不支持:Origin CA 轮换(…)」)。审计origin_ca.rotation_start。 - 用新 CA 给各源站重新签发证书并部署。「旧 Origin CA」卡片显示它签发、仍然有效的证书数(「N 张有效证书」);列表中旧 CA 签发的证书标为「旧 CA」。重叠期内仍可吊销旧 CA 的证书。
- 「退役旧 CA」(确认「退役旧 Origin CA?」,并提示「节点不再信任旧 CA 签发的 N 张有效证书」):删除旧 CA 与它的私钥,集群发布新配置(原因「退役旧 Origin CA」),节点不再信任旧 CA 签发的证书(列表中标为「CA 已退役」)。审计
origin_ca.retire。
新 CA 还没有签发仍有效的证书时可以「取消轮换」(确认「取消轮换并删除新 CA?」):删除新 CA,旧 CA 恢复签发,集群发布新配置(原因「取消轮换 Origin CA」),审计 origin_ca.rotation_cancel。轮换期间回滚配置使用当前的两个 CA,退役后回滚也不会再信任旧 CA。
回源客户端 CA(「回源客户端」页签):
- 「轮换 CA」(确认「开始轮换回源客户端 CA?」):生成「新回源客户端 CA」,但还不用它签发。点击「下载信任包」(新旧两张 CA 证书)替换源站上的
ssl_client_certificate。审计origin_client_ca.rotation_start。 - 「启用新 CA」(确认「启用新回源客户端 CA?」):各集群改为出示新 CA 签发的证书并发布新配置(原因「更换回源客户端证书」);旧证书到期前仍然有效。没能换上的集群在「旧回源客户端 CA」卡片上列出(「仍出示旧证书:…」),每小时重试。审计
origin_client_ca.activate。 - 「退役旧 CA」(确认「退役旧回源客户端 CA?」):所有集群都换上新证书后才能退役;之后源站只需信任新 CA,可以再下载一次信任包。审计
origin_client_ca.retire。
启用前可以「取消轮换」,审计 origin_client_ca.rotation_cancel。
| 错误 | 原因 |
|---|---|
| 「请先创建 Origin CA(证书 → 源站证书)」 | 网站选择信任 Origin CA,或签发证书时,Origin CA 还没有创建 |
| 「请先创建回源客户端 CA(证书 → 回源客户端)」 | 网站开启出示客户端证书时,回源客户端 CA 还没有创建 |
| 「信任 Origin CA 需要先开启校验源站证书」 | 关闭校验时不能选择信任 |
| 「已经在轮换」 | 上一次轮换还没有退役旧 CA 或取消 |
| 「轮换的当前阶段不能执行这一步」 | 例如没有新 CA 时启用,或没有旧 CA 时退役 |
| 「这些集群仍在出示旧 CA 签发的证书:…」 | 退役旧回源客户端 CA 时,还有集群没换上新证书 |
| 「新 CA 已签发 N 张有效证书,不能取消」 | 取消 Origin CA 轮换时新 CA 签发的证书还有效;先吊销它们,或继续轮换 |
| 「CSR 无法读取、签名无效,或密钥不是 RSA 2048–4096、ECDSA P-256 / P-384」 | 签发时提交的 CSR 不可用 |
| 「证书已经吊销」 | 重复吊销 |
| 项目 | 行为 |
|---|---|
| 下发 | 节点通过 mTLS 单独获取证书材料;只有集群节点可能运行的配置版本(稳定版本、候选版本与最新版本)引用的证书 ID 与指纹获准下发 |
| 校验 | 节点检查指纹、私钥匹配和域名覆盖(等待新证书、先走 HTTP 的域名除外);节点 1.1.0 及以上跳过无法加载的证书并上报,见上传证书;更早的节点有一张证书无法加载时整个配置版本不应用,继续使用上一份配置,每次同步重试 |
| 存储 | 节点状态目录的 certificates.json(0600);节点上的私钥不加密,主机管理员可读取 |
| 热更新 | 证书内容与最低 TLS 版本变化不重载 nginx |
| 票据密钥 | 轮换时节点写入新密钥文件并重载 nginx |
| 重载 | HTTP/2、HTTP/3、压缩、密码套件、是否有证书、域名列表或网站集合变化时,先执行配置测试再重载;失败时恢复原配置 |
| 应用成功 | 配置持久化成功后才报告已应用;当前与上一份 last-known-good 配置引用的密钥都保留 |
| 回滚 | 配置回滚使用仍可用的当前证书材料;证书已删除、过期、节点无法加载或不覆盖目标域名时拒绝回滚 |
ACME 账户私钥、证书私钥、EAB HMAC 密钥(证书的与系统设置中自定义目录的)、DNS 凭据、TLS 会话票据密钥、Origin CA 与回源客户端 CA 的私钥(轮换产生的新 CA 也一样)以及集群回源客户端证书的私钥分别使用绑定记录 ID 的主密钥信封加密。证书助手 edgeweir-certd 由后台任务启动,凭据只经 stdin/stdout 传递,不出现在命令行、日志或节点配置中。
| 能力 | 需要的场景 |
|---|---|
tls-v1 |
集群有网站(网站的 HTTPS 与压缩设置总是下发) |
http01-v1 |
HTTP-01 验证 |
http3-v1 |
任一网站开启 HTTP/3 |
brotli-v1 |
任一网站开启 Brotli |
zstd-v1 |
任一网站开启 Zstandard |
site-content-v1 |
任一网站设置了 Gzip 级别或最大压缩长度(及其他内容设置) |
tls-pending-domains-v1 |
HTTPS 网站新增的域名在证书覆盖前先走 HTTP;缺少时这些域名在新证书签发前不生效,不阻止发布 |
edge-ports-v1 |
集群有附加监听端口、网站绑定了非默认端口,或 HTTPS 跳转用了非默认的状态码、端口或不跳转的域名 |
multi-certificate-v1 |
任一网站有多于一张证书 |
client-cert-v1 |
任一网站开启客户端证书,或规则用到 tls.client.* 字段 |
certificate-isolation-v1 |
不要求;有它的节点(1.1.0 及以上)跳过无法加载的证书并上报 |
origin-mtls-v1 |
任一网站回源时出示客户端证书 |
origin-ca-v1 |
任一网站信任 Origin CA |
origin-ca-rotation-v1 |
Origin CA 轮换期间任一网站信任 Origin CA |
在控制台或用 AccessKey 保存的改动,即使需要集群中部分活动节点缺少的能力也会发布;缺少能力的节点保留 last-known-good 配置,集群与节点 中显示「需要升级」,见节点升级。服务账号与后台任务发布的配置引入活动节点缺少的能力时被拒绝(NODE_CAPABILITY_REQUIRED),原配置不变。HTTP-01 申请与 Origin CA 轮换在节点缺少能力时直接拒绝。
路径相对 /api/v1,使用 AccessKey(x-api-key)认证;这些过程不对服务账号开放(403 SERVICE_ACCOUNT_FORBIDDEN),见 API 与端点。错误码见错误码。
| 过程 | 方法与路径 | 说明 |
|---|---|---|
certificates.list |
GET /certificates |
全部证书:id、name、names、source(upload / acme)、status(pending / issuing / ready / error)、fingerprint、notBefore、notAfter、autoRenew、renewAt、lastError(失败代码或空)、bindSiteId、nodeFailures |
certificates.settings |
GET /certificates/settings |
acmeDirectory(生效的自定义目录或 null)、acmeDirectoryEab、defaultCa(letsencrypt / custom) |
certificates.upload |
POST /certificates/upload |
{ name, chainPem, privateKeyPem };chainPem 32–131072 字符,privateKeyPem 32–32768 字符 |
certificates.request |
POST /certificates/request |
name、names、email、ca(letsencrypt / zerossl / google / custom,省略时为 defaultCa)、keyType(ec256 / rsa2048)、challenge(http01 / dns01)、dnsCredentialId(DNS-01 必填)、eabKid、eabHmacKey、autoRenew(默认 true)、skipDnsCheck(默认 false)、bindSiteId(签发后绑定到该网站,names 须覆盖网站全部域名,每个网站同时只有一个,409 CERTIFICATE_BUSY) |
certificates.renew |
POST /certificates/{id}/renew |
只用于 ACME 证书;上传的证书或「签发中」时 409 CERTIFICATE_BUSY |
certificates.delete |
DELETE /certificates/{id} |
409 CERTIFICATE_IN_USE、CERTIFICATE_IN_USE_BY_L4、CERTIFICATE_BUSY |
acmeAccounts.list |
GET /acme-accounts |
{ id, directoryUrl, ca, email, eabKid, createdAt, certificates } |
acmeAccounts.delete |
DELETE /acme-accounts/{id} |
409 ACME_ACCOUNT_IN_USE |
dnsCredentials.list |
GET /dns-credentials |
{ id, name, provider, zone },不返回凭据 |
dnsCredentials.create |
POST /dns-credentials |
{ name, provider, zone, credentials };API 保存前不测试,先调用 dnsCredentials.test |
dnsCredentials.update |
PUT /dns-credentials/{id} |
name 和 / 或 credentials(全部字段) |
dnsCredentials.delete |
DELETE /dns-credentials/{id} |
409 DNS_CREDENTIAL_IN_USE |
dnsCredentials.zones |
POST /dns-credentials/zones |
{ id } 或 { provider, credentials };返回最多 1000 个区域;服务商不能列出区域时 DNS_ZONES_UNSUPPORTED |
dnsCredentials.test |
POST /dns-credentials/test |
{ id } 或 { provider, credentials, zone };返回 { ok, records } |
https.get |
GET /sites/{id}/https |
网站的 HTTPS 与压缩设置 |
https.update |
PUT /sites/{id}/https |
settings 整体替换,缺省字段取默认值;先 GET 再修改。发布网站所在集群 |
https.check |
GET /sites/{id}/https/check |
查询参数 ca;返回一键启用 HTTPS 的 request、blockers 与覆盖全部域名的 certificates |
sites.update |
PATCH /sites/{id} |
ports:{ http, https },各最多 17 个,去重排序 |
sites.features |
GET /sites/{id}/features |
各功能在网站所在集群的可用性,含 edgePorts、multiCertificate、clientCertificate、brotli、zstd、siteContent |
clusters.listenPorts |
GET /clusters/{clusterId}/listen-ports |
httpPorts、httpsPorts(不含 80、443)、nodesWithout(缺少 edge-ports-v1 的活动节点) |
clusters.setListenPorts |
PUT /clusters/{clusterId}/listen-ports |
{ httpPorts, httpsPorts } 整体替换 |
originCa.get / originCa.create |
GET / POST /origin-ca |
Origin CA(authority、previous、previousCertificates);已存在时 create 原样返回 |
originCa.rotate / originCa.retire / originCa.cancel |
POST /origin-ca/rotation、POST /origin-ca/rotation/retire、DELETE /origin-ca/rotation |
轮换的三步 |
originCertificates.list / originCertificates.issue |
GET / POST /origin-certificates |
issue:hostnames、validityYears(1、3、5、10、15,默认 15)、keyType(ec256 / rsa2048)、csrPem;响应的 privateKeyPem 只返回一次(CSR 时为空) |
originCertificates.revoke |
POST /origin-certificates/{id}/revoke |
吊销 |
originClientCa.get / originClientCa.create |
GET / POST /origin-client-ca |
回源客户端 CA(authority、next、previous、trustBundlePem、certificates、pendingClusters) |
originClientCa.rotate / activate / retire / cancel |
POST /origin-client-ca/rotation、POST …/rotation/activate、POST …/rotation/retire、DELETE /origin-client-ca/rotation |
轮换的各步 |
settings.acmeDirectory / settings.setAcmeDirectory |
GET / PUT /settings/acme-directory |
自定义 ACME 目录,见系统设置 |
| 项目 | 说明 |
|---|---|
| 证书颁发机构 | 内置 Let's Encrypt、ZeroSSL 与 Google Trust Services;其他 CA 通过一个自定义 ACME 目录使用,见系统设置 |
| 证书数量 | 每个网站最多 4 张;一张 ACME 证书最多 100 个名称;ACME 密钥类型只有 ECDSA P-256 与 RSA 2048 |
| 客户端证书 | 不能与 HTTP/3 同时开启;不检查吊销(CRL、OCSP) |
| 会话复用 | TLS 1.2 会话用同一网站的另一个域名复用时返回 421(sni-host-mismatch),浏览器按主机名保存会话,不受影响;L4 应用的 TLS 卸载不复用会话 |
| 0-RTT | 不支持 TLS 1.3 early data |
| TLS 版本 | 不支持 TLS 1.0 和 1.1 |
| 密码套件 | 只有「现代」「兼容」两档,不能写入任意 nginx 配置 |
| 压缩 | Gzip、Brotli、Zstandard |
| 节点软件包 | 节点使用为 Edgeweir 构建的 OpenResty 1.31.1.1(edgeweir-openresty),含 HTTP/2、HTTP/3、Brotli 与 Zstandard,见接入节点 |
| 失败原因 | 证书行显示分类后的原因:CA 的问题类型(RFC 8555)、DNS 服务商错误或控制台一侧的原因;未知代码显示为「签发失败({代码})」。CA 或 DNS 服务商返回的原文不保存、不记录;控制台日志的 certificate operation failed 记录证书 ID、code 与控制台一侧的原因 |
| 现象 | 原因 | 处理 |
|---|---|---|
| 「证书链须包含 1–10 张可读取的 PEM 证书」 | 证书链为空、超过 10 张或内容损坏 | 重新导出 PEM 格式的证书链 |
| 「证书链只能包含证书,私钥请填到私钥栏」 | 证书链中有私钥或其他 PEM 块 | 证书链只保留 CERTIFICATE 块,私钥填到「私钥(PEM)」 |
| 「无法读取私钥;不支持加密的私钥」 | 私钥损坏或带口令 | openssl pkey -in key.pem -out plain.pem 去掉口令后上传 |
| 「私钥与证书不匹配」 | 私钥属于另一张证书 | 上传与叶证书配对的私钥 |
| 「EC 私钥使用显式曲线参数,请转换为命名曲线」 | 私钥写出了完整曲线参数而不是曲线名称,节点无法加载;保存网站 HTTPS 时出现表示所选证书是此前上传的这类证书。macOS 自带的 LibreSSL 用 openssl req -newkey ec 或 openssl genpkey 生成时默认如此 |
用 OpenSSL 3 转换后上传:openssl pkey -in key.pem -ec_param_enc named_curve -out key-named.pem(LibreSSL 不能转换);以后生成私钥时加 -pkeyopt ec_param_enc:named_curve |
| 「证书的 EC 公钥使用显式曲线参数,请用命名曲线私钥重新签发」 | 证书本身的公钥使用显式曲线参数,例如 LibreSSL 生成的自签名证书;保存网站 HTTPS 时出现表示所选证书是此前上传的这类证书 | 用转换后的私钥重新签发,或重新生成:openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve … |
| 证书状态「不可用」,原因「节点无法加载:证书的 EC 公钥使用显式曲线参数」或「节点无法加载:EC 私钥使用显式曲线参数」 | 此前上传的证书使用显式曲线参数 | 按上面两行转换或重新签发后上传,在使用它的网站中改选,再删除旧证书 |
| 证书行显示「… 无法加载此证书,已拒绝其 TLS 握手」,节点显示「N 张证书未加载」 | 节点无法加载该证书材料,且没有上一版可用 | 按上面几行检查证书;换用节点能加载的证书后发布的新版本即可应用 |
节点「应用失败」,原因含 invalid certificate material(如 x509: invalid ECDSA parameters、unknown elliptic curve) |
1.1.0 以前的节点遇到无法加载的证书,整个版本不应用 | 在证书列表中找到「不可用」的证书,按上面的行处理;或升级节点,见节点升级 |
| 「证书链顺序错误:叶证书在前,签发者依次在后」 | 中间证书排在叶证书前,或某张证书不是下一张签发的 | 按叶证书、中间证书的顺序重新组织 PEM |
| 「证书当前不在有效期内(… 至 …)」 | 证书未生效或已过期(时间为 UTC) | 核对服务器时间,或换用有效的证书 |
| 「证书没有 DNS 类型的 SAN」 | 证书只有 IP 地址或只有 CN | 换用含 DNS SAN 的证书 |
| 「不支持的密钥类型,请使用 RSA(2048 位及以上)或 ECDSA P-256、P-384、P-521」 | 叶证书的密钥节点无法加载(secp256k1、Brainpool、SM2 等曲线,Ed448、RSA-PSS、DSA,或公钥指数大于 2³¹−1 的 RSA),或者浏览器无法使用(P-224、Ed25519、ML-DSA、小于 2048 位的 RSA) | openssl x509 -in cert.pem -noout -text 的「Public Key Algorithm」一段显示密钥类型与位数;用 RSA 2048 位或 ECDSA P-256 私钥重新签发,例如 openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -out key.pem |
| 「Origin CA 签发的证书只能用于源站」 | 上传的证书由控制台的 Origin CA 签发 | 网站使用公共 CA 的证书或 ACME 证书 |
| 「证书尚未签发或已过期」 | 网站选择的证书还在等待签发,或已过期 | 等待签发完成,或续期后再选择 |
| 「以下名称未解析到节点:…」 | HTTP-01 名称没有解析记录,或解析到源站、其他代理等不属于该集群节点的地址 | 把名称解析到节点;节点前面另有负载均衡或解析在变更中时,打开「跳过解析检查」 |
| 「集群 … 没有在线节点应答 HTTP-01」 | 服务这些名称的集群没有在线的活动节点 | 检查节点状态,或改用 DNS-01 |
| 「节点尚不支持:HTTP-01 验证(…)」 | 列出的在线节点缺少 http01-v1 |
升级这些节点,见节点升级 |
| 「证书域名与网站或 DNS 区域不匹配:…」 | 列出的名称:HTTP-01 申请的名称不是任何网站的精确域名;DNS 凭据的区域不覆盖;所选证书不覆盖网站的这些域名;为网站添加的域名不在上传的证书中,或 HTTP-01 证书无法签发的泛域名、DNS-01 证书凭据区域外的域名 | 先把域名加入网站,或改用 DNS-01;改用匹配的 DNS 凭据或证书 |
| 证书状态「签发失败」 | 证书行上的原因,见下面几行 | 修正后点击「立即续期」;否则按重试间隔自动重试 |
| 「CA 未通过域名验证」「CA 收到的挑战应答不正确」「CA 无法连接到该域名」 | HTTP-01:域名未解析到节点、80 端口不通,或前面还有其他代理;DNS-01:TXT 记录写到了别的区域 | 核对 DNS 解析与 80 端口 |
| 「CA 无法解析该域名」 | 域名没有解析记录,或权威 DNS 不可用 | 添加解析记录 |
| 「CAA 记录不允许该 CA 签发」 | 域名的 CAA 记录未列出所选 CA | 在 CAA 中加入该 CA 的签发者(见证书颁发机构),或删除 CAA |
| 「触发 CA 频率限制」 | 同一域名或账户短时间内申请过多 | 等待 CA 的限制窗口结束 |
| 「CA 要求 EAB 凭据」 | ZeroSSL、Google Trust Services 或自定义目录需要 EAB | 填写 EAB 密钥 ID 与 HMAC 密钥后重新申请;自定义目录可在系统设置中保存 |
| 「CA 账户需要处理(如接受新条款)」「ACME 账户在 CA 已不存在」 | CA 一侧的账户状态 | 在「ACME 账户」卡片删除不再使用的账户后重新申请,或按 CA 的要求处理 |
| 「无法连接 CA」「无法读取 ACME 目录」 | 控制台无法访问 CA 的 ACME 目录(出站网络、代理、自定义目录的 TLS 证书) | 检查运行后台任务的控制台进程的出站网络;自定义目录见下面「该地址没有返回 ACME 目录」 |
| 「TXT 记录 3 分钟内未生效」 | DNS 服务商同步慢,或凭据区域不是域名的权威区域 | 稍后重试;核对凭据区域 |
| 「服务商认证失败」等 DNS 服务商原因 | DNS-01 写入 TXT 时服务商返回错误 | 编辑 DNS 凭据,重新填写凭据后会立即重试 |
| 「没有能应答 HTTP-01(http01-v1)的在线节点」「节点未在 40 秒内应用挑战」 | 服务该域名的集群没有在线节点、节点缺少 http01-v1 或应用配置过慢 |
检查集群节点状态,必要时升级节点 |
| 「有域名不属于任何网站」 | 证书的名称都已不是网站的域名 | 把域名加入网站,或改用 DNS-01 |
| 「有域名未解析到节点」 | 签发前的解析检查发现名称未解析到集群的节点,没有联系 CA | 修正解析;5 分钟内自动重试,或点击「立即续期」 |
| 「签发失败,详见控制台日志」 | 未分类的错误 | 在运行后台任务的控制台进程日志中查找 certificate operation failed,按 reason 处理 |
| 证书长期停在「等待签发」 | 没有运行后台任务的控制台进程 | 确认存在 ROLE=worker 或 ROLE=all 的进程 |
| 「证书正在处理中」 | 证书处于「签发中」;网站已有一个等待绑定的申请;或对上传的证书续期 | 等待签发结束;在网站的「HTTPS」页签重试或取消该申请 |
| 「证书仍被网站使用:…」 | 列出的网站选择了该证书(第一张或其他证书) | 先在这些网站的「HTTPS」页签改选或移除证书 |
| 「证书仍被 L4 应用使用:…」 | 列出的 L4 应用用该证书做 TLS 卸载 | 先在这些 L4 应用中改选证书,见 TLS 卸载 |
| 「检查「CA 证书(PEM)」」 | 客户端证书为「可选」或「必须」,但 CA 证书栏为空 | 粘贴签发客户端证书的 CA |
403,X-Edgeweir-Error: client-cert-required |
网站的客户端证书为「必须」,请求没有出示该 CA 签发的有效证书,或经明文 HTTP 到达 | 用 curl --cert … --key … 出示证书;核对 CA 证书与校验深度;需要 HTTP 时开启「强制 HTTPS」 |
出示了 CA 签发的客户端证书仍是 403,或源站收到 X-Client-Verify: FAILED |
证书链用 SHA-1 签名或密钥太弱(RSA 小于 2048 位):节点的 OpenSSL 拒绝这类证书。macOS 自带的 LibreSSL openssl x509 -req 默认用 SHA-1 签名;证书已过期或尚未生效(核对节点时钟);链深度超过「校验深度」 |
openssl x509 -in client.pem -noout -text | grep 'Signature Algorithm' 查看签名算法,加 -sha256 重新签发;核对有效期与深度 |
| 「客户端 CA 须为 1–10 张当前有效的 CA 证书(PEM)」 | CA 证书栏不是 CA 证书(CA:TRUE)、已过期、密钥不受支持、使用显式曲线参数或超过 10 张 |
粘贴签发客户端证书的 CA |
| 「客户端证书与 HTTP/3 不能同时开启」 | 网站开启了 HTTP/3 | 先关闭 HTTP/3 |
| 「跳转端口 {port} 不是网站的 HTTPS 端口」 | 跳转端口不是 443,也不在网站的 HTTPS 端口中;或在「端口」卡片去掉了它 | 改选跳转端口,或先在「端口」卡片绑定该端口 |
| 「请先在系统设置中配置自定义 ACME 目录」「已不再配置自定义 ACME 目录」 | 选择了自定义 ACME 目录,但系统设置与环境变量中都没有它的地址 | 在 系统设置 → 证书颁发机构 填写地址,或改选其他 CA |
| 「该地址没有返回 ACME 目录」 | 控制台读取不到该地址的 ACME 目录:地址错误、TLS 证书不受信任(未填写 CA 证书)、超时或返回的不是目录 | 用 curl 核对地址;私有 CA 时在「CA 证书(PEM)」中粘贴签发者 |
| 「请同时填写 EAB 密钥 ID 和 HMAC 密钥」 | 只填了 EAB 密钥 ID,且没有已保存的同一 ID 的密钥 | 同时填写两者,或都留空 |
| 「ACME 账户仍被证书使用:…」 | 列出的证书用该账户签发 | 先删除这些证书 |
| 「DNS 凭据仍被证书使用:…」 | 列出的证书使用该凭据做 DNS-01 验证 | 先删除这些证书 |
| 「该服务商不支持列出区域,请手动填写」 | 服务商不能列出区域 | 在「区域」中直接填写 |
openssl s_client -sess_in 总是 New |
用了另一个网站的 SNI;节点版本早于会话复用;会话超过 1 小时;TLS 1.2 会话 ID(-no_ticket)换了节点 |
用同一 SNI 并核对节点版本 |
| 节点显示「需要升级」 | 节点缺少配置所需能力(如 http3-v1),保留 last-known-good 配置 |
升级节点,见节点升级 |
404,X-Edgeweir-Error: unknown-host(网站已配置) |
请求到达网站未绑定的端口 | 在「域名」页签的「端口」卡片绑定该端口,或改用网站的端口 |
| 附加 HTTPS 端口上 TLS 握手失败 | 网站没有绑定该端口,或网站没有证书 | 绑定端口并选择证书 |
| 附加端口连接超时 | 节点防火墙或安全组未放行;容器节点未发布端口 | 按端口与防火墙放行 |
| 「端口 {port} 仍被网站使用:…」 | 移除集群附加端口时仍有网站绑定 | 先在这些网站的「端口」卡片取消该端口 |
421,X-Edgeweir-Error: sni-host-mismatch |
TLS SNI 与 Host 不一致,例如客户端复用了其他域名的连接 |
客户端按请求的域名建立连接 |
| 浏览器不使用 HTTP/3 | 网站所在 HTTPS 端口的 UDP 未放通(如 UDP 443、UDP 9443);节点缺少 http3-v1;客户端首次访问后才读取 Alt-Svc |
放通对应的 UDP 端口,检查节点能力 |
| 响应未压缩 | 内容类型不在列表中;响应小于最小压缩大小或大于最大压缩长度;客户端未发送 Accept-Encoding;源站响应已带 Content-Encoding |
检查「缓存」页签的「压缩」设置 |
| 拿到 gzip 而不是 br / zstd | 客户端的 Accept-Encoding 不含该算法或 q 值更低;该算法未开启 |
检查请求头与「压缩」设置 |
| Brotli / Zstandard 开关不可用 | 集群中有活动节点不支持 brotli-v1 / zstd-v1 |
升级节点 |