连接中的未知SSL协议错误

63

我想要将我的提交推送到Bitbucket代码库,但出现了以下错误:

Fatal: unable to access
'https://myUsername@bitbucket.org/myUsername/myRepository.git/':
Unknown SSL protocol error in connection to bitbucket.org:443
16个回答

61

您可以使用

获取更多信息。
# Windows
set GIT_CURL_VERBOSE=1
set GIT_TRACE_PACKET=2

# Unix
export GIT_CURL_VERBOSE=1
export GIT_TRACE_PACKET=2

然后尝试执行 git push 命令。

如果有代理设置,请仔细检查。

注意:git 2.8(2016年3月)对错误35增加了更多信息:

请参见 commit 0054045(由 Shawn Pearce (spearce) 于 2016年2月14日提交)。
(由 Junio C Hamano -- gitster -- 合并至 commit 97c49af,2016年2月24日)

remote-curl: 在SSL连接失败时包含curl_errorstr

对于curl错误35(CURLE_SSL_CONNECT_ERROR),用户需要在CURLOPT_ERRORBUFFER中存储的附加文本来调试为什么连接没有启动。
如果curl_errorstr不为空,则在消息中包含它,它位于http.c内部。


另外还要查看该信息的常见原因:

如果之前可以使用,今天却不能使用,可能是BitBucket端的SSL私钥已过期(请参见下面,第3个原因),但这似乎不是此处的情况(证书有效期至2014年12月03日)。


目标网站不喜欢该协议

发送以下请求会导致未知的SSL协议错误:

curl --sslv2 https://techstacks-tools.appspot.com/

为什么会出现这个问题呢?因为techstacks工具网站不支持SSLv2,导致curl (35)错误。

目标网站不喜欢密码

你可能正在尝试使用一个目标网站不支持的SSL密码连接到该网站。
例如,匿名密码通常在面向客户的SSL加密站点上被禁用。(我们中的许多人对任何SSL加密的网站都设置了拒绝策略,而不考虑其目的。)
以下命令字符串也可能导致curl(35)错误:
curl --ciphers ADH-RC4-MD5 https://some_web_site.some_domain.com/

很遗憾,你从curl获取的错误响应类型在很大程度上取决于ssl服务器。在某些网站上,你会收到“未知SSL协议”错误,但在我的techstacks-tools网站上,我会收到以下错误信息:
curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Kudos to Google因为这个特定的错误比我在工作中遇到的错误更具描述性,因为它至少告诉你ssl套接字已经启动,但由于握手失败,套接字无法完成。尝试使用站点支持的密码连接站点。不确定使用哪个密码?那么,让我介绍一下我的cryptonark ssl cipher tester...
SSL私钥已过期。我今天早些时候在使用旧的WebSeAL网站时遇到了这个问题。在IBM GSKit中,您可以指定私钥密码的有效期。达到某个日期后,您仍将能够启动WebSEAL并侦听端口443(或您设置的任何https-port值),但您将无法成功协商SSL会话。在今天的情况下,旧的WebSEAL实例正在使用已过期的kdb文件和已过期的私钥密码。一旦替换为正确的、更新的版本,一切又恢复正常了。
不当重定向。
一些互联网服务提供商和DNS供应商会拦截你的DNS查询失败,以便将你重定向到一个类似于搜索引擎结果页面的页面,提供替代URL或“你是不是想找...?”等查询结果。
如果你看到这样的错误:
 error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol, 

可能是您输入主机名不正确,或者主机名尚未在您的DNS中列出。您可以使用简单的“host”或“nslookup”进行验证。
注意(2015年8月):Git 2.6+(Q3 2015)将允许显式指定SSL版本:

http:添加支持指定SSL版本

