将 Git 配置为接受特定 https 远程的特定自签名服务器证书

Posted

技术标签:

【中文标题】将 Git 配置为接受特定 https 远程的特定自签名服务器证书【英文标题】:configure Git to accept a particular self-signed server certificate for a particular https remote 【发布时间】:2012-02-22 17:58:45 【问题描述】:

我参与的一个项目的系统管理员认为 SSH “太麻烦了”;相反,他将 Git 设置为可通过https:// URL(和用户名/密码身份验证)访问。该 URL 的服务器提供了一个自签名证书,因此他建议大家关闭证书验证。在安全方面,我觉得这不是一个好的设置。

是否可以告诉 Git 对于远程 X(或者更好的是,任何存储库中恰好以 https://$SERVERNAME/ 开头的任何远程)它是接受一个特定的证书,并且该证书?基本上复制了 SSH 的服务器密钥行为。

【问题讨论】:

你是在问关于 Unix 上的 C Git,我猜? 是的。好吧,可以想象还有 Windows,但现在没有人这样做。 WTF? @Zack 你对证书检查是绝对正确的。当您的管理员说您应该关闭证书检查时,他还可以关闭服务器上的 TLS,因为这样每个人都会禁用针对中间人攻击的保护。 @Rudi,如果他们使用IP地址访问服务器,情况仍然如此吗? (似乎 DNS 查找是 MITM 介于两者之间的方式,所以我认为 IP 地址应该对此免疫。) @Chris 是的,情况仍然如此。 MITM 路由器可以伪装成他们想要的任何 IP 地址。 (您知道在机场的免费 wifi 上获得的那些插页式页面吗?那些是 MITM。尝试通过 IP 地址访问页面。) 【参考方案1】:

在从单一来源分发证书的企业环境中的 Windows 上,我发现这个答案解决了这个问题:https://***.com/a/48212753/761755

【讨论】:

【参考方案2】:

OSX 用户调整。

在 OSX 上进行配置时,按照已接受答案的步骤对我有用,只需添加一点点。

我将 cert.pem 文件放在我的 OSX 登录用户下的目录中,从而导致我调整受信任证书的位置。

配置 git 以信任此证书:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem

【讨论】:

【参考方案3】:

简单地说:

    获取自签名证书 将其放入某个(例如~/git-certs/cert.pem)文件中 使用http.sslCAInfo 参数将git 设置为信任此证书

更多细节:

获取远程服务器的自签名证书

假设,服务器 URL 是 repos.sample.com,您想通过端口 443 访问它。

有多种选择,如何获取。

使用 openssl 获取证书

$ openssl s_client -connect repos.sample.com:443

将输出捕获到文件cert.pem 并删除除-BEGIN CERTIFICATE--END CERTIFICATE- 之间(包括)之间的所有部分

生成的文件 ~/git-certs/cert.pem 的内容可能如下所示:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
EwYDVQQIEwxMb3dlciBTYXhvbnkxEjAQBgNVBAcTCVdvbGZzYnVyZzEYMBYGA1UE
ChMPU2FhUy1TZWN1cmUuY29tMRowGAYDVQQDFBEqLnNhYXMtc2VjdXJlLmNvbTEj
MCEGCSqGSIb3DQEJARYUaW5mb0BzYWFzLXNlY3VyZS5jb20wHhcNMTIwNzAyMTMw
OTA0WhcNMTMwNzAyMTMwOTA0WjCBkzELMAkGA1UEBhMCREUxFTATBgNVBAgTDExv
d2VyIFNheG9ueTESMBAGA1UEBxMJV29sZnNidXJnMRgwFgYDVQQKEw9TYWFTLVNl
Y3VyZS5jb20xGjAYBgNVBAMUESouc2Fhcy1zZWN1cmUuY29tMSMwIQYJKoZIhvcN
AQkBFhRpbmZvQHNhYXMtc2VjdXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMUZ472W3EVFYGSHTgFV0LR2YVE1U//sZimhCKGFBhH3ZfGwqtu7
mzOhlCQef9nqGxgH+U5DG43B6MxDzhoP7R8e1GLbNH3xVqMHqEdcek8jtiJvfj2a
pRSkFTCVJ9i0GYFOQfQYV6RJ4vAunQioiw07OmsxL6C5l3K/r+qJTlStpPK5dv4z
Sy+jmAcQMaIcWv8wgBAxdzo8UVwIL63gLlBz7WfSB2Ti5XBbse/83wyNa5bPJPf1
U+7uLSofz+dehHtgtKfHD8XpPoQBt0Y9ExbLN1ysdR9XfsNfBI5K6Uokq/tVDxNi
SHM4/7uKNo/4b7OP24hvCeXW8oRyRzpyDxMCAwEAATANBgkqhkiG9w0BAQUFAAOC
AQEAp7S/E1ZGCey5Oyn3qwP4q+geQqOhRtaPqdH6ABnqUYHcGYB77GcStQxnqnOZ
MJwIaIZqlz+59taB6U2lG30u3cZ1FITuz+fWXdfELKPWPjDoHkwumkz3zcCVrrtI
ktRzk7AeazHcLEwkUjB5Rm75N9+dOo6Ay89JCcPKb+tNqOszY10y6U3kX3uiSzrJ
ejSq/tRyvMFT1FlJ8tKoZBWbkThevMhx7jk5qsoCpLPmPoYCEoLEtpMYiQnDZgUc
TNoL1GjoDrjgmSen4QN5QZEGTOe/dsv1sGxWC+Tv/VwUl2GqVtKPZdKtGFqI8TLn
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

使用您的网络浏览器获取证书

我将 Redmine 与 Git 存储库一起使用,并且我为 Web UI 和 git 命令行访问访问相同的 URL。这样,我必须将该域的例外添加到我的网络浏览器中。

使用 Firefox,我去了Options -> Advanced -> Certificates -> View Certificates -> Servers,在那里找到了自签名主机,选择了它并使用Export 按钮我得到了与使用openssl 创建的完全相同的文件。

注意:我有点惊讶,没有明显提及的权威名称。这很好。

在专用文件中拥有可信证书

前面的步骤将导致证书在某个文件中。只要在访问该域时对您的 git 可见,它是什么文件都没有关系。我用~/git-certs/cert.pem

注意:如果您需要更多受信任的自签名证书,请将它们放入同一个文件中:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AnOtHeRtRuStEdCeRtIfIcAtEgOeShErExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

这应该可以(但我只用一个证书测试了它)。

配置 git 以信任此证书

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem

您也可以尝试在整个系统范围内使用--system 而不是--global

并对其进行测试:您现在应该能够与您的服务器进行通信,而无需诉诸:

$ git config --global http.sslVerify false #NO NEED TO USE THIS

如果您已经将您的 git 设置为不知道 ssl 证书,请取消设置:

$ git config --global --unset http.sslVerify

您还可以检查,您是否正确执行了所有操作,没有拼写错误:

$ git config --global --list

什么应该列出所有变量,你已经全局设置了。 (我将 http 拼错为 htt)。

【讨论】:

我认为这个答案比公认的答案更正确和完整。谢谢@Jan Vlcinsky @MichaelIvko 解决方案考虑了此处描述的“通常的权威签名证书”(您需要将证书添加到“curl-ca-bundle.crt”文件):blogs.msdn.com/b/phkelley/archive/2014/01/20/… 这种方法的问题在于,它有效地删除了 git 附带的所有默认 CA(例如,在这样做之后,您将无法从 github 拉取)。很可能这不是大多数人想要的。一个更好的例子是将新的根 CA 添加到 Git\bin\curl-ca-bundle.crt 的副本中,然后从 gitconfig 中引用 curl-ca-bundle.crt 的新副本。 它确实适用于 Windows!将证书链中的每个证书导出为 Base64 编码的 X.509 文件 (.CER) 将所有文件放在一起并引用此文件。确保证书文件的路径中没有空格(使用老式路径) 不禁用所有域的所有默认/系统 CA,而仅禁用此域使用:git config --global http."https://repos.sample.com".sslCAInfo /home/javl/git-certs/cert.pem 并且如果有任何 http url 被另外重定向也 git config --global http."http://redirect-source.example.com".sslCAInfo /home/javl/git-certs/cert.pem

以上是关于将 Git 配置为接受特定 https 远程的特定自签名服务器证书的主要内容,如果未能解决你的问题,请参考以下文章

不需要接受提交以开发具有特定名称模式的分支

如何将 git 存储库回滚到特定提交?

如何在git中的特定分支上配置访问列表

来自远程特定哈希的 git 存档

如何创建将侦听特定端口并接受 TCP 连接(非 https)的 servlet

提交机器特定的配置文件