git - 配置 Git 以接受特定 https 远程服务器的特定自签名服务器证书

标签 git ssl-certificate

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

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

最佳答案

简要说明:

  1. 获取自签名证书
  2. 将其放入一些(例如~/git-certs/cert.pem)文件
  3. 使用 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/

相关文章:

linux - 无法使用git send-email发送源码和补丁

git - 为什么git要添加父目录?

c# - SSL 证书 : A specified logon session does not exist

ssl - 如何找到我网站的 SSL 证书?

PostgreSQL SSL 配置

azure - 在 Azure 中创建的 VM 上的 TenantEncryptionCert

git - 获取 Git 提交,进行更改,然后重新提交

在没有其他远程更改的情况下从远程主分支进行 git cherry pick

git - .gitignore 无法忽略文件

Nginx - 如何访问客户端证书的主题备用名称(SAN)字段