人们如何让Java SPNEGO客户端在Windows中运行?

要在Windows上使用Java进行客户端HTTP SPNEGO身份validation,您需要设置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的bug数据库中有一个RFE 。 还有一个Oracle员工就此问题提交的补丁以及有关此function的JDK邮件列表的讨论 。 除了我能理解的这一点,在目前的Java 7中没有这个function,甚至不是实验性的。 对?

更新2

现在问题在OpenJDK Security Dev邮件列表上再次存在 。

感谢您在security-dev邮件列表中引用我的线程;-)我的中期目标是通过认可的类路径使这个补丁可用于Java 6+。 您可能对我最近创建的这张WAFFLE票证感兴趣: https : //github.com/dblock/waffle/issues/50

我也评估了WAFFLE,但它不像Java-GSS那样必须创建重复代码,这是我想要避免的一切。

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

目前,您只有三个选择:

  1. 通过Java手段再次获取TGT
  2. 试试WAFFLE
  3. 编写自定义代码

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

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

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