17

我们正在使用 JAAS 在使用 Windows Kerberos 票证缓存的 Java 应用程序中启用单点登录。我们的 jaas.conf 配置文件如下所示:

LoginJaas {
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=true
  doNotPrompt=true
  debug=true;
};

这样,我们就可以创建一个 Jaas LoginContext 并成功获取用户的 Kerberos 票证。我们使用 JMI 将此票证发送到服务器应用程序。但是,我们无法在服务器上验证 Kerberos 票证实际上是由我们的 Active Directory 创建的。

目前,我们通过简单地检查服务器主体 (KerberosTicket.getServer()) 名称是否在领域部分中有我们的域名来对票证进行非常不安全的验证。但当然,任何人都可以使用相同的域名设置自己的 Kerberos 服务器,并使用该票证来启动应用程序。

我发现的一个想法是使用 Kerberos 票证针对 Active Directory LDAP 进行身份验证。不幸的是,我们使用 Windows 7 并重新使用 Kerberos 票证对 LDAP 进行身份验证仅在设置注册表条目时有效(请参阅http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss /tutorials/Troubleshooting.html,搜索 allowtgtsessionkey)。这对我们的用户来说是不可接受的。

有什么方法可以根据我们的 Active Directory 服务器验证票证吗?我怀疑有一种方法可以检查 KerberosTicket.getServer() 票证是否等于我们服务器的票证,但我不知道该怎么做。更新: KerberosTicket().getServer() 只返回一个 KerberosPrincipal,它只包含服务器票证名称和领域,因此它不适合验证。

谢谢你的帮助,memminger

4

2 回答 2

5

正如您所提到的,解决此问题的正确方法是对您的服务进行 kerberize,这是 Kerberos 协议的全部要点(针对服务器验证客户端)。票证重用并不完全有效,因为如果这样做将是一个安全问题。Kerberos 服务不需要“登录到 Active Directory”,它只需要与 AD 共享密钥。

顺便说一句,要使用 JAAS 获得 SSO,需要设置 allowtgtsessionkey,在 Windows 上无法解决。

于 2010-08-25T23:28:36.917 回答
2

由于似乎没有人真正知道这个问题的答案,我想我们必须从我们的服务器应用程序中创建一个适当的 Kerberos 服务。登录到 Active Directory 本身并且正确设置了 ServicePrincipalName 属性的一种。有点像 SPNEGO 对 HTTP 所做的。如何做到这一点的一个很好的起点是 SourceForge ( http://spnego.sourceforge.net/ ) 上的 SPNEGO Servlet 过滤器。http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html也是一个很好的服务登录示例。不幸的是,这导致了与注册表项相同的问题,因此我发布了一个新问题,关于Java 或命令行实用程序中是否有办法使用本机 SSPI API 获取服务的 Kerberos 票证?.

于 2010-02-18T15:21:52.353 回答