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


167

我正在进行的一个项目的系统管理员认为SSH太“麻烦了”。相反,他将Git设置为可通过https://URL(以及用户名/密码验证)进行访问。该URL的服务器显示一个自签名证书,因此他建议所有人关闭证书验证。从安全角度来看,这并不适合我作为一个好的设置。

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


我想您是在询问Unix上的C Git吗?
Piotr Findeisen,2012年

嗯 好吧,也可以想象是Windows,但是现在没有人这样做。
zwol 2012年

5
WTF?@Zack,您对证书检查绝对正确。当您的管理员说您应该关闭证书检查时,他还可以关闭服务器上的TLS,因为从那时起,每个人都禁用了针对中间人攻击的保护措施。
鲁迪2012年

@Rudi,如果他们使用IP地址访问服务器,情况仍然如此吗?(似乎DNS查找是MITM介于两者之间的方式,因此我认为IP地址应该对此不受影响。)
克里斯(Chris

6
@克里斯是的,情况仍然如此。MITM路由器可以伪装成他们想要的任何IP地址。(您知道您在机场的免费wifi上获得的那些插页式页面吗?这些都是MITM。尝试通过IP地址访问页面。)
zwol

Answers:


295

简要地:

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

详细信息:

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

假设服务器URL是repos.sample.com,您想通过port访问它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。这样,我必须将该域的例外添加到我的Web浏览器中。

使用Firefox,我转到那里Options -> Advanced -> Certificates -> View Certificates -> Servers,找到了自签名主机,选择了它,然后使用Export按钮获得了与使用完全相同的文件openssl

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

在专用文件中拥有受信任的证书

前面的步骤将导致证书存在某个文件中。没关系,只要它在您访问git时对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)。


1
我认为这个答案比公认的答案更正确和完整。谢谢@扬·维尔辛斯基
Alfredo Cavalcanti

1
之后,通常的授权签名证书停止工作,因此我无法从Github中提取证书。有没有一种方法可以添加自签名证书而不关闭授权签名证书?
Michael Ivko 2014年

4
@MichaelIvko解决方案,其中考虑了此处描述的“通常的权威签名证书”(您需要将证书添加到“ curl-ca-bundle.crt”文件中):blogs.msdn.com/b/phkelley/archive/2014/
01/20

3
这种方法的问题在于,它有效地删除了git随附的所有默认CA(例如,执行此操作后,您将无法从github中提取)。这很可能不是大多数人想要的。更好的示例是将新的根CA添加到Git \ bin \ curl-ca-bundle.crt的副本中,然后从gitconfig中引用curl-ca-bundle.crt的新副本。
crimbo

3
它确实可以在Windows上运行!将证书链中的每个证书导出为Base64编码的X.509文件(.CER),将所有文件放在一起并引用此文件。确保证书文件的路径中没有空格(使用老式路径)
pscheit

3

OSX用户调整。

在OSX上进行配置时,按照“接受的答案”的步骤进行操作对我很有帮助。

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

配置git以信任此证书:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.