← 回普通工程日志
# 9001加密口改用老CA签发证书(修PWA只能加快捷方式)(2026-10-20)
机器: 电脑A | 通用: 否

### 10-20 07:50 9001加密口改用老CA签发证书(修PWA只能加快捷方式)
9001 加密口换成"老 CA 签发"的证书(修 PWA 装不上):原因——Chrome 对不受信的 https 判不安全,只给"添加到主屏幕=快捷方式",不给安装。做法:用电脑A 的老 CA(~/.hermes/certs/lan.crt, CN=192.168.13.176, CA:TRUE) 签一张服务器证书 CN=192.168.13.229,SAN=IP:192.168.13.229,IP:192.168.13.176,DNS:localhost,有效期到 2029-01-21。落点: A 生成 /home/zyf/.hermes/certs/srv-b.{crt,key},B 用于 /home/yyl/.hermes/certs/srv-b.{crt,key}(单元 TLS_CERT/TLS_KEY 已改, 原自签 lan-b.crt 留着未删)。验证: openssl s_client 端出 subject=CN=192.168.13.229 issuer=CN=192.168.13.176;用老 CA 验链 Verify return code 0 (ok)。CA 文件已放 http://192.168.13.176:8001 的 lan-ca.crt 供手机/平板需要时安装。待用户实测: 手机打开 https://192.168.13.229:9001 是否还弹不安全警告(不弹=可装真 PWA)。

### 10-20 08:20 补充:病根找到了——CA 装错了门店(幽灵-11)
- 用户截图(手机【用户凭据】页)实锤:条目 cn=192.168.13.176 user:10170034.0 标注「已安装(用于 VPN 和应用)」,同栏还有 RSA_KEY / identity-cert-keypair ×2。
  → **那一栏是客户端身份证书门店,HTTPS 校验根本不看它**,所以 Chrome 一直不认链、只肯加快捷方式。正确门店是【清除信任的凭据 → 用户】。
- 第二轮排查(openssl 实测):旧 CA lan.crt **只有 basicConstraints(CA:TRUE),完全没有 Key Usage 扩展** —— 手机「CA 证书」安装器因此报「装不上」(安卓比 openssl 严格)。
- 治法:重出一张规矩齐全的新 CA + 新叶子
  - 新 CA:CN=Yeshen LAN CA(RSA2048,BasicConstraints critical CA:TRUE,pathlen:0 + Key Usage critical keyCertSign,cRLSign);文件 A:~/.hermes/certs/yeshen-ca.crt(1241B)、key 同目录(600)
  - 新叶子:CN=192.168.13.229,SAN=IP:229,IP:176,DNS:localhost,EKU=serverAuth,有效期到 2029-01-22;文件 B:~/.hermes/certs/b2.crt + b2.key(600)
  - 单元 hermes-webchat-9001.service 的 TLS_CERT/TLS_KEY 已指到 b2.*(备份 .bak-1020-ca),daemon-reload + restart → active
- 证据:openssl s_client -connect 192.168.13.229:9001 -CAfile yeshen-ca.crt 与 :9444 均 **Verify return code: 0 (ok)**;链 issuer = Yeshen LAN CA
- 新 CA 给手机的下载入口:http://192.168.13.176:8001/f/yeshen-ca.crt(Content-Type: application/x-x509-ca-cert,200)
- 另一条已实测走通、不依赖证书的路:手机 Termux sshd + 电脑A phone-tunnel → 手机 Chrome 开 http://localhost:9001(secure context,无需证书)。实测坑:Termux 锁屏即冻,8022「能连上但 banner 卡住」,须 termux-wake-lock + pkill sshd; sshd,自启写 ~/.termux/boot/00-sshd.sh。

### 10-20 08:30 补充:全站内链换新CA(幽灵-12)
- 连带损伤成因:9000 的加密口 **9443** 与任务系统 **9445** 的证书 issuer=CN=192.168.13.176(旧 lan.crt 自签/直签);用户删掉旧CA → 手机不再认 → 9000 侧也报警。桥与 todo_server.py 的默认证书路径都是 `TLS_CERT=~/.hermes/certs/lan.crt`(grep 实测:hermes_bridge.py:3461、todo_server.py:2945)。
- 修法:用新CA重签电脑A 叶子 `a.crt`(CN=192.168.13.176,SAN 176/127.0.0.1/localhost,到2029-01-22),并把 **leaf+root 拼成完整链** 覆盖到默认路径 lan.crt(旧文件备份 `lan.crt.bak-oldca-1020` / `lan.key.bak-oldca-1020`)→ 重启 hermes-webchat、phone-todo-web。
- 另一个真坑(实测):9001 之前只发**半截链**(`openssl s_client` 无 -CAfile 时 `Verify return code: 21 (unable to verify the first certificate)`,链条数=1)→ 已改为 leaf+root(链条数=2)。
- 证据(同一张新CA验):A 9443 `Verify 0 (ok)`、A 9445 `Verify 0 (ok)`、B 9001 `Verify 0 (ok)`、B 9444 `Verify 0 (ok)`,四个链条数均 2;三个服务 is-active=active。
- 现在手机只需要一张 CA:`CN=Yeshen LAN CA`(用户已装成功,截图条目 cn=yeshen lan ca,o=yeshen lan,c=cn)。

### 10-20 08:36 补充:真凶是 service worker 缺 fetch 处理器(幽灵-13)
- 证书修好后 9443/9445 正常,但 9001 仍只加快捷方式 → 说明卡的不是证书。**实查**:桥发出的 `/sw.js`(hermes_bridge.py 里的 SW_JS 常量)只有 install/activate/push/notificationclick/message,**没有 fetch 监听**。
- 机制:**安卓 Chrome 仍要求 SW 带 fetch 处理器才判定可安装**(要生成 WebAPK);桌面 Chrome 已取消该要求。缺它 → 退化为 legacy“添加到主屏幕”= 书签快捷方式(问名字、用生成图标)。
- 修法:SW_JS 加放行式 fetch(同源 GET 透传 `fetch(r)`;`/api/*` 直接 return 不碰,避免打断 SSE/流式;非同源不接管)。备份 `hermes_bridge.py.bak-1020-sw`,py_compile 过,重启 hermes-webchat-9001。
- 证据:重启后 `curl -k https://127.0.0.1:9001/sw.js` 出现 `self.addEventListener('fetch'...` 与 `respondWith(fetch(r))`;服务 active;9001/9444/9011 在听;/api/status ready=true。
- 顺带:B 这份 SW 的默认通知标题由“晚风”改成“幽灵”。
- **未做(留给用户决定)**:电脑A 的 9000 桥有同一处缺陷(SW_JS 无 fetch)→ 9000 装成 App 也会退化;要修就同样补 fetch 并重启 hermes-webchat。
电脑A 10-20 22:31