在 Windows 上配置 Git 以使用 NTLM 代理身份验证

Posted

技术标签:

【中文标题】在 Windows 上配置 Git 以使用 NTLM 代理身份验证【英文标题】:Configuring Git on Windows to use NTLM proxy authentication 【发布时间】:2011-06-30 22:23:57 【问题描述】:

我正在尝试从需要 NTLM 身份验证的代理后面的 Windows 计算机访问 Github 上的存储库。 SSH 和 git:// 协议都不能直接使用,所以我试图通过代理使用 HTTPS。

在 NTLM proxy without password? 的帮助下,我已经能够使 msysgit 提供的 curl 二进制文件与代理配合得很好:

curl -U : --proxy-ntlm --proxy xxx.xxx.xx.xx:8080 https://github.com

这样成功,返回Github主页。

但是,我发现 2010 年 2 月 Proxying Git 的一篇文章指出(强调我的):

不幸的是,curl 似乎总是对代理使用基本身份验证。如果您的代理需要其他东西,也许 Windows 网络的 NTLM,那么您遇到了问题。 curl 用于处理所有 http 传输详细信息,它确实支持 NTLM 身份验证方法,但我知道没有任何方法可以将必要的选项传递给 curl。 Git 通过其库绑定使用 curl,因此仅用包装脚本替换 curl 可执行文件是不够的。

我知道 Git 配置中的 core.gitproxy 选项,但这似乎只适用于 git:// 协议。同样,http.proxy 选项设置代理的地址,但无法为 curl 提供适当的选项。

【问题讨论】:

我认为文章中的评论毫无意义。 curl 使用 libcurl 库,它实现了对 NTLM 的支持。 git 是否支持 libcurl 提供的这种功能是另一回事。 顺便说一句,您可以尝试使用 iptables 将请求重定向到 github.com 到您自己的计算机,并使其充当透明代理,然后使用适当的身份验证转发到 NTLM 代理。但是到了这个时候,设置一个 *** 并通过它将流量路由到 github.com 会更容易。 @Artefacto:是的,我知道 git 和 curl 都使用 libcurl,但问题是如何通过 git 将所需的 NTLM 相关选项传递给 libcurl。此外,iptables 是完全不可能的,因为 (a) 客户端机器是 Windows,并且 (b) 本地管理员访问权限不可用。 我认为这只是将curl_easy_setopt(handle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM) 与代理身份验证的其他常用选项(CURLOPT_PROXYCURLOPT_PROXY_TYPECURLOPT_PROXYUSERPWD)一起使用的问题。 【参考方案1】:

试试Cntlm。它是一个代理,旨在位于不理解 NTLM 的程序(例如 Git)和需要 NTLM 的代理之间。它执行 NTLM 身份验证,因此应用程序不必这样做。

我没用过,不知道效果如何。

【讨论】:

Windows 版本的 cntlm 有一个严重的错误:它不会从 .ini 文件中读取父代理, - 您必须将其作为命令行参数传递。 我用过ntlmaps,它也可以。您不需要管理员权限即可使用它,这比 cntlm 更胜一筹 在设置身份验证类型后为我工作得非常好。在 Linux 上运行 cntlm -M <test-address> 以便它可以识别出最适合您的类型,但不确定您是否会在 Windows 中这样做。【参考方案2】:

我使用了 CNTLM 身份验证代理(尽管这很可能也适用于 ntlmaps),因此 git 可以工作并将 http 和 https 代理添加为 http:// localhost:3218。 Git 将花费很长时间来执行任何远程操作,例如获取、拉取或克隆。

解决此问题的方法是改用它:http:// 127.0.0.1:3218

在 .gitconfig 中对此进行更改后,它的运行速度要快得多。

注意:删除 http:// 和 127.0.0.1 之间的空格

例如:

[http] proxy = http:// 127.0.0.1:3128 [https] proxy = http:// 127.0.0.1:3128

【讨论】:

如果使用localhost 需要更长的时间,那么您的名称解析系统就会损坏。使用正确配置的系统,使用localhost127.0.0.1 应该具有相同的性能。 感谢 jhamm,localhost 不起作用,但 127.0.0.1 就像一个魅力! 我已经为 git 命令等待了几个月的 +/- 7 分钟,从 localhost 更改为 127.0.0.1 将其缩短到 2 秒。这需要更多的支持! @Greg Hewgill 更有可能是 GIT 中的一个错误,因为 nslookup localhost 会立即返回 127.0.0.1。在localhost 连接到代理时,我拥有的使用代理的其他软件或脚本没有任何延迟。 Git 在连接前花了 2.5 分钟,现在立即使用 127.0.0.1 与其在 git configs 中设置代理,我建议使用 netsh。在命令行你可以像netsh winhttp set proxy http://127.0.0.1:3128这样设置它这样做的好处是它不仅会影响git,还会影响你可能需要使用的其他应用程序,例如curl和npm。【参考方案3】:

感谢@richard-hansen 指出 Cntlm。它为 windows 代理提供了一个非 windows 适配器。非常整洁。

以下是对我有用的具体步骤:

    下载并安装 Cntlm for windows。 打开 Cntlm.ini(它位于安装文件夹中。) 更新用户名、域。保存它。 从命令行运行cntlm -I -M http://google.com。 Cntlm 将询问您将用于代理服务器的密码。给它。 (很可能是您的 Windows 密码) Cntlm 将识别身份验证方法并生成密钥。拿起那个结果。 (例如 NTLMv2 77B9081511704EE852F94227CF48A793) 使用此信息更新 Cntlm.ini。 (取消注释适当的身份验证并更新密钥) 保存并关闭。 现在您需要启动 Cntlm 代理服务器。 net start cntlm 现在使用 Cntlm 代理信息更新应用程序。对于 Cntlm,它是 127.0.0.1:3128(此信息在 ini 文件中。如果您想要它不同,请在此处更改)。如果是 git git config --global http.proxy 127.0.0.1:3128 git 现在应该可以通过代理正常工作了。

祝你好运!详细步骤here.

【讨论】:

【参考方案4】:

使用 mysysgit 1.9.5(或者更早的版本,但未经测试),您无需在磁盘上的纯文本配置文件中嵌入用户名和密码即可。

git client using GSSAPI for NTLM proxy authentication

这不需要cntlm。

【讨论】:

【参考方案5】:

选项 http.proxy 在 Windows 上非常适合 NTLM 代理,请查看我在类似问题中的以下答案:

https://***.com/a/10848870/352672

【讨论】:

以上是关于在 Windows 上配置 Git 以使用 NTLM 代理身份验证的主要内容,如果未能解决你的问题,请参考以下文章

配置 git 以支持使用不同操作系统的程序员

怎么才能在windows使用git命令

如何设置编辑器以在 Windows 上使用 Git?

如何在WINDOWS下使用copSSH配置GIT服务器+TortiseGIT客户端

在 Windows 上使用 Meld 的 Git 合并工具

windows下Git命令无密码配置注意事项