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

21

我正在尝试从一个需要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提供的此类功能是另一回事。 - Artefacto
顺便说一句,你可以尝试使用iptables将请求重定向到github.com到你自己的机器,并使其充当透明代理,然后使用正确的身份验证转发到NTLM代理。但是此时,更容易的方法是设置VPN并通过它路由流量到github.com。 - Artefacto
@Artefacto:是的,我知道git和curl都使用libcurl,但问题是如何通过git将所需的NTLM相关选项传递给libcurl。此外,iptables是不可行的,因为(a)客户端机器是Windows,(b)没有本地管理员访问权限。 - Greg Hewgill
我认为这只是使用curl_easy_setopt(handle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM)与代理身份验证的其他常规选项(CURLOPT_PROXY,CURLOPT_PROXY_TYPECURLOPT_PROXYUSERPWD)一起使用的问题。 - Artefacto
5个回答

17

尝试使用 Cntlm。它是一种代理,设计用于介于不理解NTLM(例如Git)的程序和需要NTLM的代理之间。 它通过进行NTLM身份验证,使应用程序无需进行验证。

我没有使用过它,所以不知道它的运行效果如何。


1
Windows 版本的 cntlm 存在一个讨厌的 bug:它无法从 .ini 文件中读取父代理,你必须将其作为命令行参数传递。 - Giorgi Chakhidze
1
我使用过 ntlmaps,并且它也可以工作。相比于 cntlm,你不需要管理员权限来使用它,这是一个优点。 - Juancentro
在设置了身份验证类型后,对我非常有效。在Linux上运行cntlm -M <test-address>,以便它可以为您识别最佳类型,不确定在Windows中是否会执行相同的操作。 - Herick

5
我使用CNTLM认证代理(尽管这也很可能适用于ntlm),以便git能够工作,并将http和https代理添加为http://localhost:3218。Git执行任何远程操作(如fetch、pull或clone)都需要很长时间。
解决方法是改用以下内容: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”需要更长时间,那么您的名称解析系统可能存在问题。在正确配置的系统中,使用“localhost”和“127.0.0.1”应具有相同的性能。 - Greg Hewgill
谢谢jhamm,localhost不起作用,但是127.0.0.1非常好用! - pierrefevrier
我已经等待了几个月的git命令大约7分钟,但是从localhost更改为127.0.0.1后,时间缩短到了2秒。这需要更多的赞! - Nino van Hooff
@Greg Hewgill 更有可能是GIT的一个bug,因为nslookup localhost立即返回127.0.0.1。我拥有的其他软件或脚本在连接到localhost代理时没有任何延迟。Git在连接之前花费了2.5分钟,现在使用127.0.0.1立即连接。 - Adam Kerz
不建议在git配置中设置代理,而是推荐使用netsh。在命令行中,您可以像这样设置:netsh winhttp set proxy http://127.0.0.1:3128 这种方式的优点是它不仅会影响git,还会影响其他可能需要使用的应用程序,如curl和npm。 - Okonomiyaki3000

3
感谢@richard-hansen指出Cntlm。它为Windows代理提供了一个非Windows适配器,非常不错。
以下是对我有效的确切步骤:
1.下载并安装Windows的Cntlm。 2.打开Cntlm.ini(它在安装文件夹中)。 3.更新用户名和域名。保存。 4.从命令行运行cntlm -I -M http://google.com。 5.Cntlm会要求您输入代理服务器密码。输入它。(很可能是您的Windows密码) 6.Cntlm将识别身份验证方法并生成密钥。获取该结果。(例如NTLMv2 77B9081511704EE852F94227CF48A793) 7.使用此信息更新Cntlm.ini。(取消注释适当的身份验证并更新密钥) 8.保存并关闭。 9.现在您需要启动Cntlm代理服务器。net start cntlm 10.现在使用Cntlm代理信息更新应用程序。对于Cntlm而言,它是127.0.0.1:3128(此信息在ini文件中。如果您想更改,请在那里更改)。对于git,git config --global http.proxy 127.0.0.1:3128 11.git现在应该能够通过代理正常工作。
祝好运!详细步骤请参见此处

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接