将 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 远程的特定自签名服务器证书的主要内容,如果未能解决你的问题,请参考以下文章