我的目标:在基于 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)
所以我在这里有点绝望,我真的不知道我在做什么。这完全是反复试验的问题(主要是错误)。如果有人可以在这里指导我,将不胜感激。
谢谢,里奥