多出一个换行就可能让 CONNECT 之后的 TLS 出错
当手写的代理连接器打开隧道后立刻出现 TLS 解码错误时,先检查 HTTP 头的分帧。
当 CONNECT 返回 200 而 TLS 立刻无法解码时,先检查连接器中的边界字节,而不是急着更换证书或密码套件。
生成的认证值本身可能已经以换行结尾。再追加一个行尾可能让 HTTP 头提前结束,把本应放在请求头中的 Host 字段或其他明文留在请求之后。
最小的 HTTP/1.1 CONNECT 请求用 CRLF 分隔各行,并在末尾留一个空行:
b"CONNECT example.com:443 HTTP/1.1\r\nHost: example.com:443\r\n\r\n"任何认证字段都应放在最后那个空行之前,且内部不能含换行。在 Python 中,"\n" 表示换行;包含反斜杠和字母 n 的原始字符串则不是。在尝试去掉之前,先确认编码辅助函数实际生成了哪些字节——旧版辅助函数可能会追加换行。
CONNECT 成功后,剩余字节属于隧道内的协议。多余的明文可能被送到正在等待 TLS 的对端。成功状态无法修复畸形请求之后已经排队的字节。
也要检查接收边界。把套接字交给 TLS 之前先读完整个代理响应,处理分段读取,并保留读到的头之外的数据。一次套接字读取不一定包含一条完整消息。
如果你自己维护这个解析器,就把脱敏后的字节表示与线上语法对照;隐藏密码的同时保留长度和行边界。若应用只需要代理连接,维护良好的连接器可以免去自己维护这套分帧代码。