首页 文章

Java HTTP NTLM实现差异

提问于
浏览
2

这个link详细介绍了各种http客户端的java实现 . 我正在寻找任何可以提供有关其NTLM协议实现差异的信息的链接 .

在其中一台Windows机器上,我发现commons-http客户端3.1实现失败并出现授权错误(http状态代码401),但java 1.5实现成功 . 由于NTLM身份验证协议的java 1.5实现不是开源的,我无法比较这两个实现以了解可能出现的问题 .

Update 1

我知道commons http客户端不支持NTLM v2 . 这个link提供了各种java http客户端实现之间的比较,并提到apache http客户端提供了NTLM协议的 partial 实现 . 它没有详细介绍它 .

在进一步解决问题时,我还发现this linkHTTPClient组合提供的NTLM实现在Windows机器上工作(公共http客户端实现不能像我上面提到的那样工作) .

Update 2

通过嗅探数据包(使用wireshack),我意识到公共http客户端3.1 ntlm协议实现不会在Type 3消息中生成NTLM响应 . 这是由JDK实现生成的 . 您是否知道任何服务器/客户端设置,如果NTLM响应数据为空,则表明身份验证失败? (因为我们面临的身份验证失败只能在一台计算机上重现 . 身份验证在其他位置成功 . )

2 回答

  • 1

    Commons httpclient 3.1没有实现NTLMv2,它只实现了旧的NTLM(又名NTLMv1)规范 .

  • 1

    我们找到了这个问题的根本原因 . 导致身份验证错误的配置设置由名为NoLMHashPolicy的安全策略控制 . 启用此策略意味着Windows服务器将不再存储任何密码的LM哈希值,它将使用NT Response哈希进行身份验证 . 由于来自公共http客户端3.1库的NTLM协议实现根本不计算NT响应,因此在启用此设置时可能会遇到此错误 . 有关此设置的更多详细信息,请参见here .

    作为解决方案,可以添加AuthScheme接口的实现,并从更高版本的公共http客户端库(例如4.1.2)中提取代码,该客户端计算类型3消息中的NT响应 . 不要忘记更新NT响应字段的长度和偏移值 . 一旦AuthScheme接口的实现准备就绪,就可以使用AuthPolicy.registeryScheme()方法注入它 .

相关问题