我正在进行的一个项目的系统管理员认为SSH太“麻烦了”。相反,他将Git设置为可通过https://
URL(以及用户名/密码验证)进行访问。该URL的服务器显示一个自签名证书,因此他建议所有人关闭证书验证。从安全角度来看,这并不适合我作为一个好的设置。
是否可以告诉Git,对于远程X(或更好的是,任何以R开头的任何存储库中的任何远程https://$SERVERNAME/
),它都将接受特定证书,并且仅接受该证书?基本上重新复制SSH的服务器密钥行为。
我正在进行的一个项目的系统管理员认为SSH太“麻烦了”。相反,他将Git设置为可通过https://
URL(以及用户名/密码验证)进行访问。该URL的服务器显示一个自签名证书,因此他建议所有人关闭证书验证。从安全角度来看,这并不适合我作为一个好的设置。
是否可以告诉Git,对于远程X(或更好的是,任何以R开头的任何存储库中的任何远程https://$SERVERNAME/
),它都将接受特定证书,并且仅接受该证书?基本上重新复制SSH的服务器密钥行为。
Answers:
简要地:
~/git-certs/cert.pem
)文件中git
为使用http.sslCAInfo
参数信任此证书详细信息:
假设服务器URL是repos.sample.com
,您想通过port访问它443
。
有多种选择以及获取方法。
$ 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 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)。