推送到 Git 服务器时 SSL 证书无效

Posted

技术标签:

【中文标题】推送到 Git 服务器时 SSL 证书无效【英文标题】:Invalid SSL certificate when pushing to Git server 【发布时间】:2013-10-25 03:57:27 【问题描述】:

我在 Windows 服务器上运行 Gitblit,并试图将数据从网络上的另一台机器推送到存储库。我使用了 SSL 证书(不是自签名的,但我认为是由我的公司签名的?不太确定它是如何工作的,但 Chrome、IE 等看到它已经过身份验证)。

运行 Gitblit 的服务器名为 itscm,在开发人员的桌面上,我使用此 URL 通过 TortoiseGit 推送数据:

git.exe push --progress  "https://itscm:8234/git/TestRepo.git" master

但是,我收到此错误:

致命:无法访问“https://itscm:8234/git/TestRepo.git/”:SSL 证书问题:证书链中的自签名证书

当我在 chrome 中访问该地址时,我在页面上看到 404,但我可以看到 URL 栏中的挂锁是绿色的。当我单击挂锁时,我看到身份已验证。我不明白我的浏览器如何认为这个证书是有效的,但是当我尝试通过 Git 向它推送数据时,它失败了。

【问题讨论】:

根据我的经验,当您第一次尝试使用您的浏览器不喜欢的 SSL 证书访问某个地方时,它会让您选择接受它。也许你已经这样做了? 我今天早些时候用 Firefox 进行了测试。开箱即用的 gitblit 使用自签名证书,Firefox 肯定认为它是无效的。在摆弄 gitblit 安装后,我让它与我现有的证书一起工作。 Firefox 表示它现在信任该证书。 听上去,贵公司使用了一个内部 CA 签名证书,该证书已为 itscm 签署了您的 SSL 证书。我猜 CA 证书已添加到您的浏览器的受信任证书中,但 git 使用的源不信任与您的浏览器配置相同的 CA 链。 SSL certificate rejected trying to access GitHub over HTTPS behind firewall的可能重复 在这里查看正确的分辨率:***.com/questions/16668508/… 【参考方案1】:

TortoiseGit 可能没有使用相同的信任库 Chrome。我认为 Chrome 使用系统商店,Firefox 使用它自己的。我不知道 TortoiseGit 使用什么。

在客户端,如果你设置git config http.sslVerify false,你可能会有更多的运气。你也可以set this globally。

【讨论】:

是的,我希望我可以在服务器端修复它,而不是让每个人都设置他们的 git 配置。 不推荐。但这是全局设置的方法:git config --global http.sslVerify false 禁用 SSL 验证是极其危险的。 SSL 证书验证的重点是保护您的代码在传输时不被篡改它通过HTTPS。禁用它意味着恶意人员可以在您推送和获取代码时将漏洞和其他讨厌的东西插入您的代码中。除非您确定中间人攻击不是您的问题,否则不推荐。 @GalBracha 如果我将 http.sslVerify 设置为 false 那么连接会安全吗?这是使用的好方法吗?在这两者之间我们使用 pfsense 防火墙 是的,它有效。您可以先禁用 SSL 验证( git config --global http.sslVerify false ),然后运行正常的 git 命令,然后再次启用 SSL 验证( git config --global http.sslVerify true )。【参考方案2】:

Windows 版 Git 有自己的受信任证书信任库,通常位于文件中

Git for Windows [Git installdir]\bin\curl-ca-bundle.crt(例如,C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt;由 [Git installdir]\etc\gitconfig 中的键 http.sslCAinfo 配置)。 Git for Windows >= 2.0: [Git installdir]\mingwXX\ssl\certs\ca-bundle.crt 其中XX 代表3264(例如,C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt;由 git config 中的键 http.sslCAinfo 配置,例如 C:\Program Files\Git\etc 或您的全局/本地配置)。

禁用证书检查(例如,通过设置git config http.sslVerify false)不是一个好主意,并且可能非常危险(因为所有安全检查都被禁用并且MitM attacks 很容易实现 - 取决于设置的位置,它适用于所有新的 https 连接)。

为了将证书(可能是自签名的一个或另一个根证书)添加到此信任库以自动信任它,您必须执行以下步骤(前五个步骤只是收集证书,这也可以使用您喜欢的浏览器完成,但可能需要不同的任务):

    在 Microsoft Edge 中打开网站的 URL

    单击本地栏中的锁定符号并选择“连接是安全的”,然后单击证书符号。

    (可选)在证书链(第三个选项卡)上选择您要信任的证书并打开它

    转到第二个选项卡“详细信息”

    点击“保存到文件”,选择“Base64 编码的 X.509 (.CER)”并使用唯一名称保存(记住该名称;建议使用不含空格的名称)。

    现在你有几个选择

      通过在 cli shell 中执行 git config --global http.sslCAinfo "[yourfilename]" 来使用仅包含您刚刚下载的证书的单独证书信任库,以便仅将此证书用作信任库。 使用单独的证书信任库,其中包含您刚刚下载的证书和来自 git 信任库的所有证书,方法是附加系统信任库文件中的所有内容(路径见上文),然后在 cli shell 中执行 git config --global http.sslCAinfo "[yourfilename]"为了使用这个新的信任库。 更新系统证书文件,方法是将刚刚保存的文件的内容附加到[path-to-git-trust-store-crt-file](例如type [yourfilename] >> [path-to-git-trust-store-crt-file] 在以管理员权限运行的cli shell 中)或使用记事本(制作一份ca-bundle 的副本)。 crt 文件,附加下载的 .crt 文件的内容,然后将其复制回来)。缺点:更改可能会在 git update 上被覆盖

完成。现在,此证书在 Git for Windows 的信任库中。


