通过 NTLM 对受保护站点使用 wget

Posted

技术标签:

【中文标题】通过 NTLM 对受保护站点使用 wget【英文标题】:using wget against protected site with NTLM 【发布时间】:2010-11-10 15:55:45 【问题描述】:

尝试镜像本地 Intranet 站点并使用“wget”找到以前的问题。它适用于匿名网站,但我无法将它用于需要用户名\密码(具有集成 Windows 身份验证的 IIS)的网站。

这是我传入的内容:

wget -c --http-user='domain\user' --http-password=pwd http://local/site -dv

这是调试输出(注意我显然用虚拟值替换了一些):

将 --verbose(详细)设置为 1 Wget 1.11.4 在 Windows-MSVC 上创建的 DEBUG 输出。 --2009-07-14 09:39:04-- http://local/site 主机“本地”没有发出一般的基本挑战。 解析本地...秒 0.00, x.x.x.x 缓存本地 => x.x.x.x 正在连接到本地|x.x.x.x|:80... 秒 0.00,已连接。 创建套接字 1896。 释放 0x003e32b0(新引用计数 1)。 ---请求开始--- 获取/站点/HTTP/1.0 用户代理:Wget/1.11.4 接受: */* 主办方:本地 连接:保持活动 ---请求结束--- 已发送 HTTP 请求,等待响应... ---响应开始--- HTTP/1.1 401 访问被拒绝 服务器:Microsoft-IIS/5.1 日期:格林威治标准时间 2009 年 7 月 14 日星期二 13:39:04 WWW-认证:协商 WWW-认证:NTLM 内容长度:4431 内容类型:文本/html ---响应结束--- 401 访问被拒绝 关闭 fd 1896 未知的身份验证方案。 授权失败。

【问题讨论】:

【参考方案1】:

我已经看到有关能够使用NTLM Authorization Proxy Server 来解决这些类型问题的参考资料。

【讨论】:

【参考方案2】:

NTLM 身份验证在 wget 1.11 中被破坏,请改用 1.10。

【讨论】:

在此处添加指向相关错误票证的链接会很有用 目前无法测试是否属实。但是我在 NTLM 案例中确认了标准输出中的不同行为。 mail-archive.com/bug-wget@gnu.org/msg00003.html 我也无法确认这对我也有效。 wget --version 报告GNU Wget 1.12 built on cygwin. +digest +ipv6 +nls +ntlm +opie +md5/openssl +https -gnutls +openssl +iri。但在我的情况下,服务器仅提供WWW-Authenticate: Negotiate(我认为是NTLMKerberos——有待协商)。 我的一个朋友今天遇到了这个问题并提醒了我。我在 8 年前的 SuSE 10.1、wget 1.10.2 上尝试过,效果很好。检索第一页后,Wget 1.11 失败并出现莫名其妙的 HTTP 401 错误。 Web服务器是Apache+SVN+mod_auth_sspi-1.0.4-2.2.2。 几个小时后,我的朋友巧妙地使用--auth-no-challenge 解决了这个问题(wget 提出使用Authorization: Basic 并且服务器接受它)。我确认 SuSE 10.1 上的 wget 1.10.2 也采用Authorization: Basic 措施。【参考方案3】:

Curl 实际上可能是从 NTLM 身份验证的 Web 服务器获取内容的更好工具。您可以使用以下命令获得与建议的 wget 命令行等效的功能:

curl --anyauth --user username:password http://someserver/site

【讨论】:

使用“--ntlm”而不是“--anyauth”对我有用。否则,我认为它选择了失败的“协商”身份验证(“--ntlm --negotiate”也失败了)。【参考方案4】:

使用--auth-no-challenge 选项(wget 1.11+)(现在被认为是不安全的)

【讨论】:

为什么现在被认为是不安全的?以何种方式不安全?【参考方案5】:

我找到了解决方案。 这是基本身份验证 IIS7 的解决方法。

当验证成功时,它会发送下一个 http 标头:

'Authorization: < type > < credentials >'.

所以我们可以在浏览器中进行授权 从浏览器(firebug 插件)复制此标头参数或生成:

$ echo -en 'username:password' | base64
dXNlcm5hbWU6cGFzc3dvcmQK
$ echo 'dXNlcm5hbWU6cGFzc3dvcmQK' | base64 -d
username:password

示例:

$ wget --header="Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQK" http://example.com/

【讨论】:

以上是关于通过 NTLM 对受保护站点使用 wget的主要内容,如果未能解决你的问题,请参考以下文章

使用 id_token 对受广告保护的应用进行身份验证

德尔福。 WinInet + 思科 + NTLM。 12045 和 12057 错误

如何在 C++ 中对受保护的方法进行单元测试?

我们使用访问修饰符来限制用户对受保护/私有变量的访问,但用户怎么可能尝试访问它们呢?

如何使用用户默认凭据以编程方式对受 Cloud Identity-Aware Proxy (Cloud IAP) 保护的资源进行身份验证?

AuthenticationType 协商与 NTLM