您可以通过
获得更多信息
# 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 的更多信息:
参见Shawn Pearce (spearce)commit 0054045(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 中的附加文本来调试连接未启动的原因。
这是http.c 中的curl_errorstr,如果它不为空,请在消息中包含它。
还可以查看common causes for that message:
如果它以前工作,而今天不工作,则可能是 SSL 私钥在 BitBucket 端已过期(见下文,原因 #3),但这里似乎不是这种情况(证书有效期至 2014 年 3 月 12 日)。
目标站点不喜欢协议
触发如下请求,会导致出现未知 SSL 协议错误:
curl --sslv2 https://techstacks-tools.appspot.com/
为什么?好吧,在这种情况下,这是因为 techstacks 工具站点不支持 SSLv2,因此会产生 curl (35) 错误。
目标站点不喜欢密码
您可能正在尝试使用站点配置为拒绝的 ssl 密码连接到站点。
例如,匿名密码通常在面向客户的 ssl 加密站点上被禁用。 (我们中的许多人对任何 SSL 加密的网站都设置了全面拒绝政策——无论其目的如何。)
以下命令字符串“can”也会导致 curl (35) 错误:
curl --ciphers ADH-RC4-MD5 https://some_web_site.some_domain.com/
不幸的是,您可以从 curl 获得的错误响应类型在很大程度上取决于 ssl 服务器。在某些网站上,您会收到 Unknown SSL Protocol 错误,但在我的 techstacks-tools 网站上,我得到:
curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
向 Google 致敬,因为这个特定错误比我的网站在工作中生成的错误更具描述性,因为这至少告诉您一个 ssl 套接字已启动,但由于握手失败,该套接字永远无法完成。
尝试使用站点支持的密码连接到站点。不确定要使用哪种密码?好吧,让我介绍一下我的cryptonark ssl cipher tester...
SSL 私钥已过期
我今天早些时候在一个旧的 WebSeAL 站点上遇到了这个。
在 IBM GSKit 中,您可以指定私钥密码的有效期。达到特定日期后,您仍然可以启动 webseal 并侦听端口 443(或您将 https-port 值设置为的任何值),但您将无法成功协商 SSL 会话。
在今天的案例中,旧的 WebSEAL 实例正在使用长期过期的 kdb 文件和长期过期的私钥密码。替换为正确的更新版本后,一切都恢复正常了。
不正确的重定向
一些 ISP 和 DNS 提供商喜欢拦截您失败的 DNS 查询,以便将您重定向到搜索引擎结果样式的页面,为您提供替代 URL 或“您的意思是...?”反查询结果。
如果你看到这样的错误:
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol,
这可能是由于您输入的主机名不正确,或者主机名尚未在您的 DNS 中列出。您可以使用简单的“host”或“nslookup”进行验证。
注意(2015 年 8 月):Git 2.6+(2015 年第三季度)将允许明确指定 SSL 版本:
http:添加对指定 SSL 版本的支持
见commit 01861cb(2015 年 8 月 14 日)Elia Pinto (devzero2000)。
帮助者: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' 设置为空字符串。