我想在Java中使用Kerberos实现单点登录,并且已经成功地使用Windows登录中的票证为服务创建了票证。不幸的是,我只能在启用注册表项"allowtgtsessionkey“时创建该票证。一旦我禁用它,我就会收到一个异常,消息是"Identifier it match value (906)“(标识符不匹配预期值(906))。http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html和http://support.microsoft.com/kb/308339上记录了该注册表项。
不幸的是,我无法访问将使用我的应用程序的计算机上的注册表,因此我正在寻找一种不需要修改就能做到这一点的方法。当我在Internet Explorer或Mozilla Firefox中通过SPNEGO进行单点登录时,他们会在我的票证缓存中创建一个服务票证,因此肯定有一种方法可以在不设置注册表项的情况下执行此操作。有没有人知道如何在Java中做到这一点?
谢谢你的帮助,memminger
更新:我要放弃这个问题了。Windows注册表项阻止访问票证缓存中的票证(更准确地说:主题)。Windows上的Java使用它自己的GSSAPI实现,我认为它需要访问票证来创建服务票证。但是,SSPI Windows API可以完全访问票证缓存,因此可以创建服务票证。此API由web浏览器使用,但未被Java使用(根据http://java.sun.com/developer/technicalArticles/J2SE/security/#3)。当我在访问网页一次后在Firefox中禁用SSPI时(因此已经创建了一个服务票证),我仍然可以访问该页面,因此也许一个命令行util就足以使用SPPI API创建一个服务票证。
对我们来说,这意味着我们要么放弃单点登录(这对我们来说是不可接受的),要么在应用程序的客户端进行身份验证(因为我们只能读取用户名,而不能在服务器上验证票证),这是一个主要的安全风险。另一个例子说明了更强的安全约束如何导致更大的安全漏洞,因为它们变得太复杂,无法使用。
发布于 2010-07-08 14:40:04
您是否尝试过在Java6中设置sun.security.jgss.native?SSPI不是windows的“本机”接口吗?
发布于 2015-10-05 17:16:18
您可以通过JNA访问原生SSPI API。有关示例,请参阅WAFFLE中的WindowsAuthProviderImpl或Apache HC库中的WindowsNegotiateScheme。
发布于 2021-11-07 09:14:48
JDK 13引入了对Windows SSPI的本机支持,后来也向后移植到JDK 11。您至少需要使用Java 11.0.10。当使用JDK对SSPI的支持时,就不再需要摆弄allowtgtsessionkey
注册表项,也不需要使用JNA或Waffle。
您需要设置
-Dsun.security.jgss.native=true
才能让它工作。
如果您的JDK版本在bin
目录中包含一个名为sspi_bridge.dll
的文件,您就可以识别它是否支持SSPI。
参考文献:
https://stackoverflow.com/questions/2335896
复制相似问题