繁体   English   中英

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

[英]configure Git to accept a particular self-signed server certificate for a particular https remote

我参与的一个项目的系统管理员认为 SSH“太麻烦了”; 相反,他已将 Git 设置为可通过https:// URL(以及用户名/密码身份验证)访问。 该网址的服务器提供了自签名证书,因此他建议大家关闭证书验证。 在安全方面,这并不让我觉得是一个好的设置。

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

简要地:

  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-之间的所有部分,但部分-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-----

使用 Web 浏览器获取证书

我将 Redmine 与 Git 存储库一起使用,并且访问 Web UI 和 git 命令行访问的相同 URL。 这样,我必须在我的 Web 浏览器中添加该域的例外。

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

OSX 用户调整。

在 OSX 上进行配置时,按照 Accepted 答案的步骤对我有用,但添加了一些小内容。

我将cert.pem文件放在我的 OSX 登录用户下的目录中,因此导致我调整受信任证书的位置。

配置 git 以信任此证书:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem

在证书从单一来源分发的企业环境中的 Windows 上,我发现这个答案解决了这个问题: https : //stackoverflow.com/a/48212753/761755

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM