人们如何使Java SPNEGO客户端在Windows中工作?

2022-09-03 07:19:57

为了在Windows上使用Java进行客户端HTTP SPNEGO身份验证,您需要设置Windows注册表项 allowtgtsessionkey。这是有据可查的。我不明白的是人们如何解决这个问题?大多数公司网站永远不会为了单个软件而接受在 Windows 中更改此注册表项。还要考虑是否需要在组织中的每个工作站上进行更改,那么麻烦。但这只是理论,因为到目前为止,我无法说服任何客户更改此注册表项。

我不怪他们。大多数公司管理员会认为这是放松安全性,因此会反对它。

我已经读过这个:在Java或命令行实用程序中,有没有办法使用本机SSPI API获取服务的Kerberos票证?

但它现在已经很老了。

所以我真的,真的不明白人们如何让Windows + Java客户端+ Kerberos在大学环境,家庭用户等以外的任何东西上工作。

我从企业管理员那里得到的问题是“当IE和Firefox等应用程序在不设置此注册表项的情况下执行SPNEGO没有问题,为什么我们需要设置此注册表项?好吧,我知道答案是什么。这是因为(最有可能)像IE和Firefox这样的应用程序基于Windows原生GSS API(SSPI),而Sun的Java使用自己的实现。

我假设使用像WAFFLE这样的东西可以解决这个问题,但我更倾向于纯Java解决方案。我还假设使用基于Java的解决方案(如Spring安全或Apache HttpClient)无济于事,因为它们都将遭受此问题的困扰。

任何帮助或指导将不胜感激。

更新1

我发现在Oracle的错误数据库中有一个RFE。还有一位Oracle员工就此事提交的补丁,并在JDK邮件列表中讨论了此功能。除了据我所知,这在当前的Java 7中不可用之外,并没有让我变得更聪明,甚至没有实验性的。右?

更新2

这个问题现在在OpenJDK Security Dev邮件列表中再次活跃起来。


答案 1

感谢您在安全开发邮件列表中引用我的线程;-)我的中期目标是通过认可的类路径将此修补程序提供给 Java 6+。您可能对我最近创建的这张华夫饼票感兴趣:https://github.com/dblock/waffle/issues/50

我也评估过WAFFLE,但它是如此不像Java-GSS,以至于必须创建重复的代码,这是我想一定要避免的事情。

这整个问题并不完全是甲骨文的错。微软只是通过LSA功能阻止对会话票证的任何调用。借口是安全。我真的很想知道,当我无法合理访问TGT时,SSPI如何能够创建服务票证。因此,这种闭源解决方案很糟糕。CallPackage

目前,您只有三个选择:

  1. 通过 Java 方式再次获取 TGT
  2. 尝试华夫饼
  3. 编写自定义代码

我已经埋葬了蹩脚的注册表项,因为它无论如何都不适用于具有域帐户的本地管理员。就我而言,Windows上的Tomcat开发人员在此期间诉诸于Java的kinit。


答案 2

现在,Apache HTTP客户端中包含了一个非常好的解决方案,它使用JNA从本机SSPI API获取票证。看到这个答案:

https://stackoverflow.com/a/22865583/381161


推荐