为了在 Windows 上使用 Java 进行客户端 HTTP SPNEGO 身份验证,您需要设置 Windows 注册表项 allowtgtsessionkey .这是有据可查的。我不明白的是人们如何解决这个问题?大多数公司站点永远不会接受为了单个软件而更改 Windows 中的此注册表项。如果需要在组织中的每个工作站上进行更改,还要考虑麻烦。但这只是理论,因为到目前为止我无法说服我们的任何客户更改此注册表项。
我不怪他们。大多数公司管理员会认为这是一种放松的安全措施,因此会反对它。
但是现在已经很老了。
所以我真的非常不明白人们如何让 Windows + Java 客户端 + Kerberos 在大学环境、家庭用户等以外的任何环境下工作。
我从公司管理员那里得到的问题是“当 IE 和 Firefox 等应用程序执行 SPNEGO 没有问题时,为什么我们需要设置此注册表项而无需设置此注册表项?”。好吧,我知道答案是什么。这是因为(很可能)IE 和 Firefox 等应用程序基于 Windows 原生 GSS API (SSPI),而 Sun 的 Java 使用自己的实现。
我假设使用类似 WAFFLE 的东西会解决问题,但我更喜欢纯 Java 解决方案。我还假设它不会帮助使用基于 Java 的解决方案,例如 Spring 安全或 Apache HttpClient,因为它们都会遇到这个问题。
如有任何帮助或指点,我们将不胜感激。
更新 1:
我发现有一个 RFE为此,在 Oracle 的错误数据库中。还有一个 patch submitted on the matter由甲骨文员工和discussions on the JDK mailing list about this feature .据我所知,这并没有让我变得更聪明,这在当前的 Java 7 中是不可用的,甚至不是实验性的。对吧?
更新 2:
现在的问题是alive again在 OpenJDK 安全开发邮件列表上。
最佳答案
感谢您在 security-dev 邮件列表中引用我的帖子 ;-) 我的中期目标是通过认可的类路径使此补丁可用于 Java 6+。您可能对我最近创建的这张 WAFFLE 票感兴趣:https://github.com/dblock/waffle/issues/50
我也评估过 WAFFLE,但它不像 Java-GSS,以至于必须创建重复代码,这是我想尽一切办法避免的事情。
这整个问题不完全是 Oracle 的错。 Microsoft 只是通过 LSA CallPackage
函数阻止对 session 票证的任何调用。借口是安全。我真的很想知道当我无法合理访问 TGT 时,SSPI 是如何创建服务票证的。因此,这种闭源解决方案很糟糕。
目前,您只有三个选择:
- 通过Java方式再次获取TGT
- 试试华夫饼
- 编写自定义代码
我已经埋下了糟糕的注册表项,因为无论如何它都不适用于具有域帐户的本地管理员。就我而言,Windows 上的 Tomcat 开发人员同时求助于调用 Java 的 kinit。
关于java - 人们如何使 Java SPNEGO 客户端在 Windows 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14556119/