首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java或命令行util中,有没有一种方法可以使用原生SSPI API获得服务的Kerberos票证?

在Java或命令行util中,有没有一种方法可以使用原生SSPI API获得服务的Kerberos票证?
EN

Stack Overflow用户
提问于 2010-02-26 00:58:15
回答 3查看 5.9K关注 0票数 19

我想在Java中使用Kerberos实现单点登录,并且已经成功地使用Windows登录中的票证为服务创建了票证。不幸的是,我只能在启用注册表项"allowtgtsessionkey“时创建该票证。一旦我禁用它,我就会收到一个异常,消息是"Identifier it match value (906)“(标识符不匹配预期值(906))。http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.htmlhttp://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创建一个服务票证。

对我们来说,这意味着我们要么放弃单点登录(这对我们来说是不可接受的),要么在应用程序的客户端进行身份验证(因为我们只能读取用户名,而不能在服务器上验证票证),这是一个主要的安全风险。另一个例子说明了更强的安全约束如何导致更大的安全漏洞,因为它们变得太复杂,无法使用。

EN

回答 3

Stack Overflow用户

发布于 2010-07-08 14:40:04

您是否尝试过在Java6中设置sun.security.jgss.native?SSPI不是windows的“本机”接口吗?

票数 2
EN

Stack Overflow用户

发布于 2015-10-05 17:16:18

您可以通过JNA访问原生SSPI API。有关示例,请参阅WAFFLE中的WindowsAuthProviderImpl或Apache HC库中的WindowsNegotiateScheme

票数 1
EN

Stack Overflow用户

发布于 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。

参考文献:

JDK-6722928

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2335896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档