Java实现的Kerberos单点登录

3

我正在尝试创建一个JAVA程序,它将获取我的Windows用户凭据,然后连接到我的Unix盒子上的Kerberos进行身份验证,并允许我使用服务,例如LDAP服务器。

我发现的所有示例都需要在运行时要求输入密码,但我不想这样做 - 我希望能够运行程序,然后“像魔术一样”进行Kerberos身份验证。

欢迎提供任何链接和示例。


+1 如果这个能在Linux上运行,我会更开心! - Daniel
1个回答

7
经过多周的试验和网络爬虫,我们成功地使用Kerberos在Java EE应用程序中设置了SSO,并针对Windows Active Directory进行了验证。JBOSS Negotiation和Spring Kerberos都适用于我们。但是,两者的文档都不够准确,无法让您轻松上手。对于任何一种解决方案,简单来说,步骤如下:
1.在Active Directory中创建服务用户。 2.使用ktpass为此用户创建keytab文件(请注意下面列出的许多陷阱)。 3.使用setspn -A修复ktpass。 4.确保您的krb5.conf(Linux)或krb5.ini(Windows)正确。 5.确保您没有在同一台计算机上运行客户端和服务器。 6.确保您的域中的时间同步。 7.使用JDK中的kinit测试Kerberos。 8.通过提供的过滤器将身份验证委托给您的Web应用程序。 9.配置XML文件以使用最初创建的适当的服务主体用户。 10.使用主体用户运行服务!!!!! 11.如果使用Spring,则可以实现UserDetailsService以查询LDAP(Active Directory)并在用户主体上设置角色。 12.在应用程序内部,用户主体应 !=null。
ktpass问题:
1.确保在Active Directory中将服务用户设置为无法更改密码的用户。 2.确保在命令行中提供密码。 3.确保在生成keytab后仍然可以使用该用户打开命令提示符。 4.确保指定了KRB5_NT_PRINCIPAL。 5.格式应为 ktpass /out c:\service.keytab /mapuser userservice@TESTDOMAIN.SERVER.COM /princ HTTP/hostname@TESTDOMAIN.SERVER.COM /pass /ptype KRB5_NT_PRINCIPAL 6.使用以下方式添加完全限定的服务主体:setspn -A HTTP/hostname.testdomain.server.com userservice 7.不要重置服务主体用户的密码(您将不得不重新生成keytab)。
最后,在每次测试之前,请使用kinit purge清除缓存的票据。此外,重复的SPN会严重破坏事情!在Windows Server 2008中,setspn -X将检测到此问题(或者在Google中搜索脚本)。如果对此有疑问,请每次使用新的服务用户和主体名称重新开始!希望这可以帮助有人避免我所遇到的痛苦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接