ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

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

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

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

还要检查您的本地网络是否允许将文件推送到 github 存储库。可能有一些防火墙或防病毒限制。
如果有人在使用 Bower 时遇到此错误,请创建一个内容为 { "strict-ssl": false } 的 .bowerrc 文件。不要感谢我,感谢这个人:stapp.space/fight-with-2我已经为这个错误奋斗了将近 5 个小时,直!
可能对某人有帮助:我正在使用 gitlab,如果我通过 https 克隆,我会遇到此错误。但是,如果我使用 ssh,那么它工作得非常好。
我在这里得到了最好的解决方案。 stackoverflow.com/questions/24611640/…

P
Paul Alexander

问题是 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 更容易配置并且不太可能被防火墙阻止,这意味着失败的机会更小。


但请注意,此解决方案可能会使 git config --global http.sslCAInfo <my-server-self-signed-cert.pem> 无法工作。我将 http.sslCAInfo 配置为对我的服务器使用自签名证书,这就是我在执行 git clone https://github.com/Microsoft/vscode.git 时遇到“SSL 证书问题:无法获取本地颁发者证书”的原因(可能与 OP 不同) }。最后,我使用来自 stackoverflow.com/a/47196562/1323552 (Ben PP Tung) 的答案来调整我的 sslCAInfo 配置特定于我的 git 服务器来解决它。
为我工作,我确信我必须配置代理,因为我在公司固件后面,但是不,一个命令和我的克隆工作(并且启用了 SSL)! +1
如果您正在寻找将本地 github 服务器的证书包含到 git certstore 中的方法,请遵循 this solution
这个对我有用,我正在使用 VS 代码,公司安装了一些 VPN 软件来保护流量,这个解决方案解决了我的问题。谢谢。
s
static_rtti

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

git config --global http.sslVerify false

注意:此解决方案使您容易受到中间人攻击等攻击。因此尽快再次开启验证:

git config --global http.sslVerify true

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

我也有这个问题。就我而言,我试图获得一个接收后 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。


这违背了 SSL 的目的。
您可以使用命令“git config --global http.sslVerify false”来禁用 SSL 验证
感谢您指出 sslCAinfo 配置条目;但我不赞成这个答案,因为在 git 系统范围内永久禁用 SSL 没有多大意义(您是否尝试在系统范围内禁用它,然后克隆,然后重新启用它,然后在新克隆的 repo 的本地 git 配置?)。
对于一次性命令,无需更改配置文件:git -c http.sslVerify=false clone https://...
V
Vimes

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

在 Git 配置文件中

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

或通过命令行:

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

在 git for windows 上,这是 git config --global http.sslCAinfo /usr/ssl/certs/ca-bundle.crt
或者对我来说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
使用 Git 2.8,您可以使用 git config --list --show-origin 查看 http.sslCAinfo 配置的设置位置
我在 mac 上的证书位置是:~/macports/share/curl/curl-ca-bundle.crt
F
Franklin Yu

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

更新

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

脚步

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

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


“导航 Git\bin 目录并打开 curl-ca-bundle.crt” git\bin 中没有 curl-ca-bundle.crt!
@AntonK 如果它不存在,请在记事本中自己创建一个,然后用 curl-ca-bundle.crt 重命名它。其他步骤保持不变。
@AntonK 它可能只被称为 ca-bundle.crt 并位于 mingw64\ssl\certsmingw32\ssl\certs
将此用于 Atlassian 的 SourceTree。捆绑的 GIT 安装在 %userprofile%\appdata\local\attlassian\sourcetree\git_local 中。 curl-ca-bundle.crt 已经存在,附加了我的 base64 编码导出的根证书。
这个答案有一个问题。当您更新 git 时,它会将 ca-bundle.crt 文件恢复到原始状态(即您丢失了自签名的公共证书)
i
isherwood

answerUsing makecert for Development SSL 为我解决了这个问题。

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

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


