尝试通过防火墙访问GitHub的HTTPS时,SSL证书被拒绝。

407

我被防火墙困住了,所以我必须使用HTTPS来访问我的GitHub存储库。我在Windows XP上使用Cygwin 1.7.7。

我尝试将远程设置为https://username@github.com/username/ExcelANT.git,但是推送时会提示输入密码,但是一旦我输入密码就不起作用了。 https://username:<password>github.com/username/ExcelANT.git并从头开始克隆空存储库,但每次都会给我同样的错误:

错误:SSL证书问题,请验证CA证书是否正确。详细信息: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://github.com/username/ExcelANT.git/info/refs

打开GIT_CURL_VERBOSE=1会给我以下信息:

* 正在连接到 github.com 的 443 端口 (#0) * 尝试连接 207.97.227.239... * 成功设置证书验证位置: * CA文件: 无 CA路径: /usr/ssl/certs * SSL 证书问题,请验证 CA 证书是否正确。详情: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed * 过期已清除 * 关闭连接 #0 * 正在连接到 github.com 的 443 端口 (#0) * 尝试连接 207.97.227.239... * 成功设置证书验证位置: * CA文件: 无 CA路径: /usr/ssl/certs * SSL 证书问题,请验证 CA 证书是否正确。详情: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed * 过期已清除 * 关闭连接 #0 错误:SSL 证书问题,请验证 CA 证书是否正确。详情: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 访问 https://github.com/username/ExcelANT.git/info/refs
fatal: HTTP request failed

这是我的防火墙、Cygwin还是其他问题?

我没有在Git配置中设置HTTP代理。然而,这是一个需要NTLM身份验证的ISA服务器,而不是基本身份验证,所以除非有人知道如何强制Git使用NTLM,否则我就无法解决了。


如果我将 http.sslVerify 设置为 false,那么连接是安全的吗?并且这是一个好的路径可以使用吗?我们之间使用 pfsense 防火墙。现在,用户配置文件上的 .gitconfig 文件为空白。 - Nullpointer
31个回答

535
问题在于您的系统���没有安装任何证书颁发机构(CA)证书。而这些证书无法通过Cygwin的setup.exe进行安装。
在Cygwin中安装Net/ca-certificates软件包(感谢dirkjot)。
有两种解决方案:
  1. 实际安装根证书。Curl团队已经为您从Mozilla中提取了证书
cacert.pem文件就是您要找的文件。该文件包含250多个CA证书(不知道如何信任这么多人)。您需要下载此文件,将其拆分为单个证书��将它们放入/usr/ssl/certs(您的CApath)并对其进行索引。
以下是操作步骤。使用Cygwin setup.exe安装curl和OpenSSL软件包。
执行:
<!-- language: lang-bash -->

    $ cd /usr/ssl/certs
    $ curl http://curl.haxx.se/ca/cacert.pem |
      awk '{print > "cert" (1+n) ".pem"} /-----END CERTIFICATE-----/ {n++}'
    $ c_rehash

重要提示:要使用 c_rehash 命令,您还需要安装 openssl-perl

  1. 忽略 SSL 证书验证。

    警告: 禁用 SSL 证书验证会存在安全隐患。在没有验证 SSL/HTTPS 连接的真实性的情况下,恶意攻击者可以冒充受信任的终端点(如 GitHub 或其他远程 Git 主机),您将容易受到 中间人攻击 的威胁。因此,请在使用此解决方案之前完全了解安全问题和您的威胁模型。请确保您充分理解安全问题和威胁模型,然后再使用此解决方案。

    env GIT_SSL_NO_VERIFY=true git clone https://github...


10
不需要安装curl,只需使用wget:wget -O - http://curl.haxx.se/ca/cacert.pem | awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}' - Deebster
40
我知道这是Cygwin,但如果有人使用Centos到达此处,则应将.pem文件放在/etc/pki/tls/certs中。 - Stop Slandering Monica Cellio
8
这个答案是错误的。只需安装Cygwin的ca-certificates软件包即可获得缺失的根证书。为什么这个答案会得到这么多赞? - rurban
3
在我这里起作用了。在运行c_rehash之前,需要安装openssl-perl(在CentOS中)。 - makriria
33
不要关闭SSL证书验证。 在整个行业的工具和应用程序代码中,这种情况时常发生。这会让您容易受到中间人攻击。如果要使用SSL,请正确使用它。 - Tim
显示剩余18条评论

450

注意: 禁用SSL验证具有安全风险。这将允许中间人攻击,当您使用Git在网络上传输数据时。请确保在将其作为解决方案之前,您充分了解安全风险。或者更好的方法是安装根证书。

一种方法是禁用SSL证书验证:

git config --global http.sslVerify false
这将阻止 CURL 验证 HTTPS 证书。
仅适用于一个存储库:
git config http.sslVerify false

17
如不希望编辑您的全局设置(例如所有存储库),请使用 --global 排除。 - Erin
60
请在注释中提及这是极其危险的。 - Chronial
28
这个主意很糟糕。核实证书的原因是有其必要性的。如果您不确认证书的可信性,那么这个证书就可能由任何人伪造,从而让您容易受到中间人攻击的威胁。 - Mark Carey
27
不要关闭SSL验证! - Tim
14
对于所有“不要这么做”的人:确实,这绝非最安全的方法。但是,它比根本没有SSL要好得多!因为有些人只运行他们的私人简单Git服务器,并且对他们而言这样做就足够了。当然,对于任何真正的安全性来说,这都是不可取的设置。最不安全的事情是将纯文本字节通过网络发送。 - Peter Stegnar
显示剩余19条评论

114

我希望Git使用更新的证书包,而不是替换整个系统使用的证书包。以下是如何让Git使用我家目录中的特定文件:

mkdir ~/certs
curl https://curl.haxx.se/ca/cacert.pem -o ~/certs/cacert.pem

现在更新.gitconfig以使用此进行对等验证:

[http]
sslCAinfo = /home/radium/certs/cacert.pem

请注意我正在使用绝对路径。 Git在此处不进行路径扩展,因此您不能使用 ~ 而不进行丑陋的修补。或者,您可以跳过配置文件,而是通过环境变量 GIT_SSL_CAINFO 设置路径。

要解决此问题,请设置 GIT_CURL_VERBOSE = 1 。 Git正在使用的CA文件的路径将显示在以“ CAfile:”开头的行中。


12
对我来说,这是最好的答案:它适用于Unix(实际上是NetBSD),仅影响git而不影响系统上的其他任何东西,并且不需要root /管理员访问权限。谢谢! - Eric
1
完美,甚至可以做得更好。我已经用这个文件替换了我的Ubuntu 8.04 LTS上旧的/etc/ssl/certs/ca-certificates.crt,神奇地它就起作用了! - Michael-O
1
@Eric 感谢您提到NetBSD,因为这意味着我找到了这个答案。 NetBSD 有点奇怪。我安装了 OpenSSL 包,但即使如此,也无法获得证书,只有一个占位符目录。 - atomicules
+200 更棒的是,它也在我的Ubuntu系统上运行良好。无需在git中禁用证书检查,只需进行这个快速修复即可。 - Colin D Bennett
12
非常好的答案,您可以使用以下命令来跳过手动编辑 ~/.gitconfig 文件:git config --global http.sslCAinfo "$HOME/certs/cacert.pem" - Aron Ahmadia
显示剩余3条评论

63

如果您想解决证书问题,可以跳过此答案。这个答案涉及到通过防火墙隧道化SSH的方法,相比于使用防火墙/代理更加好用。

有一种比使用HTTP访问更好的方式,那就是在ssh.github.com服务器的443端口上使用GitHub提供的SSH服务。

我们使用一个叫做Corkscrew的工具。它适用于Cygwin(通过从Cygwin主页安装)和Linux(使用你喜欢的打包工具)。对于Mac OS X,至少可从MacPortsHomebrew(可执行文件brew)中获取。

命令行如下:

corkscrew <proxyhost> <proxyport> <targethost> <targetport> <authfile>

proxyhostproxyport是HTTPS代理的坐标。 targethosttargetport是要隧道连接到的主机的位置。 authfile是一个文本文件,其中一行包含用冒号分隔的代理服务器用户名/密码。

E.g.:

abc:very_secret

使用“普通”SSH协议进行Git通信的安装。

通过将此内容添加到〜/ .ssh / config中,可以将此技巧用于普通SSH连接。

Host github.com
  HostName ssh.github.com
  Port 443
  User git
  ProxyCommand corkscrew <proxyhost> <proxyport> %h %p ~/.ssh/proxy_auth

现在你可以通过ssh连接到gitproxy来测试它是否正常工作:

ssh github.com

输出:

PTY allocation request failed on channel 0
Hi ptillemans! You've successfully authenticated, but GitHub does not provide shell access.
       Connection to github.com closed.

(备注:如果您之前从未登录过GitHub,则 ssh 将会要求将服务器密钥添加到已知主机文件中。如果您是多疑的,建议验证RSA指纹是否与上传密钥的GitHub网站上显示的一致)。

稍有变化的方法是当您需要使用另一个密钥访问存储库时,例如,将您的私人账户与您的专业账户分开。

# Account dedicated for the ACME private GitHub account
#
Host acme.github.com
  User git
  HostName ssh.github.com
  Port 443
  ProxyCommand corkscrew <proxyhost> <3128> %h %p ~/.ssh/proxy_auth
  IdentityFile ~/.ssh/id_dsa_acme

享受吧!

我们多年来一直在Linux、Mac和Windows上使用它。

如果您想了解更多信息,可以在此博客文章中阅读更多内容


我曾经放弃让它工作,但又重新审视了一下,并让它工作起来了。将.ssh/config更改为
Host ssh.github.com User oharab Hostname ssh.github.com Port 443 PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa
并使用git clone git@ssh.github.com:oharab/log4vba.git进行克隆,很快就可以运行了。
- oharab
1
我只是在点踩,因为下面的答案更有帮助,但不幸的是stackoverflow总是把被采纳的答案放在最上面,即使它只是针对某种特定情况的答案。 - mjaggard
1
无论如何,我更新了答案,因为我发现通过https代理进行SSL隧道仍然比摆弄HTTPS证书或禁用它们并最终得到一个性能更低、用户友好度更低且不太安全的解决方案要好。虽然有很多赞成我的观点,但在这个问题上我仍然坚持我的意见。 - Peter Tillemans
代理是中间人。如果你确定可以信任他,那么应该没问题,但唯一真正的解决方案是“处理防火墙/代理问题”。如果安全性不重要,使用SSL就没有任何意义... - The incredible Jan

42
请注意,在我这里让它工作(在CentOS 5.6上安装RVM), 我必须运行以下命令: export GIT_SSL_NO_VERIFY=true 之后,按标准安装程序将RVM安装器 curl 到 Bash 中,就可以愉快地工作啦 :)

