我所在项目的系统管理员认为SSH“太麻烦了”;相反,他将Git设置为可以通过https:// URL访问(以及用户名/密码身份验证)。这个URL的服务器提供了一个自签名证书,所以他建议每个人都关闭证书验证。在我看来,这不是一个好的设置,安全方面。
是否可以告诉Git,对于远程X(或者更好,任何存储库中的任何远程,恰好以https://$SERVERNAME/开头),它将接受一个特定的证书,并且仅接受该证书?基本上重复SSH的服务器密钥行为。
我所在项目的系统管理员认为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