[L-06][medium] 健康检查只会明文:配了证书并关闭明文时必失败,Docker 示例配置因此默认开着明文 #25

Closed
opened 2026-09-30 13:56:56 +08:00 by nixevol · 1 comment
Owner

编号:L-06 严重级:medium 工作线:监听与 HTTP(internal/listener、internal/httpx、serve 的 HTTP 装配) 来源:审查 P-09
依赖:无 被依赖:无

结论与统一方案

采用审查 P-09 的方案:

  1. 配置里 tls.cert_file 非空且 allow_plaintext=false 时,健康检查改用 https:// 并设 InsecureSkipVerify: true。只连 127.0.0.1 做存活探测,不涉及身份校验,在代码注释里说明原因。
  2. deploy/config.docker.yaml 改回 allow_plaintext: false;没配证书时本来就只跑明文,不影响开箱即用。

改动文件

cmd/nixmsg/healthcheck.go、deploy/config.docker.yaml。

与其他问题的交互 / 冲突说明

无。

验收与测试

用测试证书、allow_plaintext: false 启动 runServe,cmdHealthcheck 返回 nil。


问题明细(各区审查原文,证据含文件与行号)

以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。

[P-09] 健康检查只会明文 HTTP:按推荐配了证书并关闭明文时必失败,示例配置因此默认开着明文

  • 严重级:medium
  • 分类:与PRD不符 / 质量
  • 现象与影响:
    • nixmsg healthcheck 固定请求 http://。配了证书且 allow_plaintext: false 时(PRD F21 的默认,OPS 第 5 节和 DEVELOPMENT 12 也这样推荐),listener 收到明文首字节直接关连接,健康检查永远失败,容器一直是 unhealthy。
    • 示例配置 deploy/config.docker.yaml 默认写的是 allow_plaintext: true。运维照注释挂上证书后,生产环境会继续接受明文,和"配置了证书则默认只接受 TLS"正好相反。
  • 证据:healthcheck.go:28-30;listener/server.go:305-308;deploy/config.docker.yaml:7;docker-compose.yml:25-29。
  • 文档依据:PRD F21、F22;DEVELOPMENT 11.4、12,以及 13「两个架构的镜像都能…通过健康检查」。
  • 为何不是故意设计:DEVIATIONS Q1 第 3 条只说"请求本机 /healthz",没有考虑 TLS。
  • 解决方案:
    1. 配置里 tls.cert_file 非空且 allow_plaintext=false 时,健康检查改用 https:// 加 InsecureSkipVerify: true。只连 127.0.0.1 做存活探测,不涉及身份校验,在代码里注释说明原因。
    2. config.docker.yaml 改回 allow_plaintext: false。没配证书时本来就只跑明文,不影响开箱即用。
  • 改动文件:cmd/nixmsg/healthcheck.go、deploy/config.docker.yaml
  • 与其他模块的交互/冲突风险:无。
  • 需补测试:用测试证书、allow_plaintext: false 启动 runServe,cmdHealthcheck 返回 nil。
  • 置信度:代码阅读确定

复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。

**编号**:L-06 **严重级**:medium **工作线**:监听与 HTTP(internal/listener、internal/httpx、serve 的 HTTP 装配) **来源**:审查 P-09 **依赖**:无 **被依赖**:无 ### 结论与统一方案 采用审查 P-09 的方案: 1. 配置里 `tls.cert_file` 非空且 `allow_plaintext=false` 时,健康检查改用 `https://` 并设 `InsecureSkipVerify: true`。只连 127.0.0.1 做存活探测,不涉及身份校验,在代码注释里说明原因。 2. `deploy/config.docker.yaml` 改回 `allow_plaintext: false`;没配证书时本来就只跑明文,不影响开箱即用。 ### 改动文件 `cmd/nixmsg/healthcheck.go`、`deploy/config.docker.yaml`。 ### 与其他问题的交互 / 冲突说明 无。 ### 验收与测试 用测试证书、`allow_plaintext: false` 启动 `runServe`,`cmdHealthcheck` 返回 nil。 --- ### 问题明细(各区审查原文,证据含文件与行号) > 以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。**解决方案以本 issue 上方的"结论与统一方案"为准**;原文里的方案与之不一致时,按上方执行。 #### [P-09] 健康检查只会明文 HTTP:按推荐配了证书并关闭明文时必失败,示例配置因此默认开着明文 - **严重级**:medium - **分类**:与PRD不符 / 质量 - **现象与影响**: - `nixmsg healthcheck` 固定请求 `http://`。配了证书且 `allow_plaintext: false` 时(PRD F21 的默认,OPS 第 5 节和 DEVELOPMENT 12 也这样推荐),listener 收到明文首字节直接关连接,健康检查永远失败,容器一直是 unhealthy。 - 示例配置 `deploy/config.docker.yaml` 默认写的是 `allow_plaintext: true`。运维照注释挂上证书后,生产环境会继续接受明文,和"配置了证书则默认只接受 TLS"正好相反。 - **证据**:`healthcheck.go:28-30`;`listener/server.go:305-308`;`deploy/config.docker.yaml:7`;`docker-compose.yml:25-29`。 - **文档依据**:PRD F21、F22;DEVELOPMENT 11.4、12,以及 13「两个架构的镜像都能…通过健康检查」。 - **为何不是故意设计**:DEVIATIONS Q1 第 3 条只说"请求本机 /healthz",没有考虑 TLS。 - **解决方案**: 1. 配置里 `tls.cert_file` 非空且 `allow_plaintext=false` 时,健康检查改用 `https://` 加 `InsecureSkipVerify: true`。只连 127.0.0.1 做存活探测,不涉及身份校验,在代码里注释说明原因。 2. `config.docker.yaml` 改回 `allow_plaintext: false`。没配证书时本来就只跑明文,不影响开箱即用。 - **改动文件**:`cmd/nixmsg/healthcheck.go`、`deploy/config.docker.yaml` - **与其他模块的交互/冲突风险**:无。 - **需补测试**:用测试证书、`allow_plaintext: false` 启动 runServe,`cmdHealthcheck` 返回 nil。 - **置信度**:代码阅读确定 --- <sub>复审基线:main `4059a15`(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。</sub>
nixevol added the P2-mediumlane/listenerreview-2026-09-30 labels 2026-09-30 13:56:56 +08:00
Author
Owner

已合入 origin/main 0c9b459。落地提交 7c926a0 fix: 修复 TLS ConnectionState、SPA 回退、健康检查与监听小问题 (#25)。

已合入 origin/main `0c9b459`。落地提交 `7c926a0` fix: 修复 TLS ConnectionState、SPA 回退、健康检查与监听小问题 (#25)。
Sign in to join this conversation.