用Java实现Kerberos SSO

用Java实现Kerberos SSO,java,windows-xp,single-sign-on,kerberos,gssapi,Java,Windows Xp,Single Sign On,Kerberos,Gssapi,我正在尝试创建一个JAVA程序,该程序将获取我的windows用户凭据,然后连接到unix设备上的kerberos并进行身份验证,并允许我使用服务,例如LDAP服务器 我发现的所有示例都倾向于在运行时询问我的密码,我不希望这样-我希望能够运行该程序,并且“如果通过魔法”im kerberos身份验证 感谢您提供任何链接和示例。经过数周的试用和web爬网,我们已经成功地在Java EE应用程序中使用Kerberos设置SSO,并通过Windows Active Directory进行身份验证 JB

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

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


感谢您提供任何链接和示例。

经过数周的试用和web爬网,我们已经成功地在Java EE应用程序中使用Kerberos设置SSO,并通过Windows Active Directory进行身份验证

JBOSS协商和SpringKerberos都为我们工作。但是,这两套文档都不够准确,无法让您开始运行。把这两种解决方案简单

  • 在Active Directory中创建服务用户
  • 使用ktpass为此用户创建密钥表文件。(ktpass的许多gotchas如下所列)
  • 使用setspn-A修复ktpass
  • 确保您的krb5.conf(linux)或krb5.ini(windows)是正确的
  • 确保您没有在与服务器相同的机器上运行客户端
  • 确保您的时间在整个域内同步
  • 在JDK中使用kinit测试Kerberos
  • 将web应用程序配置为通过提供的筛选器委派身份验证
  • 配置XML文件以使用最初创建的相应服务主体用户
  • 以主要用户身份运行您的服务
  • 如果使用Spring,则可以实现UserDetailsService来查询LDAP(active directory)并在用户主体上设置角色
  • 在您的应用程序中,用户主体应该=空
  • ktpass问题:

  • 确保您的服务用户设置为用户无法更改Active Directory中的密码
  • 确保在命令行中提供密码
  • 确保生成keytab后,您仍然可以作为该用户打开命令提示符
  • 确保指定KRB5\u NT\u主体
  • 格式应为
    ktpass/out c:\service.keytab/mapuseruserservice@TESTDOMAIN.SERVER.COM/princ HTTP/hostname@TESTDOMAIN.SERVER.COM/pass/p键入KRB5\u NT\u PRINCIPAL
  • 使用setspn-A添加完全合格的服务主体,如下所示:
    setspn–HTTP/hostname.testdomain.server.com用户服务
  • 不要重置服务主体用户密码(您必须重新生成密钥表)
  • 最后,在每次测试之前,使用kinit purge清除缓存的票据

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


    希望这能帮助别人避免我所经历的痛苦。

    +1如果这对Linux有效,我会更开心!