java - 使用 Java 实现的 Kerberos SSO

标签 java windows-xp single-sign-on kerberos gssapi

<分区>

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

我发现的所有示例都倾向于在运行时询问我的密码,我不想要这个 - 我希望能够运行该程序并且“如果通过魔法”im kerberos 已通过身份验证。

感谢任何链接和示例。

最佳答案

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

JBOSS Negotiation 和 Spring Kerberos 都对我们有用。但是,这两套文档都不够准确,无法让您开始运行。对任何一种解决方案都简单...

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

ktpass 问题:

  1. 确保您的服务用户设置为用户无法在 Active Directory 中更改密码。
  2. 确保在命令行中提供密码。
  3. 确保您在生成 key 表后仍然可以作为该用户打开命令提示符。
  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 用户服务
  7. 不要重置服务主要用户密码(您将不得不重新生成您的 key 表)。

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

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

希望这可以帮助人们避免我所经历的痛苦。

关于java - 使用 Java 实现的 Kerberos SSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4935954/

相关文章:

java - 让 ViewFlipper 使用字符串数组

java - createLoginURL 在 GAE 中创建无效的请求 URL

windows - 在 cmd.exe 中执行批处理文件什么都不做

.net - MS 会在 .Net 4.* 或 5.* 中放弃对 XP 的支持吗?

.net - 部署后显示我的 Windows 应用程序的背景图像时出错

java - Gradle:无法应用 'compile'

java - 在 Postgresql 中用于转换 uuid::text 的算法是什么?

ruby-on-rails - Amazon 用户可访问 AWS 管理控制台的时间不变

java - 如何修改CAS 5.x以使用rest api检查用户的登录名和密码

jakarta-ee - 使用 SAML 和 ADFS 创建用于单点登录的 Java EE 应用程序