代理背后的 GitHub Windows 客户端

Posted

技术标签:

【中文标题】代理背后的 GitHub Windows 客户端【英文标题】:GitHub Windows client behind proxy 【发布时间】:2013-04-15 17:30:03 【问题描述】:

我正在尝试让适用于 Windows 的 GitHub 客户端正常工作。我在公司代理和防火墙后面的公司 Win 7 x64 计算机上。关注其他各种帖子并尝试环境变量和配置变量的多种组合后,我发现让克隆和推送更新工作的唯一方法是使用 HTTPS_PROXY 环境变量,包括我的完整公司域用户 ID 和密码。

从安全角度来看,这是不可接受的。有没有其他方法可以让它工作?

补充说明:

以下工作:

添加一个名为HTTPS_PROXY 的环境变量,其值为http://[domain]\[userid]:[password]@someproxy.mycorp.com:8080

以下操作不起作用

HTTPS_PROXY 变量中省略用户 ID 和密码 使用名为 HTTP_PROXY 的环境变量(无 S) 将 http.proxy 变量添加到全局配置文件 (.gitconfig) 将https.proxy 变量添加到全局配置文件中

在所有情况下,GitHub 客户端仍然无法识别代理:文件TheLog.txt的内容总是在启动时显示以下内容:

[time]|INFO|thread:4|GitHub.Helpers.StartupLogger|Proxy information: (None)
[time]|INFO|thread:4|GitHub.Helpers.StartupLogger|Couldn't fetch creds for proxy

然后是几次失败的代理身份验证尝试的输出,所有这些都表明“凭据丢失”。

【问题讨论】:

添加环境变量对我有用,但这是一个不可接受的解决方案,因为它会将我的域/密码暴露给任何可以访问环境变量的应用程序。 jacobbenson.com/?p=302#sthash.DzPYdGUU.dpbs 解释说这是由 gui(它正确使用 windows 设置代理)在后台为 git 命令调用 msysgit 引起的。 msysgit 使用 libcurl 处理 http 请求,它不使用 windows 代理设置。正在几个领域解决这个问题,包括 github.com/libgit2/libgit2sharp 的 libgit2sharp。 【参考方案1】:

如果您需要强制 Git 或 GitHub 客户端绕过代理(使用直接连接),只需将 .gitconfig 中的代理 URI 设置为空字符串即可。您可能必须手动编辑文件,我没能说服git config 命令将配置指令的值设置为空字符串(尝试过git config --global http.proxy "")。

所以只需将以下行添加到~/.gitconfig

[http]
    proxy = ""
[https]
    proxy = "" 

【讨论】:

【参考方案2】:

将这些条目添加到用户目录中的“.gitconfig”文件中(转到 %USERPROFILE%):

[http]
    proxy = http://<proxy address>:<proxy port>

[https]
    proxy = https://<proxy address>:<proxy port>

如果您不想以明文形式存储密码,我会使用像 CNTLM 这样的本地代理转发器,它允许您引导所有流量通过它并可以存储经过哈希处理的密码。


与原始问题不同,如果您不在乎密码是否为纯文本格式,请添加以下内容:

[http]
    proxy = http://<username>:<password>@<proxy address>:<proxy port>

[https]
    proxy = https://<username>:<password>@<proxy address>:<proxy port>

【讨论】:

如果您需要代理授权,请参阅 edufinn 回答:proxy=http://:@: @JanHommes 最初的问题是专门询问如何在不以明文形式存储密码的情况下做到这一点 @Sogger 如果我的密码中包含“@”字符,我应该如何配置密码,谢谢您的帮助。 @coastline ***.com/questions/6172719/… 如果您使用的是 CNTLM,请确保按照建议将代理指向 127.0.0.1 而不是 localhost。在 Windows 中,似乎 localhost 首先指向 CNTLM 不侦听的 IPv6 地址。因此,git 会等到超时(几分钟)再切换到 IPv4 地址。【参考方案3】:

这里是在github中设置代理的方法

git config --global http.proxy http://<username>:<pass>@<ip>:<port>
git config --global https.proxy http://<username>:<pass>@<ip>:<port>

在我的大学里,我们没有用户名和密码,所以如果我们的大学 ip 是 172.16.10.10 和 端口是 8080

git config --global http.proxy http://172.16.10.10:8080
git config --global https.proxy http://172.16.10.10:8080

P.S -> 我建议使用这种方法来设置代理,因为随着您的进一步了解,事情会落实到位Source

【讨论】:

【参考方案4】:

对我们来说,解决方案涉及两件不同的事情。首先,如 Sogger 的回答中所述,您需要将条目添加到位于 %USERPROFILE%.gitconfig 文件中。

[http]
    proxy = http://<proxy address>:<proxy port>

[https]
    proxy = https://<proxy address>:<proxy port>

其次,(这是我们缺少的部分)您需要在代理服务器上配置一个例外,以允许 未经身份验证的代理流量到 @987654326 @

在 iPrism 中,它看起来像这样:

问题不在于代理,而在于身份验证。绕过身份验证要求允许使用 GitHub 桌面客户端克隆和处理项目所需的通信。

另请注意,此方法不需要在.gitconfig 文件中存储代理凭据