请参见commit 01861cb(由Elia Pinto (devzero2000于2015年8月14日创建)。
协助者:Eric Sunshine (sunshineco
(由Junio C Hamano -- gitster --合并于commit ed070a4,2015年8月26日)
http.sslVersion

当协商SSL连接时要使用的SSL版本,如果您想强制使用默认值。可用和默认版本取决于libcurl是针对NSS还是OpenSSL构建的,以及所使用的加密库的特定配置。在内部,这将设置“CURLOPT_SSL_VERSION”选项;有关此选项格式和支持的ssl版本的详细信息,请参见libcurl文档。实际上,此选项的可能值为:sslv2、sslv3、tlsv1、tlsv1.0、tlsv1.1、tlsv1.2。可以通过“GIT_SSL_VERSION”环境变量覆盖。要强制git使用libcurl的默认ssl版本并忽略任何显式的“http.sslversion”选项,请将“GIT_SSL_VERSION”设置为空字符串。

2
谢谢@VonC - 使用“export GIT_SSL_VERSION=tlsv1.1”解决了我的问题(在手动重新构建git以使用libcurl.so.4之后)。如果没有这个,我将无法将git连接到visualstudio.com(visual studio online)。 - The Huff
我们遇到了一个版本的error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol,结果发现我们的https代理只接受http,也就是说我们需要https_proxy=http://proxy(注意:rhs上的http)而不是https_proxy=https://proxy(注意:rhs上的https)。 - jones77

42
根据bitbucket的知识库,这可能也是由于存储库所有者超过计划限制所致。如果您进一步查看页面底部,似乎也可能会因使用过旧的git版本(目前需要1.7)而触发此错误。

11
感谢您的提示,我通过从git 1.8升级到git 2.0解决了这个问题。谢谢。 - Ludwik Trammer
5
如何更新它?我有同样的问题,不知道该如何解决?请帮忙。 - huykon225
2
截至2018年8月1日,不得不将Git从2.7.2更新到2.18.1以解决与Bitbucket的问题。 - Vladimir Salin
我曾经遇到过这个问题,但是因为我使用了两个不同的账户。当我从一个账户切换到另一个账户时,由于Windows将用户和密码存储在凭据管理器中,我必须输入并编辑其值。这对我起作用了。 - heavyrick
1
@heavyrick,你在哪里切换账户了? - TheRealChx101
(非常抱歉回复晚了)我在这里进行了更改> https://support.microsoft.com/zh-cn/help/4026814/windows-accessing-credential-manager - heavyrick

20

我通过设置以下 git 配置解决了这个问题:

git config --global --add http.sslVersion tlsv1.0

我猜测公司代理服务器不喜欢默认的加密协议。


15

在许多情况下,这与代理问题有关。如果是这样,请配置您的git代理。

git config --global http.proxy HOST:PORT

1
谢谢,问题解决了,虽然我不得不设置无代理即 git config --global http.proxy ""。 - Christopher Grigg
这个解决方案解决了我的问题,因为我使用上述解决方案意识到失败是在尝试通过我的公司代理时发生的。很容易修复,谢谢! - Chris
1
谢谢@ChristopherGrigg - 空代理对我也起作用了。 公司代理后面。 - Deian

6

我在企业代理后面遇到了这个问题。

解决方法如下:

git config http.sslVerify "false"


7
这是一个非常糟糕的想法,因为它会禁用所有安全检查,并可能导致中间人攻击。 - MrTux

6

这个错误也会在服务器宕机时出现。技术支持的电子邮件上提到:

“我们经历了一次停机,影响了网站的流量,以及通过HTTPS进行的Mercurial和Git流量。但SSH没有受影响。随时查看此页面获取更多信息:

http://status.bitbucket.org/

因此,请稍后再试,问题可能会自行解决。对我来说就是这样。


谢谢你的提示。应该是要检查的第一件事。在我试图解决这个问题之后,找到了你的提示,果然。Bit Bucket正在维护中。https://status.bitbucket.org/ - Michael Davidovich

1

我在使用Android Studio 2.1.3的版本控制时遇到了这个问题,遇到的情况如下:

1- 我打开IDE并单击“更新/拉取”图标(Ctrl + T)

2- 它没有要求输入主密码,而且失败了,给了我这个错误:

Unknown SSL protocol error in connection to bitbucket.org:443

3- 我尝试获取存储库(右键单击> git > 存储库 > 获取)

4- 它要求我输入主密码,我输入了

5- 它尝试获取但一次又一次地失败

6- 我重新启动了Android Studio

7- 我尝试获取存储库(右键单击> git > 存储库 > 获取)

8- 它要求我输入主密码,我输入了

9- 现在一切都正常,所有事情进行得很顺利

结论

也许Android Studio需要先输入主密码才能执行任何git操作,否则即使稍后询问主密码,它仍然会继续失败,我不知道,这是发生在我的情况


1
我遇到了相同的问题。使用最新版本的Git且没有代理。
我解决了这个问题:
1. 登录GitHub。 2. 进入“个人设置”界面,然后点击“SSH密钥”。 3. 请确认您是否已经将在Windows上通过命令“ssh-keygen -t rsa”生成的“id_rsa.pub”放入github-->GIT BASH中。 4. 点击“添加SSH密钥”,并将“id_rsa.pub”放入其中。
更多信息:创建密钥复制密钥

0

执行

nc -v -z <git-repository> <port>

你的输出应该看起来像这样

"Connection to <git-repository> <port> port [tcp/*] succeeded!"

如果你得到

connect to <git-repository> <port> (tcp) failed: Connection timed out

你需要编辑你的~/.ssh/config文件。添加类似以下内容的东西:
Host example.com
Port 1234

0

当我推送大量源代码(近700MB)时,出现了这个错误,然后我尝试部分推送,成功地推送了。


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