2010-02-09 124 views
16

我们使用JAAS在使用Windows Kerberos票证缓存的Java应用程序中启用单一登录。我们的Jaas.conf配置文件看起来是这样的:如何根据Java中的服务器验证Kerberos票证?

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

随着似乎没有人真正知道一个答案,我想我们必须做出正确的Kerberos服务我们的服务器应用程序。一个登录到Active Directory本身并具有正确设置的ServicePrincipalName属性。有点像SPNEGO用于HTTP。如何做到这一点的一个很好的起点是SourceForge上的SPNEGO Servlet过滤器(http://spnego.sourceforge.net/)。 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?上发布了一个新问题。

+0

你有没有想过这个? – 2014-08-13 00:13:14

5

正如您所提到的,解决此问题的正确方法是通过Kerberos您的服务,这是Kerberos协议的全部要点(根据服务器对客户端进行身份验证)。票据重复使用并不完全正确,因为如果它确实存在安全问题。 Kerberos服务不需要“登录到Active Directory”,它只需要与AD共享密钥。

顺便说一下,要使用JAAS获取SSO需要拥有allowtgtsessionkey集,那么在Windows上就没有办法解决这个问题了。

+1

请注意,使用拉丁字符的Active Directory用户名在JAAS的Kerberos登录模块中不起作用。重要的限制,除非系统只有US-ASCII。 – akirekadu 2014-04-03 23:13:46