【问题标题】:git clone works but push doesn't after replacing SSL certificate behind firewallgit clone 有效,但在防火墙后面替换 SSL 证书后推送无效
【发布时间】:2018-05-23 16:44:41
【问题描述】:

克隆我的回购作品;推回它不会。

第一次克隆无效:

git clone https://github.com/slimsnerdy/testy.git
Cloning into 'testy'...
fatal: unable to access 'https://github.com/slimsnerdy/testy.git/': SSL certificate problem: self signed certificate in
certificate chain

所以我在.gitconfig 文件中添加了以下自定义证书:

[http]
    sslCAInfo = U:/ca-bundle.crt

现在可以克隆了:

Cloning into 'testy'...
remote: Counting objects: 25, done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 25 (delta 8), reused 6 (delta 1), pack-reused 0
Unpacking objects: 100% (25/25), done.

好的,现在推送:

new-item test.txt
git add *
git commit -m "push test"
git push
Username for 'https://github.com': slimsnerdy
Password for 'https://slimsnerdy@github.com':
remote: Anonymous access to slimsnerdy/testy.git denied.
fatal: Authentication failed for 'https://github.com/slimsnerdy/testy.git/'

当我尝试使用我的手机(绕过公司防火墙)通过个人火锅推送时,它可以正常推送。

为什么clone 使用自定义证书而不使用push? 我想在不使用 ssh 的情况下解决这个问题。

【问题讨论】:

    标签: git github


    【解决方案1】:

    贵公司的防火墙已安装代理,充当man in the middle。为此,它会为您访问的网站创建证书,例如github.com。这些证书显然有一个不同的颁发者(您公司的内部 CA),默认情况下 git 客户端不会信任该颁发者。关闭 sslVerify 会强制 git 客户端接受来自任何颁发者的任何证书。这是有潜在危险的。您最初的方法是将您公司的 CA 添加到 git 客户端信任的发行者列表中,恕我直言,这是允许您的 git 客户端从公司防火墙后面与 github.com 对话的更好方法。

    那么为什么这个设置不让你push?到目前为止,其他发布者忽略的是,这种情况下的错误 not 是 SSL 错误。只有您的客户才能看到您公司的证书。如果解决了,那就解决了。 Github 没有看到这个证书。因此,进一步调整 SSL 设置将无济于事。

    我可以重现您的情况,因为我首先看到 SSL 自签名证书问题,当我将代理证书添加到 sslCAInfo 时该问题消失了。坏消息:我不能重现 authentication failed 错误。推送到 github 刚刚奏效。好消息:可以从类似于您的设置推送到 github。

    如果不是SSL问题,那只能是代理造成的。因为代理向客户端提供了自己的证书,所以它能够解密 SSL 流量并对交换的数据进行深入检查。代理确实有权禁用某些命令、限制对特定站点的访问或从请求中删除用户名/密码。

    请与贵公司的 IT 安全人员交谈。他们应该能够澄清代理是否对 github 或某些 git 命令施加了访问限制。

    更新

    通过 Fiddler 路由 git web 流量可以完成如下(在命令行中使用 git):

    1. 运行提琴手
    2. 在 git bash 中,cd 到您的工作目录并将选项 -c http.sslVerify=false -c http.proxy=127.0.0.1:8888 添加到 git 命令中。

    例子:

    $ git -c http.sslVerify=false -c http.proxy=127.0.0.1:8888 push
    

    在 Fiddler 中,您现在应该会看到如下内容:

    2   200 HTTP    Tunnel to   github.com:443  0           git-remote-https:6512           
    3   401 HTTPS   github.com  /xxx/xxxx.git/info/refs?service=git-receive-pack [...]      
    4   200 HTTPS   github.com  /xxx/xxxx.git/info/refs?service=git-receive-pack [...]          
    

    或者,使用“简洁摘要”(Ctrl/Shift/T)导出:

    CONNECT http://github.com:443
    200 Connection Established ()
    
    GET https://github.com/xxx/xxxx.git/info/refs?service=git-receive-pack
    401 Authorization Required (text/plain)
    
    GET https://github.com/xxx/xxxx.git/info/refs?service=git-receive-pack
    200 OK (application/x-git-receive-pack-advertisement)
    

    在 Fiddler Web 调试器的右窗格中,您可以进一步调查交换的数据。特别是对于上面显示的三个请求中的最后一个,您应该在“Headers”选项卡中看到类似这样的内容:

    GET /xxx/xxxx/info/refs?service=git-receive-pack HTTP/1.1
    Host: github.com
    Authorization: Basic XyzzY1337qQ=
    User-Agent: git/2.13.0.windows.1
    Accept: */*
    Accept-Encoding: gzip
    Pragma: no-cache
    

    因此,您可以证明您的客户确实发送了授权信息。如果没有,我会对结果非常感兴趣。

    【讨论】:

    • 同意 - 这绝对不是 SSL 问题。我怀疑(没有太多证据)代理出于某种愚蠢的原因正在剥离基本凭据。如果这是真的,那么通过 HTTP(S) 使其正常工作将是非常具有挑战性的。
    • Fiddler 是一个调试代理,位于您的客户端和互联网之间。因此,您只会看到客户与您公司的代理之间的通信。您需要的是跟踪您公司的代理和互联网之间的通信。
    • 您需要有关如何通过 fiddler 路由 git 的帮助吗?
    • @Edward Thomson 证据的一部分是来自remote 的消息说Anonymous access denied。正如 OP 所建议的,对 Fiddler 的原始请求的跟踪很可能会显示 Authorization Header is present 并因此完成证据。
    • @Snerd 仅供参考:更新 git for windows(到 2.17.x)提供了一个选择 HTTPS 传输后端的选项。选择:使用 OpenSSL 库使用本机 Windows 安全通道库。后者的描述:服务器证书将使用 Windows 证书存储进行验证。此选项还允许您使用公司内部分发的根 CA 证书,例如通过 Active Directory 域服务。不再需要调整 ca-bundle.crt。
    【解决方案2】:

    用于测试暂时禁用您的存储库的 SSL:

    git config http.sslVerify false
    

    然后还要检查您的系统时钟是否同步,因为这会影响 SSL 验证的工作方式,您可能会得到如下信息:

    [SSL certificate problem, verify that the CA cert is OK. 
    Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed])
    

    尝试使用ntp/chrony来同步你的系统时钟。

    然后获取您可以使用的证书:

    openssl s_client -showcerts -connect github.com:443 < /dev/null
    

    获取-----BEGIN CERTIFICATE----------END CERTIFICATE----- 中的所有内容并创建cert.pem

    然后在http.sslCAInfo 中尝试使用该文件:

    git config http.sslCAInfo /path/to/cert.pem
    

    完成后尝试启用http.sslVerify:

    git config --unset http.sslVerify
    

    【讨论】:

      【解决方案3】:

      我相信这会对你有所帮助。

      git config --global http.sslVerify false

      您可能已经猜到了,此命令会更改 ssl 设置以禁用 ssl 验证。

      警告:此方法不安全。

      如果您想恢复它,您可以随时启用。

      git config --unset http.sslVerify

      【讨论】:

      • 这是尝试的第一件事,但并不“安全”。但是,这并没有解决push
      • @Snerd,它不起作用吗?如果是这样,请让我看看错误信息。
      猜你喜欢
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2017-05-07
      • 2021-11-21
      相关资源
      最近更新 更多