如何在Java中针对服务器验证Kerberos票证?

时间:2010-02-09 17:14:55

标签: java active-directory single-sign-on kerberos jaas

我们正在使用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

2 个答案:

答案 0 :(得分:5)

正如您所提到的,解决此问题的正确方法是对服务进行kerberizing,这是Kerberos协议的全部要点(针对服务器对客户端进行身份验证)。故障单重用不起作用,因为它确实是一个安全问题。 Kerberos服务不需要“登录到Active Directory”,只需要与AD共享密钥。

顺便说一下,要使用JAAS获取SSO需要设置allowtgtsessionkey,在Windows上无法解决这个问题。

答案 1 :(得分: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也是如何进行服务登录的一个很好的例子。 不幸的是,这会导致注册表项出现同样的问题,所以我在Is there a way in Java or a command-line util to obtain a Kerberos ticket for a service using the native SSPI API?上发布了一个新问题。

相关问题