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

35

我正在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证书的网站时,如果您的浏览器不兼容,它会给您提供接受该证书的选项。也许您已经这样做了? - Scott Solmer
今天我用Firefox测试了一下。 Gitblit默认使用自签名证书,而Firefox明显将其识别为无效。在调整gitblit安装后,我成功地将其与现有证书连接起来。现在Firefox指示它信任该证书。 - Justin
1
听起来,你们公司使用了一个内部CA签名证书,该证书已为itscm签署了SSL证书。我猜测CA证书已被添加到您的浏览器的受信任证书中,但是git正在使用一个源,该源不信任与您的浏览器配置的相同的CA链。 - cjc343
可能是防火墙后通过HTTPS访问GitHub时SSL证书被拒绝的重复问题。 - user456814
请在此处查看正确的解决方案:https://dev59.com/CGQn5IYBdhLWcg3wpomp - Jay M
11个回答

48

Git for Windows具有自己的受信任证书存储库,通常位于以下文件中:

  • Git for Windows <=1.9: [Git安装目录]\bin\curl-ca-bundle.crt (例如:C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt;由 [Git安装目录]\etc\gitconfig 中的键 http.sslCAinfo 配置)。
  • Git for Windows >= 2.0:[Git安装目录]\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)不是一个好主意,可能非常危险(因为所有安全检查都被禁用,中间人攻击很容易发生 - 取决于设置位置,它适用于所有新的 https 连接)。

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

  1. 在Microsoft Edge中打开网站的URL

  2. 单击本地栏中的锁图标,选择“连接安全”,然后单击证书图标。

  3. (可选)选择您要在证书链上信任的证书(第三个选项卡),然后打开它。

  4. 进入第二个选项卡“详细信息”

  5. 点击“保存到文件”,选择“Base64编码的X.509(.CER)”并使用独特的名称保存它(请记住该名称,建议不要包含空格)。

  6. 现在您有几个选项

    1. 通过在cli shell中执行git config --global http.sslCAinfo "[yourfilename]"来使用单独的证书信任存储,其中仅包含刚刚下载的证书,以便仅使用此证书作为信任存储。
    2. 通过将系统信任存储文件中的所有内容附加到其上并然后执行git config --global http.sslCAinfo "[yourfilename]"来使用单独的证书信任存储,其中包含您刚刚下载的证书和Git信任存储中的所有证书。
    3. 通过将刚刚保存的文件内容追加到[path-to-git-trust-store-crt-file]中(例如,通过以管理员权限运行的命令行shell中输入type [yourfilename] >> [path-to-git-trust-store-crt-file] )或使用记事本(在桌面上复制ca-bundle.crt文件,追加下载的.crt文件的内容,然后将其复制回去)。缺点:更改可能会在Git更新时被覆盖。
  7. 完成。现在,此证书已在Git for Windows的信任存储中。


    最近的Git for Windows版本还可以使用Windows证书存储,这可能更方便在公司环境中使用。这可以在安装时配置。


在 Internet Explorer 中打开网站的 URL 是指哪个 URL? - Karthikeyan
你在 Git 中用于远程的 URL。 - MrTux
我还需要修改文件 C:\Program Files\Git\mingw64\ssl\cert.pem,我只是在那里添加了base64证书,最终它起作用了。 - bpz
使用第一种选项,只需将“SSL证书问题:证书链中的自签名证书”错误替换为“设置证书验证位置时出错:CAfile:C:\ Program Files \ Git \ mingw64 \ ssl \ certs \ github.cer CApath:none”。 - Kyle Delaney
在我的情况下,git config --global http.sslCAinfo 是空的,而 git config http.sslCAinfo 给了我正确的路径。git config --show-origin -l 显示每个使用的文件,并且可以帮助解决此级别的问题。 - jmd

26

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

在客户端上,如果您设置了git config http.sslVerify false,您可能会更幸运。您还可以全局设置此项


1
是的,我希望我可以在服务器端解决它,而不是让每个人都设置他们的git配置。 - Justin
2
不建议这样做,但以下是如何全局设置: git config --global http.sslVerify false - Gal Bracha
11
禁用SSL验证非常危险。 SSL证书验证的整个目的是在通过HTTPS传输代码时保护其不被篡改。禁用它意味着恶意人员可以在你推送和获取代码时插入漏洞和其他危险物品。除非你确定中间人攻击对你不构成威胁,否则不建议这样做。 - user456814
如果我将 http.sslVerify 设置为 false,那么连接会安全吗?这是一个好的使用方式吗?我们之间正在使用 pfsense 防火墙。 - Nullpointer
1
是的,它能够工作。您可以先禁用 SSL 验证 (git config --global http.sslVerify false),然后运行正常的 git 命令,最后再启用 SSL 验证 (git config --global http.sslVerify true)。 - Daniel Carpio Contreras

5
以下是我的建议。创建一个名为C:\GitCerts的文件夹,然后下载Base64 .cer文件并将其保存到C:\GitCerts文件夹中(可以参考MrTux的回答)。然后在命令行中运行以下命令:git config --global http.sslCAinfo "C:\GitCerts\MyCert.cer"。同时打开MyCert.cer文件和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文件路径执行以下命令:git config --global http.sslcainfo "C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt"

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

2

我在使用GitHub时遇到了这个错误,看起来它突然出现了。之前我在GitHub上做了很多工作。

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

当我关闭了我的防病毒保护(并等了几分钟),我就能够从我的github仓库推送/拉取。

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

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


1

对于那些在公司内,在使用Git时遇到自签名证书错误的人,以下是一个替代方法。

在公司内,与https协议访问相同的git服务器,通常也可以通过ssh协议访问。因此,请选择服务器URL的ssh选项,并克隆存储库:

git clone user@server/project.git

当然,您需要从~\.ssh文件夹中获取公钥(id_rsa.pub)并将其添加到服务器上。这样,您就不必将https服务器证书添加到Windows证书存储或Mac密钥链中(示例)。


1
我发现了一个关于这个问题的答案:

$ git config http.sslVerify false

请勿查看预览答案,这是危险的且不建议这样做,因为它会让您暴露于中间人攻击。 - yehonatan yehezkel
@yehonatanyehezkel - 这个有什么其他的替代方式吗? - Karthikeyan
1
作为一种临时解决方案,也许这样做还可以——但我认为最好从根本上解决认证问题……而不是在重要项目中冒险。 - yehonatan yehezkel

0
执行以下命令帮助我解决了这个问题:
git config --global http.sslbackend schannel

0
如果之前它能够正常工作,但突然出现了SSL错误而停止工作,那么尝试重新启动您的系统。这种方法对我有效。

0

我曾经遇到过类似的问题,错误信息是“证书已过期”。在意识到 git 使用自己的 CA 存储后,我只需更新 Git 即可解决该问题。 P.S. 顺便提一句,最近的 Git for Windows 可以使用 Windows 证书存储,这在企业环境中可能更为方便。


0

我遇到了相同的错误,因为我是通过不安全的网络连接的。更换网络解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接