我们正在使用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
要在Windows上使用Java进行客户端HTTP SPNEGO身份验证,您需要设置Windows注册表项allowtgtsessionkey.这是有据可查的.我不明白的是人们如何解决这个问题?为了单个软件,大多数企业站点永远不会接受在Windows中更改此注册表项.如果需要在组织中的每个工作站上更改它,请考虑一下麻烦.但这只是理论,因为我到目前为止还无法说服我们的任何客户更改此注册表项.
我不怪他们.大多数企业管理员会认为这样可以放松安全性并因此反对它.
我已经读过: 在Java或命令行工具中是否有办法使用本机SSPI API获取服务的Kerberos票证?
但它现在已经很老了.
所以我真的,真的不明白人们如何使Windows + Java客户端+ Kerberos可以在除大学环境,家庭用户等之外的任何地方工作.
我从公司管理员那里得到的问题是"当IE和Firefox等应用程序在没有设置此密钥的情况下执行SPNEGO时没有问题时,我们为什么需要设置此注册表项?".好吧,我知道答案是什么.这是因为(很可能)IE和Firefox等应用程序基于Windows本机GSS API(SSPI),而Sun的Java使用自己的实现.
我假设使用像WAFFLE这样的东西可以解决问题,但我赞成纯Java解决方案.我还假设使用基于Java的解决方案(如Spring安全性或Apache HttpClient)无济于事,因为它们都会遇到这个问题.
任何帮助或指针将不胜感激.
更新1:
我发现Oracle的bug数据库中有一个RFE.还有一个由Oracle员工就此问题提交的补丁以及有关此功能的JDK邮件列表的讨论.除了我能理解的这一点在目前的Java 7中是不可用的,甚至不是实验性的,都不会让我更加明智.对?
更新2:
现在问题在OpenJDK Security Dev邮件列表上再次存在.
来自http://java.sun.com/developer/technicalArticles/J2SE/security/#3:
注意:当应用程序在尚不支持此功能的操作系统上运行时,将忽略这两个系统属性,例如MS Windows.
那份文件是从2006年开始的,所以事情本来可以改变,但我还没有找到明确的答案.
我想知道最新版本的Sun Java 6 for Windows今天是否支持原生GSS(在没有修改注册表的情况下获取TGT).