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 config -l --show-origin
报告的所有位置设置了配置选项 http.sslverify=false
并验证了 sslverify 无处不在。特别是在本地 repo 的 .git/config 中,它应该覆盖任何默认或显式系统或全局设置,它是错误的。
我把http.sslbackend
选项改成sChannel
,然后改回openssl
;报错信息变了,说明设置生效了,但还是报错信息。那里有帖子表明无法完全阻止较新的 sChannel
机制检查证书,因此我想确保我不会不小心仍在使用它。 (显然,这是新安装中的默认机制。)
我也下载了证书,并通过编辑~/.ssl/config
指示openssl使用它;不幸的是,这只会导致 git(或者更确切地说,openssl)以证书已过期为由拒绝该证书。
我将环境变量 GIT_SSL_NO_VERIFY 设置为 "true",这应该会覆盖所有配置设置。
我使用了环境变量 GIT_TRACE_CURL=path
、GIT_TRACE
和 GIT_CURL_VERBOSE
来获得调试输出,除了 openssl 试图验证证书并失败,这是正确的,只要它尝试验证它。例如。跟踪文件将包含完全正确的 Info: SSL certificate problem: self signed certificate
行。
其他 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_proxy
和 HTTPS_PROXY
必须取消设置 both。1 即使服务器列在 no_proxy
环境变量中,该变量通常指示程序不对变量值中列出的特定服务器使用代理。幸运的是,回购服务器在本地网络中。2
我不清楚 git 正确,cURL 或 openssl 是这里的罪魁祸首;我相信,这些变量是由 git 适当的以及网络库评估的。
1我认为变量存在大小写形式是历史原因。
2 据我所知,问题不在于代理服务器,因为已获取回购服务器证书并将其正确识别为自认证。
在 git 为 Windows 进行最新更新(事实上,我进行了新安装)后,我无法再通过 https 连接到特定的远程存储库。它位于使用 自签名证书的内部服务器上,该证书也已过期一段时间(不要问)。
它曾经与 git 一起用于 Windows 2.16.x (iirc) 并继续与 cygwin 和 mysys2 中的并行安装一起工作(报告版本 2.17.0 和2.20.1,分别)。
这是我尝试过的(不是同时进行的):
我已经在
git config -l --show-origin
报告的所有位置设置了配置选项http.sslverify=false
并验证了 sslverify 无处不在。特别是在本地 repo 的 .git/config 中,它应该覆盖任何默认或显式系统或全局设置,它是错误的。我把
http.sslbackend
选项改成sChannel
,然后改回openssl
;报错信息变了,说明设置生效了,但还是报错信息。那里有帖子表明无法完全阻止较新的sChannel
机制检查证书,因此我想确保我不会不小心仍在使用它。 (显然,这是新安装中的默认机制。)我也下载了证书,并通过编辑
~/.ssl/config
指示openssl使用它;不幸的是,这只会导致 git(或者更确切地说,openssl)以证书已过期为由拒绝该证书。我将环境变量 GIT_SSL_NO_VERIFY 设置为 "true",这应该会覆盖所有配置设置。
我使用了环境变量
GIT_TRACE_CURL=path
、GIT_TRACE
和GIT_CURL_VERBOSE
来获得调试输出,除了 openssl 试图验证证书并失败,这是正确的,只要它尝试验证它。例如。跟踪文件将包含完全正确的Info: SSL certificate problem: self signed certificate
行。
其他 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_proxy
和 HTTPS_PROXY
必须取消设置 both。1 即使服务器列在 no_proxy
环境变量中,该变量通常指示程序不对变量值中列出的特定服务器使用代理。幸运的是,回购服务器在本地网络中。2
我不清楚 git 正确,cURL 或 openssl 是这里的罪魁祸首;我相信,这些变量是由 git 适当的以及网络库评估的。
1我认为变量存在大小写形式是历史原因。
2 据我所知,问题不在于代理服务器,因为已获取回购服务器证书并将其正确识别为自认证。