在 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_PROXY
、CURLOPT_PROXY_TYPE
和CURLOPT_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
需要更长的时间,那么您的名称解析系统就会损坏。使用正确配置的系统,使用localhost
和127.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 代理身份验证的主要内容,如果未能解决你的问题,请参考以下文章