【问题标题】:Configuring Git on Windows to use NTLM proxy authentication在 Windows 上配置 Git 以使用 NTLM 代理身份验证
【发布时间】: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 代理。但是到了这个时候,设置一个 VPN 并通过它将流量路由到 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)一起使用的问题。

标签: git proxy ntlm msysgit


【解决方案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 适配器。非常整洁。

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

  1. 下载并安装 Cntlm for windows。
  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 现在应该可以通过代理正常工作了。

祝你好运!详细步骤here.

【讨论】:

    【解决方案4】:

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

    git client using GSSAPI for NTLM proxy authentication

    这不需要cntlm。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        相关资源
        最近更新 更多