【发布时间】:2012-09-01 16:57:36
【问题描述】:
我目前正在尝试使用来自 SourceForge 的 SPNEGO library 将 Java 客户端实现到受 SPNEGO 保护的 Web 服务(服务器使用相同的库)。我无法成功验证,我的请求总是以
HTTP/1.1 500 Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
这与我从具有不适当主机名的浏览器访问 Web 服务时遇到的症状相似,并且确实在 Wireshark 中进行了一些调试显示客户端发送了错误的 SPN 请求 - 我发送到 service-test.client.com,它注册为 SPN 并在 DNS 中有 A 记录,但在 Windows 域中注册为 server-1234.client.corp。即使我将请求发送到 http://service-test.client.com(请参阅匹配的 Host 标头),Java 请求票证的 SPN 是“内部”Windows 名称:
从 Chrome 或 IE 发送的相同内容具有匹配的 Host 标头和 SPN:
由于在我的代码或 SPNEGO 库中没有发生这种转换,我认为它一定是在 JRE 中发生的。我一直在研究 JGSS 源代码,但有点难以理解。谁能告诉我如何跳过这个翻译并获得正确 SPN 的票?
客户端代码:
SpnegoHttpURLConnection con = new SpnegoHttpURLConnection("spnego-client", user, password);
con.connect(new URL("http://service-test.client.com:8083/service"));
int rc = con.getResponseCode();
String msg = con.getResponseMessage();
【问题讨论】:
-
重新检查您的 DNS。进行反向查找。大多数问题是由不正确的反向 DNS 条目引起的。你的领域的名称是什么? RFC 中的第 85 页可能会对您有所帮助。 Windows 使用 SSPI,它实际上与 GSS-API 做同样的事情,但方式不同。另一个提示:您需要提供有关服务于
CLIENT.COM领域的 KDC 的信息,否则 Java 将无法获得票证。我们有一个类似的星座在工作。这被认为是失败的,因为 Kerberos 不知道领域CLIENT.COM。 -
您也可以使用 Wireshark 嗅探 KDC 流量。过滤
kerberos。 -
@Michael-O:谢谢,伟大的 cmets。如果我正确地阅读了该 RFC,它不应该做任何反向查找恶作剧,但是......我将在星期一验证 DNS/Kerberos 流量发生了什么......
-
实际上不是,它说“当解析对这种类型的名称的引用时,可以通过尝试 DNS 查找并使用完全-返回的限定域名,或者如果 DNS 查找失败,则使用提供的“主机名”。所以这取决于。完成反向查找是非常自然的。这就是 Kerberos 验证主机名的方式。如果您正在运行 DNS 循环,这实际上是至关重要的。没有它,它将永远无法构建真正的 SPN。周一告诉我你的结果。我很兴奋。
-
谢谢 - 这一切都非常合理,但我不明白为什么 IE 的行为与 Java 不同。我一直认为循环设置必须使用共享的 SPN 运行。如果它按照您描述的方式工作,那么我就有麻烦了,因为我们使用多个 SPN 绑定到同一机器/IP 地址上的不同服务 - 如果您愿意,可以使用“Kerberos 虚拟主机”。到目前为止,仅使用浏览器客户端,它就可以工作,但我可能真的很幸运。
标签: java windows kerberos spnego spn