git clone有效,但在更换防火墙后面的SSL证书后不会推送

Sne*_*erd 12 git github

克隆我的回购工作; 推回去没有.

第一次克隆不起作用:

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

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

[http]
    sslCAInfo = U:/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

现在克隆工作:

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

好了现在推动:

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/'
Run Code Online (Sandbox Code Playgroud)

当我尝试使用我的手机(绕过企业防火墙)通过个人火锅推送时,它推得很好.

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

Adr*_*n W 9

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

那么为什么这个设置不能让你push呢?到目前为止,其他海报忽略的是,这种情况下的错误不是 SSL错误.只有您的客户才能看到您公司的证书.如果解决了,就解决了.Github没有看到这个证书.因此,使用SSL设置进行任何进一步的调整都无济于事.

我可以重现你的情况,因为我可以首先看到SSL自签名证书问题,当我添加代理证书时,该问题就消失了sslCAInfo.坏消息:我无法重现身份验证失败错误.推动github刚刚起作用.好消息:从类似于你的设置推送到github是可能的.

如果它不是SSL问题,那么它只能由代理引起.由于代理向客户端提供自己的证书,因此能够解密SSL流量并对交换的数据进行深入检查.代理可以禁用某些命令,限制对特定站点的访问或从请求中删除用户名/密码.

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

更新

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

  1. 运行Fiddler
  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
Run Code Online (Sandbox Code Playgroud)

在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 [...]          
Run Code Online (Sandbox Code Playgroud)

或者,使用"简洁摘要"(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)
Run Code Online (Sandbox Code Playgroud)

在Fiddler Web Debugger的右窗格中,您可以进一步调查交换的数据.特别是对于上面显示的三个请求中的最后一个,您应该在"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
Run Code Online (Sandbox Code Playgroud)

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

  • 同意 - 这绝对不是SSL问题.我_suspect_(没有太多证据)代理正在剥离基本凭证,因为某些愚蠢的原因.如果这是真的,那么通过HTTP(S)使其正常工作将是非常具有挑战性的. (2认同)
  • @Edward Thomson证据的一部分是来自`remote`的消息,说"匿名访问被拒绝".根据OP的建议,跟Fiddler的原始请求的痕迹很可能会显示"授权标题存在",从而完成证据. (2认同)

Mir*_*ron 4

我相信这可以帮助你。

git config --global http.sslVerify false

正如您可能猜到的,此命令更改 ssl 设置以禁用 ssl 验证。

警告:此方法不安全。

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

git config --unset http.sslVerify