首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中针对服务器验证Kerberos票证?

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

Stack Overflow用户
提问于 2010-02-10 01:14:55
回答 2查看 11.3K关注 0票数 17

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

代码语言:javascript
复制
LoginJaas {
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=true
  doNotPrompt=true
  debug=true;
};

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

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

我发现的一个想法是使用Kerberos票证针对Active Directory LDAP进行身份验证。不幸的是,我们使用Windows7并重用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

EN

回答 2

Stack Overflow用户

发布于 2010-08-26 07:28:37

正如您所提到的,解决此问题的正确方法是使用Kerberos,这是Kerberos协议的要点(根据服务器对客户机进行身份验证)。票证重用并不能很好地工作,因为如果能做到这一点,那将是一个安全问题。Kerberos服务不需要“登录到Active Directory",它只需要一个与AD共享的密钥。

顺便说一句,使用JAAS获得SSO需要设置allowtgtsessionkey,这在Windows上是没有办法的。

票数 5
EN

Stack Overflow用户

发布于 2010-02-18 23:21:52

由于似乎没有人真正知道这个问题的答案,我想我们必须从我们的服务器应用程序中创建一个合适的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?上发布了一个新问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2230981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档