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

Ric*_*lls 236 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接受自签名证书?

Sam*_*mir 224

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

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

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

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

  • 这个答案通过允许中间人攻击来破坏SSL的安全性.其他答案已经解释了如何配置git以信任您需要的特定证书. (56认同)
  • 要禁用单个git命令的TLS/SSL验证,请使用以下命令:`git -c http.sslVerify = false clone https:// domain.com/path/to/git` (17认同)
  • 可怕的答案确实,你甚至没有告诉他们重新启用SSL.这就是安全漏洞发生的原因. (11认同)
  • 下面已经提供了几种解决方案,我已经提出了缺点。因此,选择什么解决方案来解决问题取决于您。 (6认同)
  • 这可以是一种解决方法,但绝不是解决方案。另外,最好不要绕过所有 ssl 验证。您可以使用“git config --local http.sslVerify false”。这样只有一个存储库是不安全的 (6认同)

kid*_*ley 91

我也有这个问题.在我的情况下,我试图获得一个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
Run Code Online (Sandbox Code Playgroud)

这就是诀窍.

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

  • 这违背了SSL的目的. (131认同)
  • 您可以使用命令"git config --global http.sslVerify false"来禁用SSL验证 (49认同)
  • 对于一次性命令,不需要更改配置文件:`git -c http.sslVerify = false clone https:// ...` (34认同)
  • 更好的解决方法:https://blogs.msdn.microsoft.com/phkelley/2014/01/20/adding-a-corporate-or-self-signed-certificate-authority-to-git-exes-store/ (8认同)
  • 感谢您指出`sslCAinfo`配置条目; 但是我没有回答这个问题,因为在系统范围内为git永久禁用SSL没有多大意义(你试图在系统范围内禁用它,然后克隆,然后重新启用它,然后在新克隆的repo的本地git配置?). (6认同)

Iho*_*ich 86

问题是git默认使用"Linux"加密后端.

从Git for Windows 2.14开始,您现在可以将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
Run Code Online (Sandbox Code Playgroud)

这应该有所帮助.

在安装git for windows时,使用schannel现在是标准设置,如果可能的话,建议不要通过SSH检查存储库,因为https更容易配置,不太可能被防火墙阻止,这意味着失败的可能性更小.

  • 但是请注意,此解决方案可能会使 `git config --global http.sslCAInfo <my-server-self-signed-cert.pem>` 无法工作。我将 `http.sslCAInfo` 配置为对我的服务器使用自签名证书,这就是我遇到“SSL 证书问题:无法获得本地颁发者证书”的原因(可能与 OP 不同),例如: `git clone https://github.com/Microsoft/vscode.git`。最后,我使用 /sf/answers/3303759371/ (Ben PP Tung) 中的答案来调整特定于我的 git 服务器的 sslCAInfo 配置来解决它。 (3认同)

Oli*_*ver 47

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

在Git配置文件中

[http]
    sslCAinfo = /bin/curl-ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

或者通过命令行:

git config --global http.sslCAinfo /bin/curl-ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

  • 在git for windows上,这是`git config --global http.sslCAinfo/usr/ssl/certs/ca-bundle.crt` (4认同)
  • 或者对我来说`git config --global http.sslCAinfo /c/Program\ Files\ \(x86\)/Git/bin/curl-ca-bundle.crt` (2认同)
  • 使用Git 2.8,您可以使用`git config --list --show-origin`来查看http.sslCAinfo配置的设置位置 (2认同)

Nad*_*ali 41

我也遇到过这个问题.最后通过获得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文件以保持安全.

  • @AntonK它可能只被称为`ca-bundle.crt`,位于`mingw64\ssl\certs`或`mingw32\ssl\certs`. (14认同)
  • "导航Git\bin目录并打开curl-ca-bundle.crt"git\bin中没有curl-ca-bundle.crt! (3认同)
  • 用于 Atlassian 的 SourceTree。捆绑的 GIT 安装位于 %userprofile%\appdata\local\attlassian\sourcetree\git_local 中。curl-ca-bundle.crt 已经存在,附加了我的 Base64 编码导出的根证书。 (2认同)

Ric*_*lls 39

