2011-02-08 45 views
3

我想创建一个JAVA程序,它将获得我的Windows用户凭据,然后连接到我的Unix机器上的Kerberos并进行身份验证,并允许我使用服务,例如LDAP服务器。使用Java实现的Kerberos SSO

我发现的所有例子都倾向于运行问我的密码,我不想要这个 - 我希望能够运行程序和'如果通过魔术'im kerberos验证。

任何链接和例子表示赞赏。

+0

+1如果这对Linux有效,我会更加快乐! – Daniel 2011-02-08 17:12:27

回答

5

我们已经使用Kerberos与Java EE应用程序成功设置了SSO,并在经过数周的测试和网络爬行后,针对Windows Active Directory进行了身份验证。

JBOSS谈判和春季Kerberos都为我们工作。但是,这两组文档都不够准确,无法让您脱颖而出。把简单的解决方案...

  1. 在Active Directory中创建服务用户。
  2. 使用ktpass为该用户创建一个keytab文件。 (以下列出的许多ktpass陷阱)
  3. 使用setspn -A修复ktpass。
  4. 确保您的krb5.conf(linux)或krb5.ini(windows)是正确的。
  5. 确保您没有在与服务器相同的盒子上运行客户端。
  6. 确保您的时间在您的域中保持同步。
  7. 在JDK中使用kinit测试Kerberos。
  8. 将您的Web应用程序配置为通过提供的过滤器委托身份验证。
  9. 配置XML文件以使用最初创建的相应服务主体用户。
  10. 以主要用户身份运行您的服务!!!!!!!!!
  11. 如果使用Spring,则可以实现UserDetailsS​​ervice来查询LDAP(活动目录)并在用户主体上设置角色。
  12. 在您的应用程序中,用户主体应该!= null。

的ktpass问题:

  1. 确保您的服务用户设置为用户在Active Directory中不能更改密码。
  2. 确保您在命令行中提供密码。
  3. 确保您仍然可以在生成密钥表之后以该用户的身份打开命令提示符。
  4. 确保您指定KRB5_NT_PRINCIPAL。
  5. 格式应该是ktpass /out c:\service.keytab /mapuser [email protected] /princ HTTP/[email protected] /pass /ptype KRB5_NT_PRINCIPAL
  6. 添加使用SETSPN -A完全合格的服务主要如下: setspn –A HTTP/hostname.testdomain.server.com userservice
  7. 不要重置服务主要用户密码(你将不得不重新生成密钥表)。

最后,每一个测试前,使用kinit命令清除清除缓存门票。

此外,重复的SPN会严重破坏! windows server 2008中的setspn -X会检测到这个(或者google为脚本),如果有疑问的时候这样做,每次都以新的服务用户和主要名称重新开始!

希望这可以帮助别人避免我曾经的痛苦。