为什么Schannel无法从服务器接收到握手?

16

当我尝试从我们的git服务器pull代码时,出现了以下错误:

fatal: unable to access 'xxx': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to xxx

之前遇到过类似问题,但是那时候我可以通过还原系统来解决。但这一次我的系统还原点被删除了,所以无法这样做。

因此,发生这种情况是因为我的系统设置中与SSL有关的某些更改引起的,但我不知道具体原因。

我已经尝试安装Git并使用Windows证书存储而不是OpenSSL,但是我得到了以下错误:

fatal: unable to access 'xxx': schannel: failed to receive handshake, SSL/TLS connection failed

虽然错误信息不同,但是问题相同,即客户端hello消息后服务器没有返回hello消息。我认为这可能是因为我在客户端hello消息中向服务器发送的密码套件均不被服务器支持。所以我尝试配置组策略并将服务器使用的密码套件排在第一位。但是它没有任何作用。

我能够通过浏览器连接到git服务器的网站。所以我的问题是,我该怎么办才能解决这个问题?


1
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange是更好的提问地点。另外,在故障排除时,xxx并不是很有用。您可以考虑添加一些真实信息,包括s_client的一些结果。 - jww
12个回答

22
在我的情况下,我修改了.gitconfig中的内容。
[http] sslbackend = schannel

[http] sslbackend = openssl

我遇到了类似的问题,这个解决方案似乎起作用了。 - rmiesen

5

当我尝试在本地网络上使用http代理访问一个git仓库时(该代理不能访问该仓库),我遇到了无法访问'https://hostname.local/reponame.git/':schannel:握手失败,SSL/TLS连接失败的错误。我将http.proxy设置重置为空字符串:

git config --global http.proxy ""

(请注意,在我的情况下,这是一个全局级别的设置,可能会因人而异。)

1
在某些情况下,这个Schannel消息(也被视为curl错误35)只是间接表明您正在为不应通过代理的URL使用代理。调整您的no_proxy环境变量可以帮助解决问题。 - Amit Naidu
完美的解决方案! - Ags1

4
在我的设备上预装了一些可疑的软件,这似乎与问题有关。无论使用OpenSSL还是schannel,当优先级引擎打开时,我的Killer无线网络适配器都会出现间歇性问题。当我禁用它时,所有问题都消失了,并且其他网络操作似乎也更快。

Killer Prioritization Engine

如果你的Windows系统中安装了这个软件,可以在开始菜单中键入“Killer”并启动“Killer Intelligence Center”来关闭它。在版本3.1222.726.1中,你应该在仪表板右侧的“快速设置”选项中看到一个名为“Prioritization Engine”的选项。关闭它并再次测试你的git操作。我不确定如果我只是卸载这个软件会发生什么。


我在我的戴尔XPS上遇到了这个问题已经有几周了,但是这个方法立刻解决了问题。谢谢! - Neil
你是怎么想到这个的? - Pete
1
@Pete 我知道这一定是与网络有关的问题,因为我在浏览器中也看到了 https 网站的间歇性网络故障。杀手智能中心是我首先查看的东西。只是运气好罢了! - Andrew Micenko

3
你应该尝试使用Git for Windows release 2.14.2 (June 21th, 2018)进行测试,它添加了代码以强制忽略http.sslCAinfo,当ssl backend设置为schannel时(以便不忽略Windows证书存储)。这只与cURL v7.60.0(或更高版本)一起运行有关。
请参见commit c5ad43e

http: 当使用安全通道时,默认忽略sslCAInfo

从cURL v7.60.0开始,安全通道后端可以使用通过http.sslCAInfo提供的证书捆绑包,但这会覆盖Windows证书存储。由于默认情况下不希望这样做,因此让Git在配置了schannel后端的情况下,默认情况下不要要求cURL使用该捆绑包,除非useSSLCAInfo覆盖了此行为。


很抱歉,这不可能了。因为那是很久以前的事情,并且我最终选择格式化了我的电脑,所以我不再遇到这个问题了。但还是感谢你的回答。 - Selman Genç

2
如果你在Visual Studio中遇到了这个问题:
打开git设置并将“加密网络提供程序”设置为“OpenSSL
这里是一个例子 输入图像描述

0
在我的情况下,我在使用本地代理(在我的情况下是px)访问www(如github.com),但也将相同的设置用于我们公司的github网站(git.example.org)时遇到了这个问题。我认为这个网站也应该在www上,但事实证明它实际上经过了一个NAT-IP(内部)。因此,我不得不从我的本地代理中排除内部IP地址。然后它就可以工作了。

0

我也曾经遇到同样的问题(在Windows 10上),但是重新启动解决了这个问题。


0

我曾经遇到过同样的问题,后来我尝试设置需要推送的存储库的URL,你只需要将源设置为gitHub存储库,使用以下代码:

 git  remote set-url origin <URL of Your Repo>

-1
一个“不太好”的解决方案是设置GIT_SSL_NO_VERIFY
export GIT_SSL_NO_VERIFY=true

或者在Windows上,设置环境变量,可以在系统中设置,也可以在使用命令行版本的Git时在命令行中设置:

set GIT_SSL_NO_VERIFY=true

它将简单地执行它所说的...


1
这不是一个解决方案,而是一个临时的解决方法。同时也非常适合测试是否存在其他问题阻止了对远程仓库的访问。 - Attila Csipak

-1
在我的情况下 - 在Jenkins工作中遇到了同样的问题 - 我提供了错误的用户凭据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接