我所在项目的系统管理员认为 SSH“太麻烦了”;相反,他将 Git 设置为可通过 https://
URL(和用户名/密码身份验证)访问。该 URL 的服务器提供了一个自签名证书,因此他建议大家关闭证书验证。从安全角度来看,这并不是一个好的设置。
是否可以告诉 Git 对于远程 X(或者更好的是,任何存储库中恰好以 https://$SERVERNAME/
开头的任何远程)它要接受一个特定的证书,并且只有那个证书?基本上重复了 SSH 的服务器 key 行为。
最佳答案
简要说明:
- 获取自签名证书
- 将其放入一些(例如
~/git-certs/cert.pem
)文件 - 使用
http.sslCAInfo
参数设置git
信任此证书
更多细节:
获取远程服务器的自签名证书
假设服务器 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-----
使用网络浏览器获取证书
我将 Redmine 与 Git 存储库一起使用,并且我为 Web UI 和 git 命令行访问访问相同的 URL。这样,我必须在我的网络浏览器中为该域添加异常(exception)。
使用 Firefox,我转到 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信任这个证书
$ 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)。
关于git - 配置 Git 以接受特定 https 远程服务器的特定自签名服务器证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072376/