我想用 Java 中的 Kerberos 实现单点登录,并成功地使用来自 Windows 登录的票证为服务创建票证。不幸的是,我只能在启用注册表项“allowtgtsessionkey”时创建该票证。一旦我禁用它,我就会收到一条异常消息“标识符与预期值不匹配 (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 虽然可以完全访问票证缓存,因此可以创建服务票证。Web 浏览器使用此 API,但 Java 不使用此 API(根据http://java.sun.com/developer/technicalArticles/J2SE/security/#3)。当我在访问过一次网页后在 Firefox 中禁用 SSPI(因此已创建服务票证)时,我仍然可以访问该页面,因此也许命令行工具足以使用 SPPI API 创建服务票证。
对我们来说,这意味着现在我们可以放弃单点登录(这对我们来说是不可接受的),或者我们在应用程序的客户端进行身份验证(因为我们只能读出用户名而不能在服务器),这是一个主要的安全风险。另一个例子是更强大的安全约束如何导致更大的安全漏洞,因为它们变得太复杂而无法使用。