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

zwo*_*wol 148 git ssl-certificate

我正在进行的项目的系统管理员已经确定SSH"太麻烦"了; 相反,他已将Git设置为可通过https://URL(以及用户名/密码身份验证)访问.此URL的服务器提供自签名证书,因此他建议所有人关闭证书验证.这并不是一个好的设置,安全方面.

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

Jan*_*sky 266

简述:

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

更多细节:

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

假设,服务器URL是repos.sample.com,您想通过端口访问它443.

有多种选择,如何获得它.

使用openssl获取证书

$ openssl s_client -connect repos.sample.com:443
Run Code Online (Sandbox Code Playgroud)

将输出捕获到一个文件中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-----
Run Code Online (Sandbox Code Playgroud)

使用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-----
Run Code Online (Sandbox Code Playgroud)

这应该工作(但我只用单一证书测试它).

配置git以信任此证书

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem
Run Code Online (Sandbox Code Playgroud)

您也可以尝试使用--system而不是使用系统--global.

并测试它:您现在可以与服务器通信而无需诉诸:

$ git config --global http.sslVerify false #NO NEED TO USE THIS
Run Code Online (Sandbox Code Playgroud)

如果你已经将你的git设置为无知ssl证书,请取消设置:

$ git config --global --unset http.sslVerify
Run Code Online (Sandbox Code Playgroud)

并且您也可以检查,您是否正确完成了所有操作,没有拼写错误:

$ git config --global --list
Run Code Online (Sandbox Code Playgroud)

什么应列出所有变量,你已全局设置.(我把http拼错到了htt).

  • @MichaelIvko解决方案考虑了这里描述的"通常的权限签名证书"(您需要将证书添加到'curl-ca-bundle.crt'文件):http://blogs.msdn.com/b/phkelley/存档/ 2014/01/20 /加-A-企业,或自签署证书颁发机构到混帐EXE-S-store.aspx (4认同)
  • 它确实适用于Windows!将证书链中的每个证书导出为Base64编码的X.509文件(.CER)将所有文件放在一起并引用此文件.确保在cert文件的路径中没有空格(使用oldschool路径) (3认同)
  • 要不禁用所有域的所有默认/系统 CA,而仅禁用这一域,请使用:`git config --global http."https://repos.sample.com".sslCAInfo /home/javl/git-certs/ cert.pem`,如果有任何 http url 被额外重定向,还有 `git config --global http."http://redirect-source.example.com".sslCAInfo /home/javl/git-certs/cert。佩姆` (3认同)
  • 我认为这个答案比公认的更正确和完整。谢谢@Jan Vlcinsky (2认同)
  • 在那之后,通常的权威签名证书停止工作,所以我无法从 Github 中提取。有没有办法在不关闭权威签名的情况下添加自签名证书? (2认同)
  • 这种方法的问题在于它有效地删除了git附带的所有默认CA(例如,在执行此操作后,您将无法从github获取).最有可能的并不是大多数人想要的.更好的示例是将新的根CA添加到Git\bin\curl-ca-bundle.crt的副本,然后从gitconfig引用curl-ca-bundle.crt的新副本. (2认同)
  • 这在Windows中似乎不起作用 (2认同)

Chr*_*ton 5

OSX 用户调整。

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

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

配置 git 以信任此证书:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Run Code Online (Sandbox Code Playgroud)


GKa*_*kyi 5

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