使用Java实现的Kerberos SSO

owa*_*ain 3 java windows-xp kerberos gssapi single-sign-on

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

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

任何链接和示例表示赞赏.

Jay*_*Tee 6

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

JBOSS Negotiation和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.

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 for script),如果有疑问,每次都要重新启动新的服务用户和主体名称!

希望这可以帮助别人避免我所拥有的痛苦.