1

我的目标:在基于 Java 的 Web 应用程序上实现 SSO。我的问题:我不是保安...

经过一番调查,我发现我需要 spring security kerberos 扩展(也查看了 apache shiro,但只能找到带有登录页面的示例)。

我在以下项目中使用了示例: https ://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-sample

我意识到我需要创建一个密钥表。当我尝试使用 keytab 时,出现以下错误:

javax.security.auth.login.LoginException: Unable to obtain password from user

寻找有关此错误的一些详细信息,我发现它可能是由错误的 keytab location引起的,但这里不是这种情况 - 我调试到源代码并看到 keytab 文件已加载。

所以我决定检查我的密钥表,看看它是否正常。首先,这是我用来创建密钥表的最后一个命令(经过长时间的演变):

ktpass /out http-web.keytab /mapuser MyUser@MYDOMAIN.COM /princ HTTP/MyUser@MYDOMAIN.COM /pass MyPass /ptype KRB5_NT_PRINCIPAL

当然,我使用以下命令为 MyUser 创建了一个 SPN:

setspn -a HTTP/MyUser@MYDOMAIN.COM MYDOMAIN.COM\MyUser

我用以下方法测试了 spn:

setspn -Q HTTP/MyUser@MYDOMAIN.COM

并得到了成功的结果:

Checking domain DC=mydomain,DC=com CN=MyUser,OU=MyOrg,DC=mydomain,DC=com
    HTTP/MyUser
    HTTP/MyUser@MYDOMAIN.COM

找到现有的 SPN!

现在我想通过运行以下命令来测试是否可以为 MyUser 获取票证:

kinit MyUser@MYDOMAIN.COM

我得到了一个成功的结果(“新票存储在缓存文件中......”)

现在我想用我的 keytab 测试它:

kinit MyUser@MYDOMAIN.COM -k -t http-web.keytab

得到以下异常:

Exception: krb_error 0 Do not have keys of types listed in default_tkt_enctypes available; only have keys of following type:  No error KrbException: Do not have keys of types listed in default_tkt_enctypes available; only have keys of following type:

我使用 klist 工具查看我的 keytab 是否包含任何键:

klist -e -K -k -t  http-web.keytab

得到以下结果:

KVNO: 8
Key type: 23
Key: 0x47bf8039a8506cd67c524a03ff84ba4e
Time stamp: Jan 01, 1970 02:00

作为最后一次绝望的尝试,我检查了 MyUser 的以下帐户选项:

  • 为此帐户使用 Kerberos DES 加密类型
  • 该帐户支持 Kerberos AES 128 位加密
  • 该帐户支持 Kerberos AES 256 位加密

我不确定设置这些选项是否会导致它,但现在当我运行时

kinit MyUser@MYDOMAIN.COM

我收到以下错误:

Exception: krb_error 14 KDC has no support for encryption type (14) KDC has no support for encryption type
KrbException: KDC has no support for encryption type (14)

所以我在这里有点绝望,我真的不知道我在做什么。这完全是反复试验的问题(主要是错误)。如果有人可以在这里指导我,将不胜感激。

谢谢,里奥

4

1 回答 1

0

原来是一个愚蠢的错误。我在 spring 中注入了用户帐户而不是主体名称作为 servicePrincipal。

于 2014-05-20T07:04:20.860 回答