在Windows上使用带有自签名证书的git无法解决“无法获取本地发行者证书”


283

我在Windows上使用Git。我安装了msysGit软件包。我的测试库在服务器上具有一个自签名证书。我可以使用HTTP访问和使用存储库,而不会出现问题。转到HTTPS会出现错误:

SSL证书问题:无法获取本地颁发者证书。

我在Windows 7-客户端计算机的“受信任的根证书颁发机构”中安装了自签名证书。我可以在Internet Explorer中浏览到HTTPS存储库URL,而不会出现错误消息。

Philip Kelley撰写的此博客文章解释说cURL不使用客户端计算机的证书存储。我按照博客文章的建议创建了一个私有副本,curl-ca-bundle.crt并配置了Git以使用它。我确定Git正在使用我的副本。如果我重命名副本;Git抱怨文件丢失。

我粘贴了证书,如博客文章中所述,我仍然收到消息“无法获取本地发行者证书”。

我通过HTTPS克隆GitHub Repository来验证Git仍在工作。

我唯一看到的与博客文章不同的是我的证书根-没有链可以到达它。我的证书最初来自单击IIS8 IIS管理器链接“创建自签名证书”。也许这会使证书与cURL所期望的有所不同。

如何获取Git / cURL接受自签名证书?



1
还检查是否允许您的本地网络将文件推送到github存储库。可能有一些防火墙或防病毒限制。
shasi kanth'Mar

如果有人在使用Bower时遇到此错误,请创建一个带有content的.bowerrc文件{ "strict-ssl": false }。不用了,谢谢我,谢谢这个家伙:stapp.space/fight-with-2我已经连续5个小时与这个错误作战了!
Ganesh Jadhav

Answers:


267

如果要完全禁用SSL验证,请打开Git Bash并运行命令。

git config --global http.sslVerify false

注意:此解决方案可能使您容易受到中间人攻击之类的攻击。因此,请尽快重新启用验证:

git config --global http.sslVerify true

70
该答案通过允许中间人攻击而破坏了SSL的安全性。其他答案已经说明了如何配置git以信任您需要的特定证书。
dsh 2015年

12
确实,这是一个可怕的答案,您甚至没有告诉他们重新打开SSL。这就是为什么发生安全漏洞的原因。
Edgar Aroutiounian '16

如果您使用的是Gitblit,那么除了sshVerify false之外,没有其他选择。
萨米尔

24
要为单个git命令禁用TLS / SSL验证,请使用以下命令:git -c http.sslVerify=false clone https://domain.com/path/to/git
Maxim Suslov

1
下面已经提供了几种解决方案,我已经提出了缺点。因此,由您决定要选择哪种解决方案来解决问题。
萨米尔

153

问题是默认情况下,git使用“ Linux”加密后端。

从Windows 2.14的Git开始,您现在可以将Git配置为使用SChannel(内置Windows网络层作为加密后端)。这意味着您将使用Windows证书存储机制,而无需显式配置curl CA存储机制:https : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa380123(v= vs.85).aspx

只需执行:

git config --global http.sslbackend schannel

那应该有帮助。

现在,在Windows上安装git时,使用schannel是标准设置,此外,建议不要再通过SSH检出存储库,因为https易于配置且不太可能被防火墙阻止,因此故障发生的可能性较小。


1
但是请注意,此解决方案可能git config --global http.sslCAInfo <my-server-self-signed-cert.pem>无法正常工作。我配置http.sslCAInfo为对服务器使用自签名证书,这是我在执行“ a”时遇到“ SSL证书问题:无法获取本地发行者证书”的原因(可能与OP不同)git clone https://github.com/Microsoft/vscode.git。最后,我使用了stackoverflow.com/a/47196562/1323552(Ben PP Tung)的答案来调整git服务器特有的sslCAInfo配置以解决该问题。
Johnny Wong,

94

我也有这个问题。就我而言,我试图获得一个接收后的Git钩子,以便每次推送时更新服务器上的工作副本。尝试按照您链接到的博客中的说明进行操作。不适用于我,按用户覆盖设置似乎也不起作用。

我最终要做的就是为整个Git禁用SSL验证(如本文所述)。不是完美的解决方案,但是直到我找到更好的解决方案,它才会起作用。

我编辑了位于以下位置的Git配置文本文件(使用我最喜欢的行尾中性应用程序,如Notepad ++)。

C:\ Program Files(x86)\ Git \ etc \ gitconfig

在[http]块中,我添加了一个选项来禁用sslVerify。完成后看起来像这样:

[http]
    sslVerify = false
    sslCAinfo = /bin/curl-ca-bundle.crt

做到了。

