2

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

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

更新 1

我知道公共 http 客户端不支持 NTLM v2 的事实。此链接提供了各种 java http 客户端实现之间的比较,并提到 apache http 客户端提供了NTLM 协议的部分实现。它没有详细说明它。

在进一步解决问题时,我还发现此链接提供的 NTLM 实现结合HTTPClient可以在 Windows 机器上运行(我上面提到的 commons http 客户端实现不起作用)。

更新 2

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

4

2 回答 2

1

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

于 2011-08-22T13:46:15.720 回答
1

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

As a solution one could just add an implementation of the AuthScheme interface and extract out the code from higher versions of the commons http client library (for e.g. 4.1.2) which computes the NT Response in the Type 3 message. Do not forget to update the length and the offset values for the NT Response fields. Once the implementation of AuthScheme interface is ready it can be injected using the AuthPolicy.registeryScheme() method.

于 2011-08-31T06:57:05.017 回答