小编典典

将 Git 配置为接受特定 https 远程的特定自签名服务器证书

all

我正在进行的一个项目的系统管理员认为 SSH “太麻烦”了;相反,他将 Git 设置为可通过https://URL(和用户名/密码验证)访问。该 URL
的服务器提供了一个自签名证书,因此他建议大家关闭证书验证。从安全角度来看,这并不是一个好的设置。

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


阅读 56

收藏
2022-06-24

共1个答案

小编典典

简要地:

  1. 获取自签名证书
  2. 将其放入某个(例如~/git-certs/cert.pem)文件中
  3. 使用参数设置git信任此证书http.sslCAInfo

详细信息:

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

假设服务器 URL 是repos.sample.com并且您想通过 port 访问它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。这样,我必须将该域的例外添加到我的网络浏览器中。

使用 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)。

2022-06-24