我所在项目的系统管理员认为SSH“太麻烦了”;相反,他将Git设置为可以通过https:// URL访问(以及用户名/密码身份验证)。这个URL的服务器提供了一个自签名证书,所以他建议每个人都关闭证书验证。在我看来,这不是一个好的设置,安全方面。

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


简要:

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

详情如下:

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

假设服务器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-----

使用web浏览器获取证书

我使用Redmine和Git存储库,我访问相同的URL用于web UI和Git命令行访问。这样,我必须在我的web浏览器中添加该域的例外。

使用Firefox,我去了选项->高级->证书->查看证书->服务器,找到了自签名的主机,选择它,并使用导出按钮,我得到了完全相同的文件,使用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)。


OSX用户调整。

在OSX上配置时,遵循已接受的答案的步骤对我有效,并添加了一小部分。

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

配置git信任此证书:

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

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