使用Java实现的Kerberos SSO

时间:2011-02-08 17:01:10

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

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

我发现的所有示例都会在运行时向我询问我的密码,我不希望这样 - 我希望能够运行程序并且'如果通过魔法'我可以通过kerberos认证。

赞赏任何链接和示例。

1 个答案:

答案 0 :(得分:6)

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

JBOSS谈判和Spring Kerberos都为我们工作。但是,这两套文档都不够准确,无法让您立即投入使用。简单地解决这个问题......

  1. 在Active Directory中创建服务用户。
  2. 使用ktpass为该用户创建密钥表文件。 (很多人都使用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。
  13. 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. 请勿重置服务主要用户密码(您必须重新生成密钥表)。
    8. 最后,在每次测试之前,使用kinit purge清除缓存的票证。

      另外,复制SPN会破坏事情! windows server 2008中的setspn -X会检测到这个(或google for script),如果有疑问的话,每次都重新启动新的服务用户和主体名称!

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