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

时间:2017-09-28 15:15:59

标签: windows git ssl openssl tls1.2

当我试图从我们的git服务器拔出时,我收到了这个错误:

  

致命:无法访问' xxx':OpenSSL SSL_connect:SSL_ERROR_SYSCALL   与xxx有关

如果发生这种情况之前我只能通过恢复系统来解决问题,但这次我的系统恢复点由于某种原因被删除了,我也做不到。

所以发生这种情况是因为我的系统设置中的某些内容与SSL相关,我不知道原因。

我尝试过安装git来使用windows cert。存储而不是OpenSSL,我收到了这个错误:

  

致命:无法访问' xxx':schannel:未能获得握手,   SSL / TLS连接失败

同样的问题,不同的错误信息。客户端问候后服务器没有发回hello消息。我认为这可能会发生,因为服务器不支持我在客户端问候消息中发送服务器的密码套件。所以我尝试了configuring a group policy并将服务器首先使用的密码套件按顺序放置。但它没有任何区别。

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

9 个答案:

答案 0 :(得分:1)

您应该使用Git for Windows release 2.14.2 (June 21th, 2018)再试一次,以进行测试,当ssl后退http.sslCAinfo schannel`时,该代码将添加代码以强制忽略is set to(这样Windows证书存储为不忽略)。
这实际上仅与使用cURL v7.60.0(或更高版本)一起运行时相关。

请参见commit c5ad43e

  

http:使用安全通道时,默认情况下忽略sslCAInfo

     

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

答案 1 :(得分:1)

在我的情况下,我从

更改了.gitconfig
[http] sslbackend = schannel

[http] sslbackend = openssl

答案 2 :(得分:1)

当我尝试将http代理用于本地网络上的git repo时遇到unable to access 'https://hostname.local/reponame.git/': schannel: failed to receive handshake, SSL/TLS connection failed错误(无法通过该特定代理访问)。我将http.proxy设置重置为空字符串:

git config --global http.proxy ""

(请注意,在我的情况下,这是一个全局级别的设置,YMMV。)

答案 3 :(得分:0)

一个"弱"解决方案是设置GIT_SSL_NO_VERIFY

export GIT_SSL_NO_VERIFY=true

或者在Windows上,如果使用命令行版本的Git,请在系统或命令行中设置环境变量:

set GIT_SSL_NO_VERIFY=true

它只会做它所说的......

答案 4 :(得分:0)

我遇到了同样的问题(Windows 10),重新启动后解决了该问题。

答案 5 :(得分:0)

我的情况是我在使用本地代理(在我的情况下为px)访问www(例如github.com)时遇到了这个问题,但同时对我们公司的github-site使用了相同的设置(git。 example.org)。我以为这个站点也会在www中,但是事实证明它实际上是通过NAT-IP(内部)进行的。因此,我不得不从本地代理中排除内部IP地址。然后它起作用了。

答案 6 :(得分:-1)

在我的情况下,没有正确配置NO_PROXY变量。

答案 7 :(得分:-1)

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

答案 8 :(得分:-2)

我在错误情况下有解决方案。您可以使用命令:

git push orgin destination_branch