13
具有与 "git config --global http.sslverify false" 相同的效果。 - Dyno Fu
23
这非常危险!SSL证书验证的主要目的是保护你在使用HTTPS传输代码时不被篡改!禁用它意味着恶意人士可以在你推送和提取代码时插入漏洞和其他危险内容! - user456814
如果我将http.sslVerify设置为false,那么连接就会安全吗?这是一个好的使用方法吗?我们之间使用pfsense防火墙。 - Nullpointer
1
@Ravi,从技术上讲,连接可以工作,但毫无疑问这绝不是一个好主意。如果您的git源和本地机器都是内部的并且在您的组织控制下,那么这可能是可以接受的,但根据user456814的评论,禁用验证会使您容易受到中间人攻击的威胁。 - Doktor J

41
一种非常简单的解决方案:将 https:// 替换为 git:// 使用 git://the.repository 代替 https://the.repository,就可以解决问题。
我在 Windows 上使用 TortoiseGit 时遇到了这个问题,这个方法解决了它。

我猜这个方法可行是因为它不验证 git:// 的 SSL。正如此答案中所述,禁用 SSL 验证存在安全风险。 - danijar
5
@danijar 这个方法有效的原因是因为 它根本不使用 SSLgit://协议使用 SSH,该协议使用 SSH 公钥和私钥对进行身份验证和加密,而不是 SSL 证书。 - user456814
11
git:// 不使用 SSH。请参考SSH协议Git协议 - alexia
@nyuszika7h 哦,你说得对。我总是把 git://git@github.com:user/project.git(这是类似于SCP的语法)搞混了。参见此处 - user456814
谢谢!这对我有用,使用MSYS2 Git和TinyWall防火墙。 - sailfish009

