繁体   English   中英

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

[英]Unable to resolve "unable to get local issuer certificate" using git on Windows with self-signed certificate

我在 Windows 上使用 Git。我安装了 msysGit package。我的测试存储库在服务器上有一个自签名证书。 我可以使用 HTTP 毫无问题地访问和使用存储库。 移动到 HTTPS 给出错误:

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

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

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

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

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

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

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

问题是 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

那应该有帮助。

在为 Windows 安装 git 时,现在使用 schannel 是标准设置,此外,如果可能,建议不要再通过 SSH 签出存储库,因为 https 更容易配置并且不太可能被防火墙阻止,这意味着失败的机会更小。

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

git config --global http.sslVerify false

注意:此解决方案使您面临诸如中间人攻击之类的攻击 因此尽快再次开启验证:

git config --global http.sslVerify true

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

我最终不得不做的是禁用整个 Git 的 SSL 验证(如文章所述)。 不是完美的解决方案,但在我找到更好的解决方案之前它会起作用。

我编辑了位于:

C:\Program 文件 (x86)\Git\etc\gitconfig

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

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

那成功了。

笔记:

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

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

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

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

在 Git 配置文件中

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

或通过命令行:

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

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

更新

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

脚步

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

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

使用 makecert 进行开发 SSL回答为我解决了这个问题。

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

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

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

如果是github 存储库(或任何非自签名证书) ,在安装 Git-on-windows 时选择下面的选项,可以解决问题。

在此处输入图像描述

将以上所有答案的摘要完全详细地列出来。

原因

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

解决方案

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

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

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

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

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

    git 配置 -- 列表

  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 服务器相关的操作。

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

我之前也遇到过这个问题,用下面的配置解决。

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

从 git 2.3.1 开始,你可以在 http 后面加上https://your.domain来表示下面的证书只给它。

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

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

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

就我而言,因为我已经为 Window 7 安装了ConEmu 终端,它会在安装过程中在C:\Program Files\Git\mingw64\ssl\certs处创建ca-bundle

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

$ 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 时选择了与此处提到的相同的选项。

希望有帮助!

git config --global http.sslVerify false

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

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

但这因“无法获得本地颁发者证书”错误而失败。

最终奏效的是:

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

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

通过“.gitconfig”文件

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

添加或覆盖下一行:

[http]
   sslverify = false

通过“git config”命令

执行以下命令。

git config --global http.sslverify false

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

git config http.sslverify false

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

  1. 从此链接下载证书: https ://github.com/bagder/ca-bundle
  2. 将其添加到C:\Program Files\Git\binC:\Program Files\Git\mingw64\bin

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

git config --global http.sslbackend secure-transport

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

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

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

我们只需要一个带有 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

就我而言,我不得不为不同的 git repositories使用不同的证书

请按照以下步骤操作(如果您有存储库的证书,则可以从第 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参数。

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

你只需要生成一个 SSH Key,你就可以这样做... SSH 文档

ssh-keygen

然后,在你的 git 主机(如 Azure Devops、Github、Bitbucket、Gitlab 等)上导入你的公钥

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

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

git config --global http.sslbackend schannel

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

这对我有用。 我打开 cmd 行并运行以下命令。 并再次拉动。

git config --global http.sslVerify false

错误

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

原因

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

解决方案

  1. 打开本地目录根目录下的.git文件夹
  2. 在代码编辑器或文本编辑器(VS Code、记事本、Textpad)中打开config文件
  3. 将文件中的HTTP 链接替换为相应 Git 存储库的网页中可用的最新HTTPSSSH链接(克隆按钮)
    例子:
     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)

我已经尝试了这里提到的所有方法,但没有任何运气。 最后我找到了一种不同的方法我所做的是

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

  • 将 ssh 密钥复制到您的 git 帐户并在 git clone 中使用 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]

我通过在 ${HOME}/.gitconfig 文件中添加以下条目解决了这个问题

[遥远的“起源”]

代理=

在大多数情况下,它会在您的机器中启用代理时发生,因此上述条目将解决此问题。

You might have a DNS issue and not a certificate issue, so before you disable SSL verification in your Git shell you should rule out a DNS problem. 诸如此类的案例已在https-issues-possibly-related-to-dns等问答论坛中提及。 如果您在 Windows 上使用 WSL 作为终端,那么您可以尝试运行sudo echo nameserver 8.8.8.8 > /etc/resolv.conf然后发出 git 命令以查看是否有所不同。 这似乎不是永久的 DNS 修复(仅持续终端会话的生命周期),但它可以帮助您确定它是否是 DNS 问题而不是证书问题。 您还可以查看有关配置网络以使用公共 DNS 的文档 同样,这只是为了帮助您确定您的 DNS 设置是否可能需要调整以帮助解决证书问题。

我尝试了以下并且它有效

git config --global http.sslVerify false

下载并安装本地证书。 可能它发布在您的公司网站上。 例如,*.cer 文件。

  1. 右键单击它并 select Install Certificate 将出现“证书导入向导”。 Select Local Machine Next ,确认。

  2. Select Place all certificates in the following store中,按Browse和 select Trusted Root Certification AuthoritiesOKFinish

在此处输入图像描述

您还可以检查其他应用程序是否可以获取、拉取或推送数据。 例如,在Android Studio或可能的IDEA中,您应该在Settings此复选框中设置 select: Use credential helper

尝试“克隆”项目时出现此错误。 一种解决方法是只使用网页上的“下载为 zip”,对我来说,这实现了我想做的事情。

这可能会帮助一些遇到此错误的人。 如果您正在使用 VPN 并且它断开连接,您也可能会收到此错误。 简单的解决方法是重新连接您的 VPN。

在运行 composer update/install 之前使用这个命令:

git config --global http.sslverify false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM