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

时间:2014-05-27 09:15:12

标签: windows git curl ssl-certificate msysgit

我在Windows上使用git。我安装了msysgit包。我的测试存储库在服务器上有一个自签名证书。我可以使用http访问和使用存储库而不会出现问题。迁移到https会出现错误" SSL证书问题:无法获得本地颁发者证书"。

我在Windows 7客户端计算机的受信任的根证书颁发机构中安装了自签名证书。我可以浏览到Internet Explorer中的https存储库URL,没有错误消息。

此博客http://blogs.msdn.com/b/phkelley/archive/2014/01/20/adding-a-corporate-or-self-signed-certificate-authority-to-git-exe-s-store.aspx解释说curl不使用客户端计算机的证书存储区。我按照博客文章的建议创建了curl-ca-bundle.crt的私有副本,并配置git来使用它。我确信git正在使用我的副本。如果我重命名副本; git抱怨文件丢失。

我粘贴在我的证书中,如博客文章中所述,我仍然收到消息"无法获得本地发行人证书"。

我通过https克隆了一个GitHub存储库,验证了git仍在工作。

我唯一看到的与博客文章不同的是我的证书是根证书 - 没有链条可以达到它。我的证书最初来自于单击IIS8 IIS管理器链接'创建自签名证书'。也许这会使证书在某种程度上与curl期望的不同。

如何让git / curl接受自签名证书?

27 个答案:

答案 0 :(得分:188)

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

git config --global http.sslVerify false

注意:此解决方案可能会让您受到类似中间人攻击的攻击。 因此,请尽快再次启用验证:

git config --global http.sslVerify true

答案 1 :(得分:89)

我也有这个问题。在我的情况下,我试图获得一个post-receive Git钩子,以便在每次推送时更新服务器上的工作副本。试图按照您链接的博客中的说明进行操作。对我来说也不起作用,并且基于每个用户覆盖设置似乎也没有用。

我最终要做的就是为Git整体禁用SSL验证(如文章所述)。不是完美的解决方案,但它会一直有效,直到我能找到更好的解决方案。

我编辑了位于以下位置的Git配置文本文件(带有我最喜欢的行结束中性应用程序,如Notepad ++):

  

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

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

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

这就是诀窍。

注意:这会禁用SSL验证,不建议将其作为长期解决方案。

答案 2 :(得分:44)

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

在Git配置文件中

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

或通过命令行:

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

答案 3 :(得分:39)

这个问题的答案Using makecert for Development SSL为我解决了这个问题。

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

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

答案 4 :(得分:37)

我也遇到过这个问题。最后通过this MSDN Blog的指导得到解决。

<强>更新

实际上你需要在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的末尾,然后保存。
  7. 最后检查状态。 请注意,在编辑之前备份curl-ca-bundle.crt文件以保持安全。

答案 5 :(得分:35)

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

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

只需执行:

git config --global http.sslbackend schannel

那应该有帮助。

到目前为止,在Windows上安装git时,使用schannel是标准设置,此外,建议不要再通过SSH检出存储库,因为https易于配置且不太可能被防火墙阻止,因此机会更少失败。

答案 6 :(得分:21)

为避免完全禁用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验证关闭时,可能会受到中间人攻击。

答案 7 :(得分:17)

我刚刚遇到了同样的问题,但在Windows上使用sourcetree同样适用于Windows上的普通GIT。按照以下步骤,我能够解决这个问题。

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

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

    如果这是系统GIT,那么您可以使用TOOLS中的选项 - &gt;选项 使用系统GIT的GIt选项卡,然后这也解决了sourcetree中的问题。

答案 8 :(得分:6)

如果是 github存储库(或任何非自签名证书),请在安装Git-on-windows时选择以下内容,解决了这个问题。

enter image description here

答案 9 :(得分:5)

2021 年 1 月 - 通过设置 Menu > Git > Settings > Git Global Settings > Cryptographic Network Provider > [Secure Channel] 而不是 [OpenSSL] 在 VS2019 中解决了这个问题

Git SSL certificate problem unable to get local issuer certificate (fix)

PS:不需要设置--global 或--local http.sslVerify false。我正在克隆一个没有使用任何自签名证书的 Azure DevOps 存储库。这似乎是 VS2019 或 Windows 版 Git 的问题。他们需要修复它!!

答案 10 :(得分:4)

就我而言,由于我已经为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时,我选择了与here相同的选项。

希望有帮助!

答案 11 :(得分:4)

禁用您的 ssl 验证(默认启用)。

通过“.gitconfig”文件

检查您的 .gitconfig 文件。通常可在目录 ~/.gitcongh 中找到。

添加或覆盖下一行:

[http]
   sslverify = false

