git clone 是不是通过 NTLM 代理工作?

Posted

技术标签:

【中文标题】git clone 是不是通过 NTLM 代理工作?【英文标题】:Does git clone work through NTLM proxies?git clone 是否通过 NTLM 代理工作? 【发布时间】:2010-12-19 12:17:49 【问题描述】:

我已经尝试过使用export http_proxy=http://[username]:[pwd]@[proxy]git config --global http.proxy http://[username]:[pwd]@[proxy]

我无法让它工作。看起来 git 使用基本身份验证:

Initialized empty Git repository in /home/.../.git/
* Couldn't find host github.com in the .netrc file, using defaults
* About to connect() to github.com port 8080 (#0)
*   Trying 10.... * Connected to github.com (10....) port 8080 (#0)
* Proxy auth using Basic with user '...'
> GET http://github.com/sunlightlabs/fiftystates.git/info/refs HTTP/1.1
Proxy-Authorization: Basic MD...
User-Agent: git/1.6.1.2
Host: github.com
Pragma: no-cache
Accept: */*
Proxy-Connection: Keep-Alive

< HTTP/1.1 407 Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to t
he Web Proxy filter is denied.  )
< Via: 1.1 ...
< Proxy-Authenticate: Negotiate
< Proxy-Authenticate: Kerberos
< Proxy-Authenticate: NTLM
< Connection: Keep-Alive
< Proxy-Connection: Keep-Alive
< Pragma: no-cache
< Cache-Control: no-cache
< Content-Type: text/html
< Content-Length: 4118
* The requested URL returned error: 407
* Closing connection #0
fatal: http://github.com/sunlightlabs/fiftystates.git/info/refs download error - The requested URL returned error: 407

Google 搜索返回的结果不一,而且可能没有更新。它在某处说curl (曾经?)在幕后使用,但它的选项(曾经?)硬连线到代码中。例如,

curl --proxy-ntlm --proxy ...:8080 google.com

有效,我想在 git 中使用相同的选项。

我需要一些更明确的答案:有人通过 Windows 代理成功使用 git 吗?哪个版本?

谢谢。

【问题讨论】:

目前我正在使用代理网关在 NTLM 代理和 git 识别的“常规”代理之间进行转换。它是 NTLM APS:ntlmaps.sourceforge.net。我记得这是一个很常见的解决方案,例如适用于 Linux 包管理器。 我将 NTLMAPS 用于 Subversion,但不适用于 git。 相关***.com/questions/128035/… 使用 NTLMAPS,我得到致命:无法访问'github.com/gruehle/exclude-folders':CONNECT 后从代理收到 HTTP 代码 407。知道为什么吗? 是的,见***.com/questions/29338620/… 【参考方案1】:

默认 NTLM 凭据

要使用默认 NTLM 凭据,请提供空的用户名和密码

git config --global http.proxy https://:@proxy:port

ISA 服务器的防火墙客户端

您可以使用 Microsoft 的 Firewall Client for ISA Server,而不是为 git、npm 等设置代理。安装后:

Start &gt; Autostart &gt; Microsoft Firewall Client Management

Settings tab > Manual specified ISA Server > proxy:port Web Browser tab > Uncheck "Enable web browser automatic configuration."

【讨论】:

太棒了。其他一切都失败了,但这个。谢谢。 这是正确的遮阳篷。所有其他只是解决方法 - 你只需要 http(s)://:@YOURPROXY【参考方案2】:

Git 从 1.7.10 版本开始支持 NTLM 代理认证,相关提交为https://github.com/gitster/git/commit/dd6139971a18e25a5089c0f96dc80e454683ef0b

1.7.10 release notes 简要提到它为:

* HTTP transport learned to authenticate with a proxy if needed.

我已经在我的工作场所使用 NTLM 代理成功地对其进行了测试,并且需要用户/通行证,您可以使用以下命令进行测试:

git config --global http.proxy http://user:password@proxy.com:port
git clone http://git.videolan.org/git/bitstream.git

问候,

【讨论】:

这对我不起作用...至少不适用于我还需要指定域名的代理。 @NirmalPatel 现在的问题是 Gnome 将他们的 http git url 重定向到他们的 https 版本,并且您的代理可能阻止了 https,所以我用可以访问的新随机 git 存储库更新了我的答案用http,试试看。 还是没有运气...Cloning into 'bitstream'... fatal: unable to access 'http://git.videolan.org/git/bitstream.git/': The requested URL returned error: 407 这可以在不将用户名和密码实际嵌入配置文件(磁盘上的纯文本)的情况下完成,这是一个明显的安全错误。 ***.com/questions/29338620/… 供将来参考(@NirmalPatel 我也遇到了您的问题):git config --global http.proxy https://DOMAIN\\USERNAME:PASSWORD@ntlmproxy.internaldomain.org:PORT/ - 请注意 DOMAIN 后的双斜杠。这是用于 Windows 的 Git bash(由 Git Extensions for Visual Studio 安装)【参考方案3】:

克隆对我有用,但只能通过 HTTP(因为我们的公司防火墙阻止了 ssh/git 协议):

$ export http_proxy="http://username:password@proxy:port/"
$ git clone http://github.com/sunlightlabs/fiftystates_site.git fifty
Initialized empty Git repository in /home/user/fifty/.git/
got e15f5192b923d8e87abaeb9406d0f4d80403da09
walk e15f5192b923d8e87abaeb9406d0f4d80403da09
got a78b792191f1cf5e961753dcfe05e9c809bdb0ed
got 76e6e86e72a0f998f7663da69ca49c457a302e27
walk 76e6e86e72a0f998f7663da69ca49c457a302e27
got 35b68a3b876fb90e73ba7a7eb51432e825ef2aa3
...

Github 建议通过 git://github.com/... 进行克隆,但您必须手动将其更改为 http://github.com/...

编辑:我使用的是 git 版本 1.5.6.3。

希望有帮助!

【讨论】:

您的代理是 NTLM 的吗? (即微软非标准的东西)。 是的,我们拥有的代理肯定是 NTLM 代理。 HTTP 标头:HTTP/1.1 407 代理身份验证需要代理身份验证:NTLM 代理身份验证:BASIC realm="XYZ_NTLM_REALM" ... 看起来您的代理也喜欢 Proxy-Authenticate: BASIC。感谢您对网址的测试。 啊,你说得对。很抱歉没有发现这种差异!所以这意味着你被卡住了? @lemonad 即使您使用此配置选项将存储库添加为 git:// url,您也可以强制 git 使用 http。 git config --global url.https://github.com/.insteadOf git://github.com/【参考方案4】:

AndreaG(在上面的评论中)对这个问题有我能找到的唯一可接受的答案。似乎 Git 不能与 NTLM 代理一起使用,即使它确实应该使用,因为 cURL(它在下面使用)确实可以正常工作。为什么这个问题不能解决我不知道。这似乎是一个相当普遍的问题。

那么,完整的解决方案是使用 ntlmaps 作为代理的代理。您只需从以下地址下载最新版本的应用程序:http://ntlmaps.sourceforge.net/

更改配置文件以包含您的身份验证和代理详细信息,然后将代理设置为您的新本地代理:

git config --global http.proxy http://localhost:5865

我可以确认它工作正常。您不仅可以将它用于任何需要 NTLM 身份验证但不提供完整 NTLM 支持的应用程序。

【讨论】:

也为我工作。请注意,您绝对需要包含 http://。只是将它设置为 localhost:port 对我不起作用。注意我使用cntlm。 这对我也有用。我强烈推荐 ntlmaps,你不需要管理员权限(cntlm 需要)【参考方案5】:

你也可以使用cntlm,

http://cntlm.sourceforge.net/

类似于 ntlmaps 但用纯 C 编写的解决方案。 它的工作方式与 ntlmaps 相同,方法是在您机器上的端口(默认为 3128)上创建本地代理服务器(127.0.0.1)。这个新的本地创建的代理服务器不需要任何身份验证,因此可以与任何支持 http 代理的应用程序一起使用。 如果您需要,它还可以创建一个本地 socks 代理。

与用 python 编写的 ntlmaps 相比,主要优势在于 cntlm 的 CPU 和 RAM 使用率非常低,通常

【讨论】:

非常感谢!用作魅力 Cntlm 尝试使用我的代理凭据对我用于 Git 的 HTTP 服务器进行 BASIC 身份验证。 :-( @ChristopherParker 你是什么意思?它试图窃取凭据?你有源代码来检查它【参考方案6】:

由于这是我在搜索过程中不断发现的问题,因此我将在此处添加我的答案。

我需要通过一个网络上的 http(s) 代理(需要 NTLM 身份验证)访问 github.com 托管的存储库,并且在我们的 Mac OS X 上,在正常的 Internet 连接上它仍然可以工作开发机器。

这是我如何使它工作的。这不适用于每个 git 托管服务提供商,但我发布它以防万一它可以帮助您解决这个问题。这也仅适用于 Mac OS X,但如果您知道如何在网络更改时为您的系统运行某些东西,其余的应该遵循。

在正常设置 ssh 访问后,我必须使用 git clone git@github.com:user/repo.git (http://help.github.com/mac-set-up-git/)。

然后我需要设置一个本地 http(s) 代理来处理 NTLM 身份验证,例如 ntlmaps、cntlm 或 Authoxy。我已经用 Authoxy 进行了测试。我将把这个配置留给你,因为你需要知道自己的代理详细信息。

你还需要开瓶器,如果你有 MacPorts,那就是 sudo port install corkscrew

然后我将以下内容添加到~/.ssh/config

Host github.com.disabled
User git
HostName ssh.github.com
Port 443
ProxyCommand /opt/local/bin/corkscrew localhost 6574 %h %p

其中 6574 是我设置 Authoxy 监听的 TCP 端口。

现在我创建了一个脚本来尝试查找 http(s) 代理服务器,并根据它在/usr/local/bin/locationchanger 找到的内容配置 ssh 设置:

#!/bin/sh

set -o nounset
set -o errexit

sleep 10 # allow for WiFi to actually connect.

# if we can find the proxy server, then use it.
if ! host proxy.internal.network;
then
    echo "Proxy server not found, clearing http(s) proxy";
    sed -i '.backup' -E 's/^Host github.com$/Host github.com.disabled/' "$HOME/.ssh/config"
else
    echo "Proxy server found, setting http(s) proxy";
    sed -i '.backup' -E 's/^Host github.com.disabled$/Host github.com/' "$HOME/.ssh/config"
fi
echo "Done."

别忘了chmod +x /usr/local/bin/locationchanger

现在创建~/Library/LaunchAgents/LocationChanger.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>tech.inhelsinki.nl.locationchanger</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/locationchanger</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Preferences/SystemConfiguration</string>
    </array>
</dict>
</plist>

然后是launchctl load ~/Library/LaunchAgents/LocationChanger.plist。只要网络发生变化,这个已启动的作业就会运行。如果它可以找到您的内部网络 http(s) 代理服务器,它将使 ssh 使用开瓶器通过 Authoxy 工作,它将通过公司代理处理工作。如果它找不到代理服务器,它将禁用特殊的 ssh 配置,你就可以正常工作了。

现在我们的团队不必再考虑网络切换了。

【讨论】:

【参考方案7】:

TL/DR:

export GIT_HTTP_PROXY_AUTHMETHOD=basic

git config --global http.proxyauthmethod basic

当 git (curl) 代理身份验证不起作用时,我遇到了同样的问题。凭证是正确的。升级到最新的 git-v2.15.0 没有帮助。

问题是由于 git-libcurl 选择了错误的代理身份验证方法。

有效的 proxy_authmethod 选项在 git 源码中定义: https://github.com/git/git/blob/d0e9983980a25e0c398cc03342e5ad22ef85b8a8/http.c#L81

proxyauth 方法可以通过GIT_HTTP_PROXY_AUTHMETHOD 环境变量或http.proxyauthmethod git config 选项来定义。环境变量覆盖配置选项值。

【讨论】:

在 Mac 上使用 ntlm auth 遇到了同样的问题。将 proxyauthmethod 设置为 basic 解决了我的问题,谢谢! 非常感谢我的朋友!!!.... 我的代理服务器使用的身份验证方法只是“基本”,所以更改 env 变量是神奇的!【参考方案8】:

我一直在使用 ntlmaps,并且通过 windows/NT 代理取得了不错的效果:http://ntlmaps.sourceforge.net/

git配置为:

git config --global http.proxy http://localhost:5865

【讨论】:

【参考方案9】:

我偶然发现了一个更简单、可能更安全的解决方案,它不仅适用于 git,也适用于任何基于命令的安装程序

Ruby 中的 Rubygems 节点中的 npm

一个从命令行运行所有流量的解决方案通过身份验证进行代理。

不会以 user:password@domain:port 格式公开您的密码

解决方案:

下载Fiddler,它有一个内置的方式来为所有请求添加认证头。

一旦运行菜单规则-> 自动验证(勾选)

那么对于 git

git config --global http.proxy http://localhost:8888
git config --global https.proxy http://localhost:8888

就是这样!

【讨论】:

以上是关于git clone 是不是通过 NTLM 代理工作?的主要内容,如果未能解决你的问题,请参考以下文章

通过 https 代理使用时 git clone 超时

ubuntu下git clone 提速

如何将 .NET WebSocket 客户端与 NTLM 代理一起使用?

IronPython:url请求(也通过ntlm代理)

如何让 git 通过代理和 IntelliJ Idea 工作?

git clone出现的拒绝连接问题