use*_*667 16 java kerberos active-directory jaas single-sign-on
我们正在使用JAAS在使用Windows Kerberos票证缓存的Java应用程序中启用单点登录.我们的jaas.conf配置文件如下所示:
LoginJaas {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
doNotPrompt=true
debug=true;
};
Run Code Online (Sandbox Code Playgroud)
有了这个,我们可以创建一个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
正如您所提到的,解决此问题的正确方法是对服务进行kerberizing,这是Kerberos协议的全部要点(针对服务器对客户端进行身份验证).故障单重用不起作用,因为它确实是一个安全问题.Kerberos服务不需要"登录到Active Directory",它只需要与AD共享密钥.
顺便说一下,要使用JAAS获取SSO需要设置allowtgtsessionkey,那么在Windows上无法解决这个问题.
由于似乎没有人真正知道这个问题的答案,我想我们必须从我们的服务器应用程序中创建一个适当的 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 票证?。