我在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接受自签名证书?

评论

可能复制configure Git以接受特定https远程服务器的特定自签名服务器证书

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

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

可能会对某人有所帮助:我正在使用gitlab,如果通过https克隆,则会遇到此错误。但是,如果我使用ssh,那么它就可以正常工作。

#1 楼

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

git config --global http.sslVerify false


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

git config --global http.sslVerify true


评论


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

–dsh
2015年12月4日15:37

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

– Edgar Aroutiounian
16-2-2在23:22

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

–萨米尔
16 Mar 11 '16 at 6:28

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

– Maxim Suslov
16年6月30日在9:47

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

–萨米尔
18年3月31日在15:13

#2 楼

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

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

只需执行:

git config --global http.sslbackend schannel


应该会有所帮助。

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

评论


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

–约翰尼·王(Johnny Wong)
19年2月15日在7:36

#3 楼

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

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

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

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


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

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


达到了目的。

注意:


这将禁用SSL验证,因此不建议将其作为长期解决方案。
您可以禁用每个存储库,但仍然不能使用很好,但是可以本地化设置。
随着LetsEncrypt.org的出现,现在非常简单,自动化并且可以自由地将SSL设置为自签名证书的替代方法,并且无需关闭sslVerify 。


评论


这违反了SSL的目的。

– syaz
2014年9月8日7:00

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

– CleanCoder
2014年10月21日在21:21

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

– 7heo.tk
15 Mar 30 '15 at 0:19



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

–点
16年1月13日在20:23



更好的解决方法是:blogs.msdn.microsoft.com/phkelley/2014/01/20/…

– Warren P
16年4月25日在16:55

#4 楼

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

在Git配置文件中

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


或通过命令行:

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


评论


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

– Karsten Tinnefeld
16-9-29在13:20



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

– Sparrowt
16年11月24日在10:31

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

– miken32
17年8月14日在22:43

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

–安尼什
18年8月15日在15:22

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

–user3282611
18年8月28日在15:42

#5 楼

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

Update

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

步骤


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

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

评论


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

–安东K
15年9月18日在18:38

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

– Nadeem Jamali
15年9月18日在20:03

@AntonK可能仅称为ca-bundle.crt,位于mingw64 \ ssl \ certs或mingw32 \ ssl \ certs中。

–伊恩·坎普(Ian Kemp)
2015年11月4日在10:46

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

– Xanothos
16年6月9日在11:31

#6 楼

使用makecert for Development SSL解决此问题的方法已为我解决。

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

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

评论


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

– jww
17年9月1日在3:48



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

–菲利普
18年4月1日在17:58

#7 楼

为了避免完全禁用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验证为已关闭。

评论


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

–韦斯·特纳
19 Mar 3 '19 at 7:07



#8 楼

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


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

这应解决以下问题:签名的证书并使用GIT。

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

如果这是系统GIT,则可以使用工具-> options
“ Git”选项卡以使用系统GIT,这也可以解决sourcetree中的问题。

评论


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

–阿曼尼·基卢曼加(Amani Kilumanga)
16年11月15日在2:09

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

– Jecoms
16 Dec 6'在20:51在

我只需要添加根证书就可以访问git repo包。

– Jecoms
16 Dec 6'在21:57

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

– granadaCoder
19年7月30日在22:55

#9 楼

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



评论


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

– jww
17年9月1日在3:44

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

–贾瓦德·谢赫(Jawad Al Shaikh)
17年3月3日14:49在

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

–ΩmegaMan
18-2-19在23:57

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

–JamesD
19年7月31日在9:08

#10 楼

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

评论


如果您还配置了git config --global http.sslCAInfo ,这是我找到的最简单,最精确的解决方案(因此导致“无法获取本地发行者证书”错误)

–约翰尼·王(Johnny Wong)
19年2月15日在7:33

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

–RocíoGarcíaLuque
20-2-5在7:57

#11 楼

就我而言,因为我已经安装了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。

希望有帮助!

#12 楼



从此链接下载证书:
https://github.com/bagder/ca-bundle


将其添加到C:\Program Files\Git\binC:\Program Files\Git\mingw64\bin


然后尝试类似的方法:git clone https://github.com/heroku/node-js-getting-started.git

#13 楼

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

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


但这失败了,并出现了“无法获取本地发行者证书”错误。

最终起作用的是这个:

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