33
作为最受欢迎的答案(由Alexey Vishentsev提供):
问题在于您的系统上没有任何认证机构证书安装。而这些证书无法通过cygwin的setup.exe安装。
然而,这个最后的说法是错误的(现在或者一直都是我不知道)。
你所要做的就是打开Cygwin安装程序并包含'ca-certificates'软件包(它在Net下)。这对我起了作用。

1
Cygwin Git 出现错误,显示 CAfile: /etc/ssl/ca-bundle.crt,而 Cygwin ca-certificates 包安装了 /usr/ssl/certs/ca-bundle.crt。因此,必须编辑 ~/.gitconfig 来指定位置:[http] 然后 sslCAinfo = /usr/ssl/certs/ca-bundle.crt - maxpolk
@maxpolk:我本来想放一个链接的,但效果是一样的。这显然是cygwin git中的一个bug,你考虑过提交一个工单吗?sudo ln -s /usr/ssl/certs/ca-bundle.crt /etc/ssl/ - dirkjot
截至2013年5月23日,如果您还安装了/记得安装cygwin的“ca-certificates”,则Cygwin Git通过https正常工作。 - bobbogo
我从这个问题来到这里,该问题表明可以在此处找到答案。然而,链接的答案和这个答案都不适用于我;TortoiseSVN一直输出“错误:SSL证书问题,请验证CA证书是否正确。” - O. R. Mapper
我们应该从软件包管理器中的哪个位置安装cygwin安装文件呢?ca-certificates需要放在Git的bin文件夹中吗? - 221b
@user1650978:你应该使用Cygwin安装程序(名为setup.exe)并安装这个额外的软件包。就这样。不需要复制文件或指定目标。 - dirkjot