Windows 版 Git 的最新版本也可以使用 Windows 证书存储,这在企业环境中可能更方便。这可以在安装时配置。

【讨论】:

Open the URL of the site in Internet Explorer 你在这个网址中使用的是哪个网址? 您在 Git 中使用的远程 URL。 我还必须修改文件C:\Program Files\Git\mingw64\ssl\cert.pem 我刚刚在那里添加了base64证书并且(最终)它工作了。 使用第一个选项刚刚将“SSL 证书问题:证书链中的自签名证书”错误替换为“错误设置证书验证位置:CAfile:C:\Program Files\Git\mingw64\ssl\ certs\github.cer CApath: 无" 在我的例子中 git config --global http.sslCAinfo 是空的,并且 git config http.sslCAinfo 给了我正确的路径 git config --show-origin -l 显示每个使用的文件并且可以在此级别出现问题时提供帮助【参考方案3】:

对于那些在企业中遇到自签名证书错误的人 - 以下是一种替代方法。

在企业中,同一个 git 服务器,可以通过 https 协议访问,通常也可以通过 ssh 协议访问。 所以选择服务器 url 的 ssh 选项并将存储库克隆为

git clone user@server/project.git

当然,~\.ssh 文件夹中的公钥(id_rsa.pub)必须添加到服务器。这样您就无需将 https 服务器证书添加到您的 Windows 证书存储或 mac 钥匙串 (example)。

【讨论】:

【参考方案4】:

这对我有用。创建一个文件夹C:\GitCerts。然后将Base64 .cer文件(按照MrTux提供的答案)下载到这个C:\GitCerts文件夹中。

从命令行运行以下命令:git config --global http.sslCAinfo "C:\GitCerts\MyCert.cer" 在记事本中打开MyCert.cer 文件并保持打开状态 在另一个记事本中打开 Git ca-bundle.crt 文件。我的位置是C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt。 验证MyCert.cer 文件中的证书文本是否在ca-bundle.crt 文件中(应该是),如果不只是复制并粘贴 MyCert.cer 中的所有文本并将其附加到 ca-bundle 的底部.crt 文件(确保将所有其他证书信息保留在其中)。

-----开始证书-----

您的证书信息在这里

-----结束证书-----

如果您必须修改 ca-bundle.crt 文件然后保存(您可能需要将其保存到桌面,然后复制并粘贴回去以覆盖 ca-bundle.crt 文件) 最后,根据ca-bundle.crt 文件的路径运行以下命令:git config --global http.sslcainfo "C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt"

【讨论】:

因为我的回答是基于 Windows 环境的,所以我想分享更多信息。在 Chrome 58 中,我们必须重新生成我们的证书以获得主题备用名称 (SAN)。上述方法不再适用于这个新证书。通过 Visual Studio 进行 Git 克隆会出错“无法获取本地颁发者证书”。如果您信任 Windows 证书存储中的证书(Chrome、Internet Explorer 等使用的那个),那么为什么不告诉 Git 使用此证书存储而不是默认的 openssl CA 包呢?为此,请运行以下命令: git config --global http.sslBackend schannel 还要检查 C:\Users\username\AppData\Local\Programs\Git\mingw64\ssl\certs【参考方案5】:

我在使用 GitHub 时遇到了这个错误,它似乎是突然出现的。我之前在 GitHub 上做过很多工作。

卡巴斯基杀毒软件是罪魁祸首!!

当我关闭我的防病毒保护(并等待几分钟)时,我能够从我的 github 存储库中推/拉。

我的最终解决方案是从 Kaspersky 找到一个证书,然后将其添加到 Git for Windows 信任库。后一步已在接受的答案中详细说明,但对于处于类似位置的其他人,我可以通过以下方式找到卡巴斯基证书:

设置 > 其他 > 网络 > 加密连接扫描 - 高级设置 > 安装证书 > 显示证书 > 详细信息 > 复制到文件 > Base-64 编码 X.509 (.cer)

【讨论】:

【参考方案6】:

我为这个问题找到了另一个答案:

$ git config http.sslVerify false

【讨论】:

查看预览答案 - 这是危险的,不推荐 - 它会让你像中间人一样受到攻击 @yehonatanyehezkel - 希望可以成为这个的替代方式。? 作为临时解决方案可能还不错-但我认为最好从基础解决认证问题...而不是在重要项目中冒险。【参考方案7】:

我遇到了同样的问题,因为我的笔记本电脑死机并且时钟重置为默认设置。如果您遇到这种情况,请将您的时钟设置为当前日期和时间,问题应该会得到解决。

如果您的时钟设置正确,请遵循其他人的建议。

【讨论】:

【参考方案8】:

我也遇到过类似的问题,错误是“证书已过期”。在意识到 git 使用自己的 CA 存储后,我刚刚更新了 Git,问题就消失了。 附:顺便说一句,最近的 Git for Windows 可以使用 Windows 证书存储,这在企业环境中会更方便。

【讨论】:

【参考方案9】:

如果它以前可以正常工作,但由于 SSL 错误而突然停止工作,请尝试重新启动系统一次。这种方式对我有用

【讨论】:

【参考方案10】:

我在通过不安全的网络连接时遇到了同样的错误。切换网络解决了我的问题。

【讨论】:

以上是关于推送到 Git 服务器时 SSL 证书无效的主要内容,如果未能解决你的问题,请参考以下文章

当git从计算机推送到vps服务器时,权限被拒绝公钥[重复]

创建Octopus包时出现SSL证书错误

如何使用 Git Bash 推送到 GitHub?

让git忽略ssl证书错误

Windows 上 Git 的文件描述符无效问题

腾讯云服务器导入ssl证书提示输入密码,申请时没有输入私钥