#14 楼

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

我对Let's Encrypt证书有同样的问题。

一个带有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


#15 楼

错误

推送失败
致命:无法访问
SSL证书问题:无法获取本地颁发者证书

原因
提交文件后在本地计算机上,当本地Git连接参数过时(例如,将HTTP更改为HTTPS)时,可能会出现“推送失败”错误。
解决方案

在以下目录中打开.git文件夹本地目录
在代码编辑器或文本编辑器(VS Code,记事本,文本板)中打开config文件。

用可从以下网址获取的最新HTTPS或SSH链接替换文件中的HTTP链接:相应的Git存储库(克隆按钮)的网页
示例:
url = http://git.[host]/[group/project/repo_name]     (actual path)

用以下任一替换它
url = ssh://git@git.[host]:/[group/project/repo_name] (new path SSH)
url = https://git.[host]/[group/project/repo_name]    (new path HTTPS)




#16 楼

我尝试了这里提到的所有方法,但是都没有运气。
最后我发现了我做过的另一种方法


我的系统上为git生成了ssh公钥/私钥repo


将ssh密钥复制到您的git帐户,并在git

打开Git Bash。
粘贴以下文本,替换为您的GitHub电子邮件地址。
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这将使用提供的电子邮件作为标签来创建新的ssh密钥。
生成公用/专用rsa密钥对。
当系统提示您“输入要保存密钥的文件”时,请按Enter。这将接受默认文件位置。
输入要保存密钥的文件(/c/Users/you/.ssh/id_rsa):[按Enter]

#17 楼

就我而言,我必须对不同的git存储库使用不同的证书。
请按照以下步骤操作(如果您拥有存储库的证书,则可以从第5步中读取)。


转到远程存储库的站点。例如:github.com,bitbucket.org,tfs.example ...


单击左上角的“锁定”图标,然后单击证书。


转到“证书路径”选项卡,然后双击..根证书


转到“详细信息”选项卡,然后单击“复制到文件”。


导出/将证书复制到您想要的任何位置。例如:C:\ certs \ example.cer


在本地存储库文件夹中打开git bash并键入:
$ git config http.sslCAInfo "C:\certs\example.cer"


现在您可以为每个存储库使用不同的证书。
请记住,使用--global参数进行调用也会更改其他文件夹中的git存储库的证书,因此在执行此命令时不应使用--global参数。

#18 楼

为了完整详细地说明上述所有答案的摘要。
原因
之所以出现此问题,是因为git无法完成与git服务器的https握手,前提是您要访问的存储库存在。 >解决方案
从github服务器获取证书的步骤

在浏览器中打开您要访问的github
在地址栏中单击锁图标>单击“证书”
转到“证书路径”选项卡>在证书层次结构中选择最顶层的节点>单击“查看证书”
现在单击“详细信息”,然后单击“复制到文件”。 。>单击“下一步”>选择“基于64位编码的X509(.CER)”>将其保存到所需的任何路径。

将证书添加到本地git证书存储区的步骤


现在打开保存在记事本中的证书,并将内容与--Begin Certificate--和--end certificate--


一起复制到查找存储所有证书的路径对于您的git,请在cmd中执行以下命令。
git config --list


检查密钥'http.sslcainfo',对应的值为路径。 br />

现在打开该路径中存在的'ca-bundle.crt'。



注1:否则打开此文件管理员模式更新后,您将无法保存它。 (提示-您可以为此目的使用Notepad ++)
注2:在修改此文件之前,请在其他位置保留备份。


现在复制文件的内容第1步中提到的文件到第4步中的最终文件,就像在ca-bundle.crt中放置其他证书一样。
现在打开一个新终端,现在您应该能够执行与git服务器相关的操作使用https。


#19 楼

我在Azure DevOps(Visual Studio)中遇到了相同的问题。最后,我决定使用SSH协议克隆我的存储库,因为我更喜欢它而不是禁用SSL验证。
您只需要生成一个SSH密钥,就可以这样做... SSH文档
ssh-keygen

,然后,将您的公钥导入到您的git主机上(例如Azure Devops,Github,Bitbucket,Gitlab等)。

#20 楼

这可能会帮助一些遇到此错误的人。如果您正在使用VPN,但该VPN已断开连接,则也可能会出现此错误。简单的解决方法是重新连接您的VPN。

#21 楼

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

git config --global http.sslverify false