19
在 Windows 上克隆并将 SSL 验证设置为 false:
git -c http.sslVerify=false clone http://example.com/e.git

如果您想进行克隆而不破坏全局设置。

17

这对我很有效,但是像 OP 建议的那样,你应该先备份原始文件。如果您使用的系统较旧,则似乎会在 Github 更新其证书时发生此问题。 - Evan Donovan
在CentOS 5上,我通过yum update openssl修复了它,这也更新了ca-bundle。 - raarts
如果您选择此选项,则应在使用文件之前验证其SHA-256哈希值。您可以通过除您正在设置的curl之外的其他方式(例如已经安全设置的不同机器上的浏览器)获取当前文件的sha256sum,然后将其与sha256sum /etc/pki/tls/certs/ca-bundle.crt的输出进行比较,以确保您获取了正确的文件。 - kbolino
链接已经失效: "嗯,我们无法找到该网站。我们无法连接到eric.lubow.org上的服务器。" - Peter Mortensen

15
在CentOS 5.x上,简单的yum update openssl命令可以更新OpenSSL软件包,从而更新系统的ca-bundle.crt文件,并为我解决了问题。
其他发行版也可能适用相同的方法。

太棒了!这对我旧版(4.1.2)的Red Hat Linux安装起作用了。谢谢! - Josh

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