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

时间:2012-01-30 23:31:55

标签: git ssl-certificate

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

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

4 个答案:

答案 0 :(得分:253)

简言之:

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

    更多细节:

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

    假设服务器网址为repos.sample.com,您希望通过端口443访问它。

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

    使用openssl获取证书

    $ openssl s_client -connect repos.sample.com:443
    

    将输出捕获到文件cert.pem并删除除-BEGIN CERTIFICATE--END CERTIFICATE-之间的所有部分<{1}}

    生成的文件〜/ 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。这样,我不得不将该域的异常添加到我的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)。

答案 1 :(得分:6)

根据this page on aeminium.org  您需要向.git / config添加http.sslCAInfohttp.sslCAPath配置项,其中包含Web服务器的证书。

答案 2 :(得分:1)

OSX用户调整。

在OSX上进行配置时,按照接受的答案的步骤为我工作了一小部分。

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

配置git以信任此证书:

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

答案 3 :(得分:1)

在公司环境中从单一来源分发证书的Windows上,我发现此答案解决了以下问题:https://stackoverflow.com/a/48212753/761755