这个问题的答案使用makecert for Development SSL为我解决了这个问题.

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

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


zio*_*nyx 24

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

git config --global http.https://the.host.com/.sslCAInfo c:/users/me/the.host.com.cer
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以仅为主机禁用ssl验证:

git config --global http.https://the.host.com/.sslVerify false
Run Code Online (Sandbox Code Playgroud)

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

  • 可能值得注意的是,没有必要使用--global选项:如果您省略了--global选项,则该设置仅适用于该特定的git repo。 (3认同)

小智 19

使用 Windows 时,问题在于 git 默认使用“Linux”加密后端。从 Git for Windows 2.14 开始,您可以将 Git 配置为使用 SChannel(内置 Windows 网络层)作为加密后端。为此,只需在 GIT 客户端中运行以下命令:

git config --global http.sslbackend schannel
Run Code Online (Sandbox Code Playgroud)

这意味着它将使用Windows证书存储机制,并且您不需要显式配置curl CA存储(http.sslCAInfo)机制。


Jam*_*esD 18

我刚刚遇到了同样的问题,但在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认同)

小智 14

完整地详细列出上述所有答案的摘要。

原因

出现此问题是因为如果您尝试访问的存储库存在,则 git 无法完成与 git 服务器的 https 握手。

解决方案

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

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

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

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

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

    git 配置 --list

  3. 检查键'http.sslcainfo',对应的值将是路径。

注意:如果你找不到密钥 http.sslcainfo 检查 Git 的默认路径:C:\Program Files\Git\mingw64\ssl\certs

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

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

注2:修改此文件前请在别处备份。

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


Pet*_*dad 9

我最近也遇到了这个问题,通常当您位于某个公司防火墙后面时,您会遇到此问题,然后 git 无法与您尝试访问的 git 存储库完成 https 握手。解决该问题的方法之一是使用以下命令:

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

但正如其他人所说,这几乎禁用了 ssl 验证。唯一安全的方法是获取 SSL 证书并将其本地添加到您的 Git 文件夹中,特别是在文件中ca-bundle.crt

解决这个问题的一种方法是使用 package pcer,要安装它,您需要执行以下操作:

npm i -g pcer
Run Code Online (Sandbox Code Playgroud)

然后执行以下命令:

pcer alias git "C:\Program Files\Git\mingw64\etc\ssl\certs\ca-bundle.crt"
Run Code Online (Sandbox Code Playgroud)

这将git指向上述路径,然后您可以fetch通过执行以下操作来获取证书:

pcer fetch github.com -l git
Run Code Online (Sandbox Code Playgroud)

然后执行git clone就可以正常工作了。例如:

在此输入图像描述

了解更多信息:

https://www.npmjs.com/package/pcer

https://github.com/PeterHdd/pcer

请注意,我是这个包的所有者


Jaw*_*ikh 7

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

在此输入图像描述

  • 你似乎回答了一个不同的问题。OP 的问题涉及 Windows 客户端上的自签名证书。 (2认同)
  • 如果自签名证书已由有用的 Windows 管理员通过组策略放入 Windows 证书存储中,那么这个答案也是一个很好的答案。 (2认同)
  • 这个解决方案比摆弄 SSL 或手动添加证书要好得多。简单有效的解决方案!(我是开发人员,而不是系统管理员。我不想被证书之类的东西打扰) (2认同)

小智 7

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

Git SSL 证书问题无法获取本地颁发者证书(修复)

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


Ben*_*ung 5

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

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

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

  • 这是我发现的最简单和最精确的解决方案,如果您之前还配置了`git config --global http.sslCAInfo <your-server-self-signed-cert.pem>`(因此导致“无法获取本地颁发者证书” “ 错误) (3认同)

rc.*_*ari 5

就我而言,由于我已经为 Window 7安装了ConEmu 终端,它会ca-bundleC:\Program Files\Git\mingw64\ssl\certs.

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

$ git config --global http.sslbackend schannel
$ git config --global http.sslcainfo /mingw64/ssl/certs/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

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

[http]
    sslBackend = schannel
    sslCAinfo = /mingw64/ssl/certs/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

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

希望有帮助!


归档时间:

查看次数:

352453 次

最近记录:

6 年,1 月 前