【讨论】:

【参考方案5】:

我发现this blog 很有用。它描述了ntlmaps 代理。它可能不太安全,但工作顺利。我无法让 cntlm 工作。

【讨论】:

【参考方案6】:

尝试了以上所有方法 - 但没有成功,唯一对我有帮助的是 CNTLM - http://cntlm.sourceforge.net/。

安装它并运行cntlm -H,然后验证corp代理,用cntlm的输出编辑cntlm.ini文件,重新启动windows服务。更新 .gitconfig 为:

[https] proxy = localhost:3128
[http] proxy = localhost:3128

现在 cntlm 将执行所有身份验证,您将能够在 corp 代理后面使用 GitHub(和 Dropbox,顺便说一句)。至少在下一次密码更改之前:) (而不是 cntlm -H 的东西)

【讨论】:

如果 git clone、fetch 或 pull 等远程操作需要很长时间才能完成,请尝试将 .gitconfig 切换为:[https] proxy = 127.0.0.1:3128 [http] proxy = 127.0。 0.1:3128 重启什么windows服务? @Mukus cntlm - 如果我没记错的话,它会在安装后以服务模式运行。 我进行了更改,重新启动它仍然无法正常工作。【参考方案7】:

如果您在企业中使用适用于 Windows 的 GitHub,那么您很有可能使用了严重的企业防火墙/代理。 GitHub for Windows 的 GUI 中还没有用于设置选项的代理参数。

要将 GitHub for Windows 配置为使用您的公司代理,请编辑通常位于 C:\Users\.gitconfig 或 C:\Documents & Settings\.gitconfig 的 .gitconfig 文件

关闭 GitHub for Windows;在 .gitconfig 中,只需添加

[https] 代理 = proxy.yourcompany.com:port

【讨论】:

【参考方案8】:

我也遇到过这个问题,也尝试深入研究一下(拆解了客户端)。

我们看到的生成日志消息的代码如下:

private static void LogProxyServerConfiguration()

    WebProxy defaultProxy = WebProxy.GetDefaultProxy();
    string str = defaultProxy.Address != (Uri)null ? defaultProxy.Address.ToString() : "(None)";
    StartupLogger.log.Info((IFormatProvider)CultureInfo.InvariantCulture, "Proxy information: 0", str);
    try
    
        if (defaultProxy.Credentials == null)
        
            StartupLogger.log.Info((IFormatProvider)CultureInfo.InvariantCulture, "Couldn't fetch creds for proxy", new object[0]);
        
        else
        
            NetworkCredential credential = defaultProxy.Credentials.GetCredential(GitHubClient.GitHubDotComUri, "Basic");
            StartupLogger.log.Info((IFormatProvider)CultureInfo.InvariantCulture, "Proxy is authenticated: 0", credential != null && !string.IsNullOrWhiteSpace(credential.UserName));
        
    
    catch (Exception ex)
    
        StartupLogger.log.InfoException("Couldn't fetch creds for proxy", ex);
    

所以这个块只记录在 IE 中设置的代理信息。日志消息似乎与我们在配置文件或环境变量中设置的内容无关。

【讨论】:

【参考方案9】:

我能够让 GitHub Shell 与我们的公司代理一起工作。我正在启动 GitHub Shell 并执行以下命令:

export http_proxy=http://<username>:<password>@<corporate proxy>:3128

我真的很想让 GUI 也能工作。但我不想设置包含我的公司凭证信息的 Windows 全局环境变量。

奇怪的是 GitHub GUI 客户端能够连接到 GitHub 进行用户身份验证,但唯一的问题是从 GitHub 克隆、拉取和推送项目。似乎问题出在git实现上。我能够将 git 配置为通过我们的代理运行,而无需将我的凭据放入 git 全局设置中,并且它在执行拉取或推送请求时要求我提供凭据。但这仅在 Git Shell 中有效。

【讨论】:

那是因为 GitHub 可能在内部使用一些从操作系统中提取代理信息的组件进行身份验证,可能是一些 SingleSignOn 解决方案,而 git 本身没有。我对 SourceTree 有同样的问题。我还发现,当 git 工作时,它需要很长时间才能工作,这使得 SourceTree 无法使用。 这可能是因为 Github 正在尝试使用通常被过滤的 git 端口,因为它不是 IT 人员看到的常见端口。请参阅我的答案以获取替代方案。【参考方案10】:

我不知道你的防火墙,但我的校园使用代理

你使用任何 git gui 吗? 编辑:刚刚注意到您正在使用 github 客户端 for windows

我正在使用 tortoisegit,它很容易设置代理。只需右键单击任意位置,tortoisegit>network,启用代理服务器并设置服务器地址、用户名和密码。完成

据我所知,tortoisegit 也可以与 github 一起使用。

【讨论】:

以上是关于代理背后的 GitHub Windows 客户端的主要内容,如果未能解决你的问题,请参考以下文章

公共反向代理背后的 WCF Webservice

Nginx反向代理配置

设计模式代理模式 ( 简介 | 适用场景 | 优缺点 | 代理扩展 | 相关设计模式 )

nginx 配置模板

Github 代理

如何配置 GitHub Desktop/Windows 以使用代理?