3

i am trying to created a JAVA program that will get my windows users credentials, then connect to the kerberos on my unix box and authenticate and allow me to use a service, for an example an LDAP server.

All examples i have found tend to on run ask me for my password, i do not want this - I wish to be able to run the program and 'if by magic' im kerberos authenticated.

Any links and example are appreciated.

4

1 回答 1

7

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

JBOSS Negotiation 和 Spring 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 userservice@TESTDOMAIN.SERVER.COM /princ HTTP/hostname@TESTDOMAIN.SERVER.COM /pass /ptype KRB5_NT_PRINCIPAL
  6. 使用 setspn -A 添加完全限定的服务主体,如下所示: setspn –A HTTP/hostname.testdomain.server.com userservice
  7. 不要重置服务主要用户密码(您必须重新生成您的密钥表)。

最后,在每次测试之前,使用 kinit purge 清除缓存的票证。

此外,重复的 SPN 会严重破坏事情!windows server 2008 中的 setspn -X 将检测到这一点(或 google 脚本),如果在执行此操作时有疑问,每次都使用新的服务用户和主体名称重新开始!

希望这可以帮助某人避免我所遭受的痛苦。

于 2012-05-18T13:35:41.310 回答