GIT 客户端如何处理存储库错误的 SSL 设置?

How does GIT client deals with wrong SSL settings of repository?

对于我在 Java 应用程序上编写的个人宠物项目,它通过 https 从 GIT 存储库中提取代码并执行一些分析。但是,当我开始针对公司存储库中的代码存储对其进行测试时,出现“PKIX 路径构建失败”和“无法找到到请求目标的有效证书路径”错误。

快速谷歌搜索显示问题的主要原因是基础设施中的 SSL 设置不正确,例如自签名证书。

我找到了避免此错误的可能解决方法:

  1. 手动将主机证书添加到 JRE 可信证书中。
  2. 在启动期间将证书动态添加到应用程序资源文件中的受信任证书。
  3. 在应用程序启动期间完全禁用 SSL 验证,但这会使应用程序容易受到“中间人”攻击。 但这不是问题。

当我使用标准 GIT 客户端(也通过 https)使用此公司存储库时,我从未遇到过任何 SSL 或证书问题。所以问题是 - 官方 GIT 客户端如何避免链中自签名证书的这个问题?

Git 本身不会对这些做任何事情。

Git 在与其他 Git 提供者交谈时使用助手——外部程序和库。这些程序和库负责所有这些。因此,如果您使用 git fetchgit push——请注意 git pull 使用 git fetch——并且将它们与以 https:// 开头的 URL 一起使用, Git 使用系统提供的 HTTPS 库,1 通常称为“libcurl”或简称为 curl。如果您使用 ssh:// URL,Git 使用系统提供的 ssh.

Pro Git Book includes a chapter on Git Internals, with one section dedicated to Environment Variables。使用 libcurl 时,这些变量特别有用:

  • GIT_CURL_VERBOSE 打印出与 curl -v 相同的内容。
  • GIT_SSL_NO_VERIFY 关闭 SSL 证书验证。所以默认必须是 do 验证,(当然)自签名证书会有问题。

When I was working with this corporate repository with standard GIT client (through https too) I've never got any issues with SSL or certificates.

这很有趣也很好奇;也许调用 Git 设置 GIT_CURL_VERBOSE 会显示这里发生了什么,或者可能不会。或者,也许用于构建您的特定 Git 的 libcurl 使用了一些您的 Java 库不使用的 CA 文件。


1这方面的细节将取决于您的 Git 二进制文件是如何构建的。如果愿意,您可以获取 Git 的源代码并自行构建,从而控制使用哪个库。