使用带有spring security kerberos扩展的keytab文件

时间:2014-05-19 06:47:04

标签: single-sign-on spring-security-kerberos

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

经过一番调查,我发现春天安全kerberos扩展是我需要的(也查看了apache shiro,但只能找到一个登录页面的例子)。

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

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

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

查找有关此错误的一些详细信息,我看到它可能来自wrong keytab location,但这不是这里的情况 - 我调试到源代码并看到keytab文件已加载。

所以我决定检查我的密钥表,看看它是否正常。 首先,这是我用来创建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)

所以我在这里绝望,我不知道自己在做什么。这都是试错的问题(主要是错误)。 如果有人能指导我通过这里,我将不胜感激。

谢谢, 利奥尔

1 个答案:

答案 0 :(得分:0)

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