git 2.20.1.windows.1 不遵守 http.sslverify=false

git 2.20.1.windows.1 does not honor http.sslverify=false

在 git 为 Windows 进行最新更新(事实上,我进行了新安装)后,我无法再通过 https 连接到特定的远程存储库。它位于使用 自签名证书的内部服务器上,该证书也已过期一段时间(不要问)。

它曾经与 git 一起用于 Windows 2.16.x (iirc) 并继续与 cygwin 和 mysys2 中的并行安装一起工作(报告版本 2.17.0 和2.20.1,分别)。

这是我尝试过的(不是同时进行的):

其他 git(resp.openssl)安装似乎跳过了整个证书检查,但这正是我们在这种情况下所需要的。

这是一个错误吗?有什么想法吗?


编辑:问题与 https 代理设置有关。在我的环境中,我在 HTTPS 代理后面,但必须直接访问回购服务器。我为此设置了 https_proxy 和 no_proxy 变量。为了排除所有其他环境设置,我使用了具有两种不同设置的 env -i(它启动了一个没有设置任何环境变量的程序)。请注意,我首先保留了具有 git 安装目录的原始路径。唯一的区别是,在首先出现的失败调用中,https_proxy 设置为以 "https://" 开头的字符串(garbage 部分是文字,以表明它不是有效主机) :

ssl 设置为

git config -l |grep -i ssl
http.sslverify=false
http.sslverify=false
http.sslverify=false
http.sslverify=false
http.sslbackend=openssl

env -i PATH="$PATH" GIT_CURL_VERBOSE=1 GIT_TRACE=2 no_proxy="[repo host FQDN]" <i><strong>https_proxy="https://garbage"</strong></i> git 获取 16:41:53.953829 exec-cmd.c:236 跟踪:已解析可执行目录:D:/Programs/Git/mingw64/bin 16:41:53.955829 git.c:418 trace: built-in: git fetch 16:41:53.980831 运行-command.c:643 trace: run_command: GIT_DIR=.git git remote-https origin <a href="https://[FQDN/path-to-git]" rel="nofollow noreferrer">https://[FQDN/path-to-git]</a> 16:41:54.001834 exec-cmd.c:236 跟踪:已解析可执行目录:D:/Programs/Git/mingw64/libexec/git-core 16:41:54.003834 git.c:675 trace: exec: git-remote-https origin <a href="https://[FQDN/path-to-git]" rel="nofollow noreferrer">https://[FQDN/path-to-git]</a> 16:41:54.003834 运行-command.c:643 trace: run_command: git-remote-https origin <a href="https://[FQDN/path-to-git]" rel="nofollow noreferrer">https://[FQDN/path-to-git]</a> 16:41:54.028836 exec-cmd.c:236 跟踪:已解析可执行目录:D:/Programs/Git/mingw64/libexec/git-core * 在 _netrc 文件中找不到主机 [repo host FQDN];使用默认值 * 正在尝试 [回购主机 IP 地址]... * TCP_NODELAY 设置 * 连接到 [repo host FQDN] ([repo host IP address]) port 443 (#0) * ALPN,提供 h2 * ALPN,提供 http/1.1 * 成功设置证书验证位置: * CA文件:D:/Programs/Git/mingw64/ssl/certs/ca-bundle.crt 路径:none * SSL证书问题:自签名证书 * 关闭连接 0 致命:无法访问“<a href="https://[FQDN/path-to-git]" rel="nofollow noreferrer">https://[FQDN/path-to-git]</a>”:SSL 证书问题:自签名证书

如果 https_proxy 变量不是以 https:// 开头,则该命令有效。 CApath: none 行之前的日志几乎完全相同,只是有一行 curl 确认了 no_proxy 设置。

env -i PATH="$PATH" GIT_CURL_VERBOSE=1 GIT_TRACE=2 no_proxy="[repo host FQDN]" <i><strong>https_proxy="""</strong></i> git 获取 17:04:56.884616 exec-cmd.c:236 跟踪:已解析可执行目录:D:/Programs/Git/mingw64/bin 17:04:56.886616 git.c:418 trace: built-in: git fetch 17:04:56.911616 运行-command.c:643 trace: run_command: GIT_DIR=.git git remote-https origin <a href="https://[FQDN/path-to-git]" rel="nofollow noreferrer">https://[FQDN/path-to-git]</a> 17:04:56.931616 exec-cmd.c:236 跟踪:已解析可执行目录:D:/Programs/Git/mingw64/libexec/git-core 17:04:56.932616 git.c:675 trace: exec: git-remote-https origin <a href="https://[FQDN/path-to-git]" rel="nofollow noreferrer">https://[FQDN/path-to-git]</a> 17:04:56.932616 运行-command.c:643 trace: run_command: git-remote-https origin <a href="https://[FQDN/path-to-git]" rel="nofollow noreferrer">https://[FQDN/path-to-git]</a> 17:04:56.957616 exec-cmd.c:236 跟踪:已解析可执行目录:D:/Programs/Git/mingw64/libexec/git-core * <i><strong>使用代理环境变量 no_proxy == '[repo host FQDN]'</strong></i> * 在 _netrc 文件中找不到主机 [repo host FQDN];使用默认值 * 正在尝试 [回购主机 IP 地址]... * TCP_NODELAY 设置 * 连接到 [repo host FQDN] ([repo host IP address]) port 443 (#0) * ALPN,提供 h2 * ALPN,提供 http/1.1 * 成功设置证书验证位置: * CA文件:D:/Programs/Git/mingw64/ssl/certs/ca-bundle.crt 路径:none * <i><strong>使用 TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384 的 SSL 连接</strong></i> * ALPN,服务器接受使用 http/1.1 * 服务器证书: [...证书详细信息,包括。过期日期;通信成功]

首先尝试在设置 simplified PATH, using a portable Git for Windows (PortableGit-2.20.1-64-bit.7z.exe) 的 CMD 会话中访问您的存储库,在 C:\Git:

中解压缩
set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\
set GH=C:\path\to\git
set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH%

然后尝试在该会话中访问您的存储库。


OP 编辑​​,Peter: 在整洁的环境下进行的测试成功了。不同之处在于环境变量 https_proxyHTTPS_PROXY 必须取消设置 both1 即使服务器列在 no_proxy 环境变量中,该变量通常指示程序不对变量值中列出的特定服务器使用代理。幸运的是,回购服务器在本地网络中。2

我不清楚 git 正确,cURL 或 openssl 是这里的罪魁祸首;我相信,这些变量是由 git 适当的以及网络库评估的。


1我认为变量存在大小写形式是历史原因。

2 据我所知,问题不在于代理服务器,因为已获取回购服务器证书并将其正确识别为自认证。