我正在进行的一个项目的系统管理员认为 SSH “太麻烦”了;相反,他将 Git 设置为可通过https://URL(和用户名/密码验证)访问。该 URL 的服务器提供了一个自签名证书,因此他建议大家关闭证书验证。从安全角度来看,这并不是一个好的设置。
https://
是否可以告诉 Git 对于远程 X(或者更好的是,任何存储库中恰好以 开头的任何远程https://$SERVERNAME/)它是接受一个特定的证书,并且 只 接受那个证书?基本上复制了 SSH 的服务器密钥行为。
https://$SERVERNAME/
简要地:
~/git-certs/cert.pem
git
http.sslCAInfo
详细信息:
假设服务器 URL 是repos.sample.com并且您想通过 port 访问它443。
repos.sample.com
443
有多种选择,如何获得。
$ openssl s_client -connect repos.sample.com:443
将输出捕获到一个文件中cert.pem,并删除所有(包括)-BEGIN CERTIFICATE-和-END CERTIFICATE-
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.
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 config --global http.sslCAInfo /home/javl/git-certs/cert.pem
您也可以尝试在整个系统范围内使用,--system而不是--global.
--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)。