代码版本:40395b0441f60faa9a64f2038d6d4ed00d1c73ae
MITM 证书问题调试小结
问题描述
启用 YouTube 广告拦截规则后,YouTube App 无法加载内容。关闭规则后正常工作。
已完成的排查
- 证书链结构
- ✅ 已修复:叶子证书不再包含 rootCA(与旧版 anyproxy 一致)
- ✅ 验证:grep -c "BEGIN CERTIFICATE" 结果为 1
- 证书类型
- ✅ 已修改:从 ECDSA P-256 改为 RSA-2048
- ✅ 验证:Public Key Algorithm: rsaEncryption, Public-Key: (2048 bit)
- 证书扩展字段
- ✅ 已简化:只保留 Basic Constraints 和 SAN
- ✅ 验证:与旧版 anyproxy 证书结构完全一致
- Subject 字段
- ✅ 已修复:继承 rootCA 的完整 Subject(C, O, ST, OU, CN)
- ✅ 验证:C=CN, O=AnyProxy, ST=SH, OU=AnyProxy SSL Proxy,
CN=youtubei.googleapis.com
- CA 证书链配置
- ✅ 已添加:createSecureContext 配置了 ca 参数
- ✅ 验证:ca: certMgr.getRootCAFilePath()
当前问题
TLS 握手失败
- 错误:socket hang up(客户端主动断开连接)
- 现象:secureConnection 事件从未触发
- 日志:连接建立后,客户端立即发送 socket hang up 错误
关键矛盾
- 新旧两个证书的结构完全相同
- 但旧版 anyproxy 可以正常工作
- 新版证书客户端拒绝连接
未排查的领域
- TLS 握手细节
- 加密套件选择
- 证书链发送顺序
- TLS 版本协商
- 服务端配置差异
- secureOptions 参数
- ALPN 协议配置
- 其他 TLS 相关选项
- 网络层面
- 抓包分析具体握手消息
- 对比新旧版本的网络流量
建议下一步
- 抓包对比:使用 Wireshark 或类似工具,对比新旧版本的 TLS 握手流程
- 检查 secureOptions:对比新旧版本的 secureOptions 配置是否一致
- 简化测试:创建一个最小化的 HTTPS 服务器,只返回证书,看是否能握手成功
代码变更位置
- /Users/hfy/jayli/block-proxy/proxy/proxy-core/cert-lifecycle.js - 证书生成逻辑
- /Users/hfy/jayli/block-proxy/proxy/proxy-core/https-server-mgr.js - HTTPS
服务器配置
- /Users/hfy/jayli/block-proxy/proxy/proxy.js - rootCA 路径配置
代码版本:40395b0441f60faa9a64f2038d6d4ed00d1c73ae
MITM 证书问题调试小结
问题描述
启用 YouTube 广告拦截规则后,YouTube App 无法加载内容。关闭规则后正常工作。
已完成的排查
CN=youtubei.googleapis.com
当前问题
TLS 握手失败
关键矛盾
未排查的领域
- 加密套件选择
- 证书链发送顺序
- TLS 版本协商
- secureOptions 参数
- ALPN 协议配置
- 其他 TLS 相关选项
- 抓包分析具体握手消息
- 对比新旧版本的网络流量
建议下一步
代码变更位置
服务器配置