SSL证书拒绝尝试通过HTTPS后面的防火墙访问GitHub

oha*_*rab 380 git ssl cygwin github ssl-certificate

我被困在防火墙后面,所以必须使用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证书是否正常.详细信息:
错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:访问https时出现证书验证失败:https://github.com/username/ExcelANT.git/info/refs

打开GIT_CURL_VERBOSE=1给我

*关于connect()到github.com端口443(#0)
*尝试207.97.227.239 ...*成功设置证书验证位置:
*CAfile:无
CApath:/ usr/ssl/certs
*SSL证书问题,验证CA证书没问题.详细信息:
错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
*过期已清除
*关闭连接#0
*关于连接()到github.com端口443(#0)
*尝试207.97.227.239 ...*成功设置证书验证位置:
*CAfile:无
CApath:/ usr/ssl/certs
*SSL证书问题,验证CA证书是否正常.细节:
错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
*过期已清除
*关闭连接#0
错误:SSL证书问题,验证CA证书是否正常.详细信息:
错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:访问https时出现证书验证失败:https://github.com/username/ExcelANT.git/info/refs

fatal: HTTP request failed
Run Code Online (Sandbox Code Playgroud)

这是我的防火墙,cygwin还是什么问题?

我没有在Git配置中设置HTTP代理,但是它是一个需要NTLM身份验证的ISA服务器,而不是基本身份,所以除非有人知道如何强制git使用NTLM,否则我会被打破.

小智 517

问题是您没有在系统上安装任何证书颁发机构证书.并且这些证书不能与cygwin的setup.exe一起安装.

更新:在cygwin中安装Net/ca-certificates包(感谢dirkjot)

有两种解决方案:

  1. 实际上安装根证书.Curl家伙为你提取Mozilla的证书.

    cacert.pem文件是你要找的.此文件包含> 250个CA证书(不知道如何信任此数量的ppl).您需要下载此文件,将其拆分为单个证书,将它们放入/ usr/ssl/certs(您的CApath)并对其进行索引.

    这是怎么做的.使用cygwin setup.exe安装curl和openssl包执行:

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

    重要提示:为了使用c_rehash您还必须安装openssl-perl.

  2. 忽略SSL证书验证.

    警告:禁用SSL证书验证具有安全隐患.如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到中间人攻击.在将此作为解决方案之前,请确保完全了解安全问题威胁模型.

    $ env GIT_SSL_NO_VERIFY=true git clone https://github...
    
    Run Code Online (Sandbox Code Playgroud)

  • 我知道这是cygwin,但是如果有人使用Centos到达这里,那么.etm应该去的是/ etc/pki/tls/certs. (37认同)
  • 请勿关闭SSL证书验证.这在整个行业的工具和应用程序代码中经常发生.它会打开一个中间人攻击的人.如果您打算使用SSL,请正确使用它. (32认同)
  • 你不需要安装curl,只需使用wget:`wget -O - http://curl.haxx.se/ca/cacert.pem | awk'split_after == 1 {n ++; split_a fter = 0}/----- END CERTIFICATE -----/{split_after = 1} {print>"cert"n".pem"}'` (9认同)
  • 这个答案是对的.只需安装cygwin`ca-certificates`包即可获得缺少的根证书.为什么这个答案得到这么多的答案? (7认同)
  • 不适合我 - 但是,我的路径中没有c_rehash.我试过重启我的shell.我还必须使用mkdir -p/usr/ssl/certs.我想知道我的Cygwin安装是否有所不同或遗漏了什么?此外,设置GIT_SSL_NO_VERIFY = true,然后运行克隆操作导致此错误:'fatal:https://code.google.com/.../info/refs not found:你是否运行了git update-server-info on服务器?`也许它会在重启后工作? (2认同)
  • 它对我有用.在运行c_rehash之前,需要yum install openssl-perl(以centos为单位) (2认同)
  • $ env GIT_SSL_NO_VERIFY = true git clone https:// github ...这工作谢谢 (2认同)

Yi *_*hao 424

注意:禁用SSL验证具有安全隐患.当您使用Git通过网络传输数据时,它允许中间人攻击.在将此作为解决方案之前,请确保完全了解安全隐患.或者更好的是,安装根证书.

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

git config --global http.sslVerify false
Run Code Online (Sandbox Code Playgroud)

这将阻止CURL验证HTTPS认证.

仅适用于一个存储库:

git config http.sslVerify false
Run Code Online (Sandbox Code Playgroud)

  • 你能不能补充说明这是多么危险? (55认同)
  • 这是一个糟糕的主意.有证据证明应该验证证书.如果您没有将证书验证为可信任,那么任何人都可以生成证书,并且您可能容易受到中间人攻击的影响. (26认同)
  • 不要关闭SSL验证! (23认同)
  • 如果您不想编辑全局设置(例如所有回购),请排除--global (16认同)
  • 对于所有"不要做"的人:当然,这根本不是最安全的方法.但是,完全不使用SSL是更好的选择!因为有些人只运行他们的私人简单git服务器,对他们来说很好.当然,对于任何真正的安全性,它都是NO GO设置.最不安全的事情是通过网络发送普通字节. (14认同)
  • 对于那些拥有自签名证书的私人服务器的人来说,这将有所帮助.这家伙提供的解决方案......并不是每个人都会同意,但它可能会解决某些问题.这就是这个网站的意义所在.StackOverflow充满了意见 - 不是每个人都会同意其他人的想法和决定.说它应该删除是疯了. (4认同)
  • 如果想要启用SSL验证,那么有人需要创建一种方法使其工作,而无需手动安装根证书.也许如果他们刚刚与git或其他东西捆绑在一起,那就可以解决这个问题. (3认同)
  • @PeterStegnar不,这不是***"一个更好的选择".充其量它稍微好一些.任何可以拦截和操纵您的HTTP明文字节的人都可以*拦截并替换证书,然后在使用冒名顶替者证书解密后读取和操作您的HTTPS密文字节.在没有验证证书的情况下使用SSL/TLS获得的唯一好处是流量内容对*被动*侦听器是隐藏的,但任何活跃的攻击者只会稍微不方便. (3认同)
  • 应该删除这个答案.这导致至少247人做错事. (2认同)
  • 它不会"禁用"SSL,您仍然使用安全连接,但没有验证您实际连接到正确的服务器. (2认同)
  • 宇宙倾向于遵循**阻力最小的**路径. (2认同)

ken*_*ada 109

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

mkdir ~/certs
curl http://curl.haxx.se/ca/cacert.pem -o ~/certs/cacert.pem
Run Code Online (Sandbox Code Playgroud)

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

[http]
sslCAinfo = /home/radium/certs/cacert.pem
Run Code Online (Sandbox Code Playgroud)

注意我正在使用绝对路径.Git在这里没有路径扩展,所以你不能没有~丑陋的kludge.或者,您可以跳过配置文件并通过环境变量设置路径GIT_SSL_CAINFO.

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

  • 对我来说,这是最好的答案:它适用于unix(实际上是NetBSD),它只影响git而不影响系统上的任何其他内容,并且它不需要root/Administrator访问权限.谢谢! (12认同)
  • 很好的答案,您可以使用以下命令跳过手动编辑〜/ .gitconfig文件:`git config --global http.sslCAinfo"$ HOME/certs/cacert.pem"` (11认同)

Pet*_*ans 56

如果您想修复证书问题,请随意跳过此答案.这个答案涉及通过防火墙隧道ssh,这是恕我直言,更好的解决方案来处理防火墙/代理的东西.

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

我们使用一种叫做开瓶器的工具.这可以通过CygWin(通过cygwin主页设置)和Linux使用您喜欢的打包工具.对于MacOSX,它至少可以从macports和brew中获得.

命令行如下:

$ corkscrew <proxyhost> <proxyport> <targethost> <targetport> <authfile>
Run Code Online (Sandbox Code Playgroud)

proxyhost和proxyport是https代理的坐标.targethost和targetport是隧道到的主机的位置.authfile是一个文本文件,其中包含由冒号分隔的代理服务器用户名/密码的1行

例如:

abc:very_secret
Run Code Online (Sandbox Code Playgroud)

安装使用"普通"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
Run Code Online (Sandbox Code Playgroud)

现在你可以通过ssh-ing到gitproxy来测试它

pti@pti-laptop:~$ 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.
pti@pti-laptop:~$
Run Code Online (Sandbox Code Playgroud)

(注意:如果你以前从未登录过github,ssh会要求将服务器密钥添加到已知的hosts文件中.如果你是偏执狂,建议验证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
Run Code Online (Sandbox Code Playgroud)

请享用!

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

如果您愿意,可以在此博客文章中阅读更多相关信息


小智 41

请注意,为了让我能够正常工作(在CentOS 5.6上安装RVM),我必须运行以下命令:

export GIT_SSL_NO_VERIFY=true

之后,将RVM安装程序卷入bash的标准安装程序很有效:)

  • ***这非常危险!***SSL证书验证的重点是保护您的代码在通过HTTPS传输时不被篡改!禁用它意味着恶意用户可以在推送和获取时将漏洞和其他令人讨厌的东西插入到代码中! (19认同)
  • 与git config相同的效果--global http.sslverify false (12认同)

klo*_*oma 40

一个非常简单的解决方案:用git://替换https://

使用git://the.repository而不是https://the.repository会起作用.

我在Windows上使用TortoiseGit遇到了这个问题,这解决了它.

  • @Cupcake`git://`不**使用SSH.请参阅[SSH协议](http://git-scm.com/book/ch4-1.html#The-SSH-Protocol)和[The Git Protocol](http://git-scm.com/book/ ch4-1.html#的-GIT中的协议). (11认同)
  • @danijar这个工作的原因是因为它甚至根本不使用SSL***.`git://`协议使用SSH,它使用SSH公钥和私钥对进行身份验证和加密,而不是SSL证书. (5认同)

dir*_*jot 31

最流行的答案(Alexey Vishentsev)有:

问题是您没有在系统上安装任何证书颁发机构证书.并且这些证书不能与cygwin的setup.exe一起安装.

然而,最后一个断言是错误的(现在,或者一直是,我不知道).

你所要做的就是去cygwin设置并包括'ca-certificates'包(它在Net下).这对我有用.


Her*_*III 16

我知道最初的问题列出了Cygwin,但这里是CentOS的解决方案:

curl http://curl.haxx.se/ca/cacert.pem -o /etc/pki/tls/certs/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

资料来源:http://eric.lubow.org/2011/security/fixing-centos-root-certificate-authority-issues/


Way*_*ker 14

在CentOS 5.x上,一个简单的yum update openssl更新了openssl包,它更新了系统ca-bundle.crt文件并为我解决了问题.

其他分布也是如此.


Fla*_*ape 14

要在将SSL验证设置为false时在Windows上进行克隆:

    git -c http.sslVerify=false clone http://example.com/e.git
Run Code Online (Sandbox Code Playgroud)

如果您想要克隆而不需要考虑全局设置.


esq*_*fit 13

如果你想要做的只是使用github.com的Cygwin git客户端,那么有一个更简单的方法,无需经历下载,提取,转换,拆分证书文件的麻烦.继续如下(我假设使用Cygwin和Firefox的Windows XP)

  1. 在Firefox中,转到github页面(任何)
  2. 单击地址栏上的github图标以显示证书
  3. 单击"更多信息" - >"显示证书" - >"详细信息",然后从最上面的一个开始选择层次结构中的每个节点; 对于他们每个人点击"导出"并选择PEM格式:
    • GTECyber​​TrustGlobalRoot.pem
    • DigiCertHighAssuranceEVRootCA.pem
    • DigiCertHighAssuranceEVCA-1.pem
    • github.com.pem
  4. 将上述文件保存在本地驱动器的某处,将扩展名更改为.pem并将其移至Cygwin安装中的/ usr/ssl/certs(Windows:c:\ cygwin\ssl\certs)
  5. (可选)从bash运行c_reshash.

而已.

当然,这只会安装一个证书层次结构,即github所需的层次结构.您当然可以将此方法与任何其他站点一起使用,而无需安装200个您不一定信任的站点证书.


rez*_*afi 10

您可以在终端中尝试此命令:

git config --global http.sslVerify false


A-D*_*ubb 8

如果您使用的是Mac OS X,则可以通过以下方式安装ca-cert-bundle homebrew:

$ brew install curl-ca-bundle
$ git config --system http.sslcainfo /usr/local/share/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

公式通过以下方式将证书捆绑包安装到您的共享:

share.install 'ca-bundle.crt'
Run Code Online (Sandbox Code Playgroud)

share方法只是一个别名/usr/local/share,并且curl-ca-bundle由提供Mozilla.这就是你在许多问题中被引用的内容.希望这brew install curl会有所帮助,因为它在Mac OS X上如何处理它并不是非常简单.不会因为它只是桶而且不会链接(运行which curl将始终输出/usr/bin/curl,这是您的随附的默认值) OS).这篇文章也可能有一些价值.

您当然需要在安装之前禁用SSL,homebrew因为它是一个git repo.在SSL验证过程中出现错误时,只需执行curl所说的内容:

$ echo insecure >> ~/.curlrc
Run Code Online (Sandbox Code Playgroud)

一旦你homebrew安装了curl-ca-bundle,删除.curlrc并尝试在github上克隆一个repo.确保没有错误,你会很高兴.

注意:如果您确实使用.curlrc,请在完成测试时将其从系统中删除.此文件可能会导致重大问题,因此请将其用于临时目的并谨慎使用.brew doctor如果您忘记从系统中清除它,我们会抱怨).

注意:如果您更新您的git版本,则需要重新运行此命令,因为系统设置将被清除(它们是根据版本相对于git二进制文件存储的).

跑完后:

$ brew update
$ brew upgrade
Run Code Online (Sandbox Code Playgroud)

如果您获得了新版本的git,那么只需重新运行:

$ git config --system http.sslcainfo /usr/local/share/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

你会全力以赴.

最后,如果你有一个新版本的git,运行:

$ git config -l --system
Run Code Online (Sandbox Code Playgroud)

应该给你一个错误

fatal: unable to read config file '/usr/local/Cellar/git/1.8.2.2/etc/gitconfig'

这是你的提示,你需要告诉git Mozilla ca-bundle的位置.

更新:

.curlrc可能会也可能不是您问题的补救措施.无论如何,无论是否需要手动下载,都只需在机器上安装Mozilla ca-bundle.这就是重要的.一旦你获得了ca-bundle,你就可以去了.只需运行git config命令并将git指向ca-bundle即可.

UPDATE

我最近不得不补充:

export CURL_CA_BUNDLE=/usr/local/share/ca-bundle.crt.zshenv我正在使用我的点文件zsh.该git config选项适用于大多数情况,但是当通过SSL(rvm get stable例如)访问github时,我仍遇到证书问题.@Maverick在他的评论中指出了这一点,但万一有人错过了它或者假设除了运行git config --system....命令之外他们不一定需要导出这个环境变量.谢谢,希望这会有所帮助.

UPDATE

它看起来像卷曲-CA-束最近从自制删除.这里有一个建议.

您需要将一些文件放入:

$(brew --prefix)/etc/openssl/certs


小智 6

I've been having this same problem for Solaris Express 11. It took me a while but I managed to find where the certificates needed to be placed. According to /etc/openssl/openssl.cnf, the path for certificates is /etc/openssl/certs. I placed the certificates generated using the above advice from Alexey.

You can verify that things are working using openssl on the commandline:

openssl s_client -connect github.com:443
Run Code Online (Sandbox Code Playgroud)


sag*_*nms 5

我使用apt-cyg(一个类似于apt-get的优秀安装程序)修复了这个问题,以便轻松下载ca-certificates(包括Git等等):

apt-cyg install ca-certificates
Run Code Online (Sandbox Code Playgroud)

注意:应首先安装apt-cyg.您可以从Windows命令行执行此操作:

cd c:\cygwin
setup.exe -q -P wget,tar,qawk,bzip2,subversion,vim
Run Code Online (Sandbox Code Playgroud)

关闭Windows cmd,然后打开Cygwin Bash:

wget rawgit.com/transcode-open/apt-cyg/master/apt-cyg
install apt-cyg /bin
Run Code Online (Sandbox Code Playgroud)


小智 5

Raspberry Pi上我有:

git clone http://github.com/andreafabrizi/Dropbox-Uploader.git
Run Code Online (Sandbox Code Playgroud)

输出:

Cloning into 'Dropbox-Uploader'...
error: Problem with the SSL CA cert (path? access rights?) while accessing http://  github.com/andreafabrizi/Dropbox-Uploader.git/info/refs
fatal: HTTP request failed
Run Code Online (Sandbox Code Playgroud)

所以我做了一个

sudo apt-get install ca-certificates
Run Code Online (Sandbox Code Playgroud)

进而

git clone http://github.com/andreafabrizi/Dropbox-Uploader.git
Run Code Online (Sandbox Code Playgroud)

工作过


Pat*_*ick 5

如果你使用基于 debian 的操作系统,你可以简单地运行

apt-get install ca-certificates


Dry*_*_09 5

从 GitHub 生成访问令牌并保存它,因为它不会再次出现。

git -c http.sslVerify=false clone https://<username>:<token>@github.com/repo.git
Run Code Online (Sandbox Code Playgroud)

或者,

git config --global http.sslVerify false
git clone https://github.com/repo.git
Run Code Online (Sandbox Code Playgroud)