“我不知道为什么,但是通过 IIS 管理器中的简单“创建自签名证书”链接创建的证书并不能解决问题......” - 我能说的最好的,它会创建格式错误证书。创建 X.509 证书时有很多规则; “做最低限度的工作”不再有效。另请参阅 How do you sign Certificate Signing Request with your Certification AuthorityHow to create a self-signed certificate with openssl?
这对我有用,但我暂时挂断了“我在 IIS 中安装了它们”部分。为他人澄清...服务器证书在 IIS 中分配,根 CA 需要通过 Windows 证书管理器实用程序 (certmgr.msc) 导入“受信任的根证书颁发机构”
z
zionyx

为避免完全禁用 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 存储库。
如果它是我的企业 github 怎么样?如何获取根 CA 和中间 CA 是 .cer 格式。我只能得到 .p7b 个文件。
J
Jawad Al Shaikh

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

https://i.stack.imgur.com/zn1Uk.png


你似乎回答了一个不同的问题。 OP 的问题涉及 Windows 客户端上的自签名证书。
@jww 问题标题是一个 git 错误消息,即使 repo 不是自签名 SSL 也会显示!
这让我通过了错误,但对我来说,访问 GitHub Enterprise 需要生成一些密钥并添加公钥/私钥。
如果自签名证书已由有用的 Windows 管理员通过组策略放入 Windows 证书存储区,那么此答案也是一个不错的答案。
p
phifi

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

原因

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

解决方案

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

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

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

现在打开您保存在记事本中的证书并复制内容以及--Begin Certificate--和--end certificate--要找到所有证书都为您的git存储的路径,请在cmd中执行以下命令。 git config --list 检查键'http.sslcainfo',对应的值为路径。

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

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

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

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


我遵循了这些步骤,但这对我不起作用
J
JamesD

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

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

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

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

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


“如果我没有在证书文件中包含整个链,那么这也会失败” - 我刚刚遇到了这个问题
就包括整个链而言,我在 github 证书之上有两个证书。我是否将它们按顺序包含在 sslcainfo.crt 文件中作为 root->next cert->github 证书?
我只需添加根证书即可访问 git repo 包。
对于未来的读者。不知道这是否重要,但我将“根”(最顶层)证书放在(http.sslcainfo)文件的末尾。然后,当我离开链中的根证书时,我将该证书放在 (http.sslcainfo) 文件的前一个条目之上。
B
Ben P.P. Tung

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

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

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


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

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 或 Git for Windows 的问题。他们需要修复它!


等效的命令行(对于非 VS2019 等)是: git config --global http.sslBackend schannel
r
rc.adhikari

在我的例子中,因为我已经为 Window 7 安装了 ConEmu Terminal,它会在安装期间在 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 时选择了与提到的 here 相同的选项。

希望有帮助!


A
Alhassan Moro

git config --global http.sslVerify false


这对我有用,缺少的是您需要按照以下答案中的说明进行验证
你好,中间的人......不要使用这个!请参阅此处:stackoverflow.com/a/34049063/161979
W
Wayne S.

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

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

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

最终奏效的是:

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

C
Celso Xavier Luz

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


M
Manjeet

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

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


A
Anton Tropashko
git config --global http.sslbackend secure-transport

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


更新到 Mac Big Sur 后,我们也得到了 SSL certificate problem: unable to get local issuer certificate。这解决了它!
S
Sérgio

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

o
okan

就我而言,我不得不为不同的 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 参数。


B
Brian Ocampo

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

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

ssh-keygen

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


J
Juan Emmanuel Afable

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


N
Nirbhay Jha

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

git config --global http.sslbackend schannel

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


M
Muhammad Bilal

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

git config --global http.sslVerify false


S
Sven Haile

错误

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

原因

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

解决方案

打开本地目录根目录下的 .git 文件夹 在代码编辑器或文本编辑器(VS Code、记事本、Textpad)中打开配置文件适当的 Git repo(克隆按钮)示例:url = http://git.[host]/[group/project/repo_name](实际路径)将其替换为 url = ssh://git@git.[host] :/[group/project/repo_name] (新路径 SSH) url = https://git.[host]/[group/project/repo_name] (新路径 HTTPS)


a
arunkumar A

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

[遥远的“起源”]

代理=

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


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
K
Kevin McDowell

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


F
Floern

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

git config --global http.sslverify false