注意:

  • 这将禁用SSL验证,因此不建议将其作为长期解决方案。

  • 您可以禁用每个存储库,但这仍然不是很好,但是可以本地化设置。

  • 随着LetsEncrypt.org的出现,现在可以相当简单,自动化和免费地将SSL设置为自签名证书的替代方法,并且无需关闭sslVerify。


145
这违反了SSL的目的。
syaz 2014年

49
您可以使用命令“ git config --global http.sslVerify false”禁用SSL验证
CleanCoder 2014年

6
感谢您指出sslCAinfo配置条目;但我没有赞成这个答案,因为在git系统范围内永久禁用SSL并没有多大意义(您尝试过在系统范围内禁用它,然后进行克隆,然后重新启用它,然后在新克隆的仓库的本地git配置?)。
7heo.tk 2015年

35
对于一次性命令,无需更改配置文件:git -c http.sslVerify=false clone https://...
pts 2016年


51

kiddailey我认为非常接近,但是我不会禁用ssl验证,而只是提供本地证书:

在Git配置文件中

[http]
    sslCAinfo = /bin/curl-ca-bundle.crt

或通过命令行:

git config --global http.sslCAinfo /bin/curl-ca-bundle.crt

7
在Windows的git上,这是git config --global http.sslCAinfo /usr/ssl/certs/ca-bundle.crt
Karsten Tinnefeld,2016年

还是对我来说git config --global http.sslCAinfo /c/Program\ Files\ \(x86\)/Git/bin/curl-ca-bundle.crt
麻雀

对于MacPorts上的用户,这是git config --global http.sslCAinfo /opt/local/share/curl/curl-ca-bundle.crt
miken32 '17

3
使用Git 2.8,您可以git config --list --show-origin用来查看http.sslCAinfo配置的设置位置
Anish

我在Mac上的证书位置是:〜/ macports / share / curl / curl-ca-bundle.crt
user3282611

47

我也面临这个问题。最终通过从此MSDN博客获得指导得到解决。

更新资料

实际上,您需要在git的证书文件curl-ca-bundel.cert中添加证书,该文件位于Git \ bin目录中。

脚步

  1. 在浏览器中打开您的github页面,然后单击地址栏中的锁定图标。
  2. 在打开的小弹出窗口中,导航到“查看证书”链接,它将打开一个弹出窗口。
  3. 在其中导航到“证书”选项卡(在我的情况下为第3个)。选择作为根证书的顶部节点。然后按底部的“复制证书”按钮并保存文件。
  4. 在文件浏览器中,导航到Git \ bin目录,然后在文本编辑器中打开curl-ca-bundle.crt。
  5. 同样在文本编辑器中打开导出的证书文件(在步骤3中)。
  6. 将所有内容从导出的证书复制到curl-ca-bundle.crt的末尾,然后保存。

最后检查状态。请注意,在编辑之前请备份curl-ca-bundle.crt文件,以确保安全。


3
“导航Git \ bin目录并打开curl-ca-bundle.crt” git \ bin中没有curl-ca-bundle.crt!
安东·K

@AntonK(如果不存在),在记事本中创建一个自己,然后使用curl-ca-bundle.crt重命名。其他步骤保持不变。
Nadeem Jamali

16
@AntonK可以称为just ca-bundle.crt并且位于mingw64\ssl\certs或中mingw32\ssl\certs
伊恩·坎普

将此用于Atlassian的SourceTree。捆绑的GIT安装位于%userprofile%\ appdata \ local \ attlassian \ sourcetree \ git_local中。curl-ca-bundle.crt已经存在,附加了我的base64编码的导出根证书。
Xanothos

40

回答这个问题,使用makecert发展SSL固定这对我来说。

我不知道为什么,但是由IIS管理器中的简单“创建自签名证书”链接创建的证书无法解决问题。在创建和安装自签名CA Root的链接问题中,我遵循了该方法。然后使用该证书为我的服务器颁发服务器身份验证证书。我将它们都安装在IIS中。

这使我的情况与原始问题中引用的博客相同。将根证书复制/粘贴到curl-ca-bundle.crt中后,就满足了git / curl组合的要求。


“我不知道为什么,但是由IIS管理器中的简单'创建自签名证书'链接创建的证书无法解决问题……” -我所知,它会创建格式错误的证书。创建X.509证书时有很多规则。“尽力使它工作”不再有效。另请参见如何与证书颁发机构签署证书签名请求以及如何使用openssl创建自签名证书?
jww '17

这对我有用,但是我暂时挂断了“将它们都安装在IIS中”部分。为了让他人...自己在IIS中分配了服务器证书,并且需要通过Windows证书管理器实用程序(certmgr.msc)将根CA导入“受信任的根证书颁发机构”
Philip

26

为了避免完全禁用ssl验证或复制/破解git使用的捆绑CA证书文件,您可以将主机的证书链导出到一个文件中,并让git使用它:

git config --global http.https://the.host.com/.sslCAInfo c:/users/me/the.host.com.cer

如果这样不起作用,则可以仅对主机禁用ssl验证:

git config --global http.https://the.host.com/.sslVerify false

注意:关闭ssl验证时,可能会受到中间人的攻击。


4
可能值得注意的是,该--global选项不是必需的:如果省略--global,则设置仅适用于该特定的git repo。
Wes Turner

19

我刚刚遇到了同样的问题,但是在Windows上使用sourcetree。对于Windows上的普通GIT,也执行相同的步骤。按照以下步骤,我能够解决此问题。

  1. 获取服务器证书树这可以使用chrome完成。导航到服务器地址。单击挂锁图标并查看证书。将所有证书链导出为base64编码文件(PEM)格式。
  2. 将证书添加到GIT信任配置文件的信任链中。运行“ git config --list”。找到“ http.sslcainfo”配置,该配置显示证书信任文件所在的位置。将所有证书复制到信任链文件中,包括“--BEGIN--”和“--END--”。
  3. 确保将整个证书链添加到证书文件

这应该可以解决您使用自签名证书和使用GIT的问题。

我尝试使用“ http.sslcapath”配置,但这没有用。另外,如果我没有在证书文件中包括整个链,那么这也会失败。如果有人对此有指示,请告诉我,因为对于新安装必须重复上述操作。

如果这是系统GIT,则可以使用TOOLS-> options GIt选项卡中的选项来使用系统GIT,这也可以解决sourcetree中的问题。


2
“如果我没有在证书文件中包括整个链,那么这也会失败”-我遇到了这个问题
Amani Kilumanga

就整个链而言,我在github证书之上有两个证书。是否在sslcainfo.crt文件中以root-> next cert-> github cert的顺序包含它们?
Jecoms '16

我仅通过添加根证书就能访问git repo软件包。
Jecoms '16

对于未来的读者。不知道这是否重要,但是我将“根”(最顶层)证书放在(http.sslcainfo)文件的末尾。然后,当我离开链中的根证书时,将该证书放在(http.sslcainfo)文件的上一个条目上方。
granadaCoder

11

如果是github仓库(或任何非自签名证书),则在安装Windows上的Git时在下面选择即可解决此问题。

在此处输入图片说明


1
您似乎回答了另一个问题。OP的问题涉及Windows客户端上的自签名证书。
jww

@jww问题标题是git错误消息,即使repo不是自签名SSL也会显示该错误消息!
贾瓦德·谢赫

这使我通过了错误,但是对于我来说,访问GitHub Enterprise要求生成一些密钥并添加公共/私有密钥。
ΩmegaMan

1
如果自签名证书已由有用的Windows管理员通过组策略放入Windows证书存储中,则此答案也是一个好答案。
JamesD

7

我之前遇到过此问题,请使用以下配置解决它。

[http "https://your.domain"] sslCAInfo=/path/to/your/domain/priviate-certificate

从git 2.3.1开始,您可以https://your.domain在http后面放置以表示以下证书仅适用于它。


1
这是我找到的最简单,最精确的解决方案,如果您git config --global http.sslCAInfo <your-server-self-signed-cert.pem>之前也进行过配置(因此会导致“无法获取本地发行者证书”错误)
Johnny Wong

这是对我的问题的正确答案(而不仅仅是“禁用SSL验证” ~~)。不知道您只能为特定主机指定证书的位置。高手!
罗西奥·加西亚·卢克


1

使我困惑的一件事是路径的格式(在Windows PC上)。我最初有这个:

git config --global http.sslCAInfo C:\certs\cacert.pem

但这失败并显示“无法获取本地发行者证书”错误。

最终起作用的是:

git config --global http.sslCAInfo "C:\\certs\\cacert.pem"

1

就我而言,由于我已经安装了适用于Windows 7 的ConEmu Terminal,它将ca-bundle在安装过程中创建C:\Program Files\Git\mingw64\ssl\certs

因此,我必须在终端上运行以下命令以使其工作:

$ git config --global http.sslbackend schannel
$ git config --global http.sslcainfo /mingw64/ssl/certs/ca-bundle.crt

因此,我C:\Program Files\Git\etc\gitconfig包含以下内容:

[http]
    sslBackend = schannel
    sslCAinfo = /mingw64/ssl/certs/ca-bundle.crt

另外,在安装Git时,我选择了此处提到的相同选项。

希望有帮助!


1

要修复especific错误SSL证书问题:无法在git中获取本地颁发者证书

我让我们加密证书存在相同的问题。

我们只需要一个带有https的网站:

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

但是git pull说:

fatal: unable to access 'https://example.com/git/demo.git/': SSL certificate problem: unable to get local issuer certificate

要修复它,我们还需要添加:

SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

-5

在运行composer更新/安装之前,请使用以下命令:

git config --global http.sslverify false
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.