当你配置的代理以`https://`开头时,git 会首先使用 TLS 连接这个代理服务器。
例如,假设我使用了以下命令配置代理:
`export HTTPS_PROXY=https://127.0.0.1:10809`
`git config --global https.proxy https://127.0.0.1:10809`
在 git 发起请求时抓包看一下,可见 git 给 HTTP 代理发了一个 TLS Client Hello 。v2rayn 日志也提示收到一堆非 HTTP/1.1 的二进制,Git 也返回楼主遇到的同款错误。
而 v2rayn (包括 xray/v2fly/sing-box 等)代理软件显然不会自己给 127.0.0.1 签一个 TLS 证书(毕竟麻烦&没必要),它们开放出来的、用于本地访问的 HTTP 代理是不支持像各种网站服务器那样接收 HTTPS/TLS 连接的。
解决方法:
将"https://"替换成"http://",或者配置 socks5 代理。
这里有几个容易混淆的点:
1. HTTPS_PROXY 或 https.proxy 并不是说这里必须要填一个 HTTPS 代理,它的意思是“指定访问 HTTPS 的服务时所用的代理”。
同理,HTTP_PROXY 或 http.proxy 的意思是“访问未加密的 HTTP 服务时所用的代理”
2. 在此场景中"https://"开头的代理和另一个概念(例如:“xx 免费代理”“全球开放代理”那些网站/场景下所说的“HTTPS 代理”)是不一样的:
- 这里提到的"https://"开头的代理需要客户端用 TLS 连接
- 那些 xx 网站等场景下经常说的 HTTPS 代理指的是:支持"CONNECT"这一 HTTP 请求方法的、基于 HTTP 协议的代理;
- (因为当年有好些“普通 HTTP 代理”只支持或开放 GET 、POST 等方法,访问"https://"网站时 TLS/SSL 加密解密由代理服务器处理,代理服务器能看到全部明文
-( “CONNECT 方法可用于访问使用 TLS/HTTPS 的网站,它实际上提供了一个中继 TCP 流的隧道”