fix: 修复编辑域名时私钥留空仍报“TLS 私钥和公钥证书必须同时填写” #5

Merged
kevin merged 1 commits from dsh/mailgo:caddy-cert-hot-reload into main 2026-08-17 11:46:58 +08:00
Contributor

问题

域名编辑页私钥输入框提示“留空则保留现有私钥”,但保存时报错 TLS 私钥和公钥证书必须同时填写

原因

浏览器提交 textarea 时会把换行规范为 CRLF,而证书文件(尤其是一键从 Caddy 导入的)是 LF,导致 readTLSCert(...) == publicCert 的“证书未修改”比较失效——证书实际没变、私钥留空时,代码误判为“只填了证书没填私钥”。

修复

  • handleDomainTLSUpdate 新增 normalizePEM:提交值与磁盘文件统一归一化为 LF 后再比较/写入,兼容 CRLF/LF 混合场景
  • 新增 3 个回归测试(admin_tls_test.go):
    • CRLF 提交且证书未变 + 私钥留空 → 保留现有私钥,不报错
    • CRLF 提交新证书对 → 保存成功且文件为 LF、密钥对有效
    • 证书确实改变但私钥留空 → 仍正确报“必须同时填写”

验证

  • 单元测试全过;生产机用浏览器等效请求(CRLF 提交、私钥留空)实测保存成功(302 → /admin/domains)
## 问题 域名编辑页私钥输入框提示“留空则保留现有私钥”,但保存时报错 `TLS 私钥和公钥证书必须同时填写`。 ## 原因 浏览器提交 textarea 时会把换行规范为 **CRLF**,而证书文件(尤其是一键从 Caddy 导入的)是 **LF**,导致 `readTLSCert(...) == publicCert` 的“证书未修改”比较失效——证书实际没变、私钥留空时,代码误判为“只填了证书没填私钥”。 ## 修复 - `handleDomainTLSUpdate` 新增 `normalizePEM`:提交值与磁盘文件统一归一化为 LF 后再比较/写入,兼容 CRLF/LF 混合场景 - 新增 3 个回归测试(`admin_tls_test.go`): - CRLF 提交且证书未变 + 私钥留空 → 保留现有私钥,不报错 - CRLF 提交新证书对 → 保存成功且文件为 LF、密钥对有效 - 证书确实改变但私钥留空 → 仍正确报“必须同时填写” ## 验证 - 单元测试全过;生产机用浏览器等效请求(CRLF 提交、私钥留空)实测保存成功(302 → /admin/domains)
dsh added 1 commit 2026-08-17 11:46:20 +08:00
浏览器提交 textarea 会把换行规范为 CRLF,而证书文件(尤其是一键从
Caddy 导入的)是 LF,导致“证书未修改”的比较失效,私钥留空(保留
现有私钥)时误报必须同时填写。

- handleDomainTLSUpdate 增加 normalizePEM:提交值与磁盘文件统一
  归一化为 LF 后再比较/写入
- 新增 3 个回归测试:CRLF 提交证书未变+私钥留空、CRLF 新证书对
  保存为 LF、证书已变但私钥留空仍应报错
kevin merged commit 9036523d9f into main 2026-08-17 11:46:58 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/mailgo#5