通过'git config'命令

执行以下命令。

git config --global http.sslverify false

如果您不想全局启用配置属性,请踩到您的存储库路径,然后执行。

git config http.sslverify false

答案 12 :(得分:4)

之前我遇到过这个问题,并使用以下配置解决它。

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

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

答案 13 :(得分:2)

git config --global http.sslbackend secure-transport

(更新到 Big Sюr 后必须这样做)

答案 14 :(得分:1)

要修复特定错误SSL certificate problem: unable to get local issuer certificate in 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

答案 15 :(得分:1)

  1. 从此链接下载证书: https://github.com/bagder/ca-bundle
  2. 将其添加到 C:\Program Files\Git\binC:\Program Files\Git\mingw64\bin
  3. 然后尝试类似:git clone https://github.com/heroku/node-js-getting-started.git

答案 16 :(得分:0)

困扰我的一件事是路径的格式(在Windows PC上)。我原来有这个:

index.html

但是由于“无法获取本地发行者证书”错误而失败。

这终于奏效了:

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

答案 17 :(得分:0)

错误

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

原因

在本地计算机上提交文件后,如果本地Git连接参数过时(例如,将HTTP更改为HTTPS),则可能会发生“推送失败”错误。

解决方案

  1. 打开本地目录根目录中的.git文件夹
  2. 在代码编辑器或文本编辑器(VS Code,记事本,文本板)中打开config文件
  3. 使用适当的Git存储库(克隆按钮)网页上的最新 HTTPS SSH 链接,用文件中的
  4. 替换HTTP链接。 )
    例子:
    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)
    

答案 18 :(得分:0)

我尝试了这里提到的所有方法,但是都没有运气。 终于,我找到了一种不同的方法

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

  • 将ssh密钥复制到您的git帐户,并在git中使用ssh而不是https 克隆。检查以下步骤以生成ssh密钥

打开Git Bash。

粘贴以下文本,替换为您的GitHub电子邮件地址。

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这将使用提供的电子邮件作为标签来创建新的ssh密钥。

生成公用/专用rsa密钥对。 当提示您“输入要在其中保存密钥的文件”时,请按Enter。这将接受默认文件位置。

输入要保存密钥的文件(/c/Users/you/.ssh/id_rsa):[按Enter]

答案 19 :(得分:0)

对于我来说,我必须对不同的git存储库使用不同的证书

请按照以下步骤操作(如果您拥有存储库的证书,则可以从步骤5 中阅读)

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

  2. 点击左上方的锁定图标,然后点击证书

  3. 转到证书路径标签,然后双击。.根证书

  4. 转到详细信息标签,然后点击复制到文件

  5. 将证书导出/复制到所需位置。例如:C:\ certs \ example.cer

  6. 在本地存储库文件夹中打开git bash并输入:

    $ git config http.sslCAInfo "C:\certs\example.cer"

现在您可以为每个存储库使用不同的证书。

请记住,使用--global参数进行调用还会更改其他文件夹中的git存储库的证书,因此在执行此命令时,请勿使用--global参数。

答案 20 :(得分:0)

要完全详细地说明上述所有答案的摘要。

原因

发生此问题的原因是,如果存在您要访问的存储库,则git无法完成与git服务器的https握手。

解决方案

从github服务器获取证书的步骤

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

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

  1. 现在打开在记事本中保存的证书,并复制内容---Begin Certificate--和--end certificate-

  2. 要查找所有为git存储的证书的路径,请在cmd中执行以下命令。

    git config --list

  3. 检查键“ http.sslcainfo”,对应的值为路径。

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

注意1:打开此文件管理员模式,否则更新后将无法保存它。 (提示-您可以为此使用Notepad ++ 目的)

注意2:在修改此文件之前,请在其他位置保留备份。

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

答案 21 :(得分:0)

我在Azure DevOps(Visual Studio)中遇到了相同的问题。最终,我决定使用 SSH 协议克隆我的存储库,因为我更喜欢它而不是禁用SSL验证。

您只需要生成SSH密钥即可,您可以这样做... SSH documentation

ssh-keygen

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

答案 22 :(得分:0)

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

答案 23 :(得分:0)

我在使用 Visual Studio 时发生了这个错误。当您在 Visual Studio 选项窗口中将加密网络提供程序设置设置为 OpenSSL 时,会发生这种情况。当我将设置更改为 Secure Channel 时,它为我解决了这个问题。这个设置肯定是我升级VS的时候设置的。

答案 24 :(得分:0)

解决了我的问题 git config --global http.sslBackend schannel

答案 25 :(得分:0)

git config --global http.sslVerify false

答案 26 :(得分:-5)

以前使用此命令运行composer update / install:

git config --global http.sslverify false