使用wget访问受NTLM保护的站点

21

尝试镜像一个本地内部网站,发现之前的问题使用 '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 主机'local'没有发出通用的基本挑战。 解析本地...秒0.00,x.x.x.x 缓存本地=> x.x.x.x 连接到local | x.x.x.x |:80...秒0.00,已连接。 创建套接字1896。 释放0x003e32b0(新引用计数1)。
---请求开始--- GET /site/ HTTP/1.0 用户代理:Wget / 1.11.4 接受:*/* 主持人:当地 连接:保持活动
---请求结束--- 发送HTTP请求,等待响应... ---响应开始--- HTTP / 1.1 401访问被拒绝 服务器:Microsoft-IIS / 5.1 日期:星期二,2009年07月14日13:39:04 GMT WWW-Authenticate:Negotiate WWW-Authenticate:NTLM 内容长度:4431 内容类型:text / html
---响应结束--- 401访问被拒绝 关闭fd 1896 未知的身份验证方案。 授权失败。
5个回答

10

Curl实际上可能是从NTLM认证的Web服务器获取内容的更好工具。您可以使用以下方式获得与您提出的wget命令行等效的功能:

curl --ntlm --user username:password http://www.example.com/

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

1
使用“--ntlm”而不是“--anyauth”对我有用。否则,我认为它选择了失败的“协商”身份验证(“--ntlm --negotiate”也失败了)。 - Curtis Yallop
使用 curl --anyauth --user 'username:password' http://someserver/site 命令时,将 username:password 用单引号括起来可以正常工作。 - Seany84

10

NTLM认证在wget 1.11中已经失效,请使用1.10版本。


4
在这里添加相关缺陷票据的链接会很有用。 - Daenyth
目前还无法测试是否正确。但我确认在NTLM情况下,stdout的行为不同。 http://www.mail-archive.com/bug-wget@gnu.org/msg00003.html - João
我也无法确认这对我是否有效。wget --version 报告 GNU Wget 1.12 built on cygwin. +digest +ipv6 +nls +ntlm +opie +md5/openssl +https -gnutls +openssl +iri。但在我的情况下,服务器仅提供 WWW-Authenticate: Negotiate(我相信是 NTLMKerberos - 需要协商)。 - dma_k
今天我的一个朋友遇到了这个问题并通知了我。我在一个八年前的 SuSE 10.1 上尝试了一下,使用 wget 1.10.2,效果很好。但是使用 wget 1.11 却在获取第一页后出现了 HTTP 401 错误,原因不明。Web 服务器是 Apache+SVN+mod_auth_sspi-1.0.4-2.2.2。 - Jimm Chen
几个小时后,我的朋友聪明地使用了“--auth-no-challenge”来解决这个问题(wget提供使用“Authorization: Basic”,服务器接受它)。我确认SuSE 10.1上的wget 1.10.2也采取了“Authorization: Basic”的措施。 - Jimm Chen
经过进一步的调查,我必须在这里更正自己。我之前的两个评论没有澄清wget是否正确处理NTLM。实际上,wget的NTLM行为似乎是含混不清的,直到我完全理解NTLM协议之前,我无法解释这种行为。 - Jimm Chen

2

1

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


为什么现在被认为是不安全的?以何种方式不安全? - GordonAitchJay

0

我找到了解决方案。
这是绕过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/

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