如何根据Java中的服务器验证Kerberos票证?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (67)

我们正在使用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,其中只包含服务器故障单名称和领域,所以它不适合进行验证。

提问于
用户回答回答于

由于似乎没有人真正知道这个答案,我想我们必须从我们的服务器应用程序中创建一个适当的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也是如何做服务登录的一个很好的例子。不幸的是,这导致与注册表项相同的问题,所以我发布了一个新问题在Java或命令行实用工具中是否有方法使用本机SSPI API获取服务的Kerberos票证?。

用户回答回答于

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

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

扫码关注云+社区