这是来自https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth的 Kerberos 示例应用程序,对应于http:// /docs.spring.io/spring-security-kerberos/docs/1.0.1.RELEASE/reference/htmlsingle/#samples-sec-server-win-auth。
我所做的只是修改 src/main/resources/application.yml 以适应我的系统,并在创建 SPN 和 Keytab 文件之间来回切换。我的春季申请似乎开始正常。下面是通过控制台输出的 Kerberos 配置。
Debug 为 true storeKey true useTicketCache false useKeyTab true doNotPrompt true ticketCache 为 null isInitiator false KeyTab 为 /etc/client-server.keytab refreshKrb5Config 为 false principal 为 HTTP/client-server.example.org@REALM tryFirstPass 为 false useFirstPass 为 false storePass 为false clearPass 为 false
主体为 HTTP/client-server.example.org@REALM
将使用 keytab
提交成功
所以我可以看到客户端应用程序已经接受了我的设置。然后我尝试在另一台机器上通过 chrome 访问 client-server:8080/hello。我得到的第一个错误是拒绝访问(用户是匿名的)。应该重定向到身份验证入口点。然后我得到以下内容,以“No key to store”结尾</p>
[nio-8080-exec-4] waSpnegoAuthenticationProcessingFilter:收到请求客户端服务器的协商标头:8080/favicon.ico:协商 YIIHZAYGKwYBBQUCoIIHWDCCB1SgMDAuBgk……./9AdsoFH2ya7C
[nio-8080-exec-4] ossauthentication.ProviderManager:使用 org 进行身份验证尝试.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider
[nio-8080-exec-4] .a.KerberosServiceAuthenticationProvider :尝试验证 Kerberos 令牌
[nio-8080-exec-4] .a.KerberosServiceAuthenticationProvider :成功验证 myUsername@REALM
[nio-8080-exec-4] osslsFilterBasedLdapUserSearch : 搜索用户 'myUsername@REALM',使用用户搜索 [ searchFilter: '', searchBase: 'DC=xxxxx', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ]
调试是 true storeKey true useTicketCache true useKeyTab true doNotPrompt true ticketCache 是 null isInitiator true KeyTab 是 null refreshKrb5Config 是 false principal 是 HTTP/client-server.example.org@REALM tryFirstPass 是 false useFirstPass 是 false storePass 是 false clearPass 是 false
从缓存中获取 TGT
主体是 HTTP/client-server.example.org@REALM
2015-11-27 11:38:47.906 调试 3183 --- [nio-8080-exec-4] wcHttpSessionSecurityContextRepository:SecurityContext 为空或内容是匿名的 - 上下文不会存储在 HttpSession 中。2015-11-27 11:38:47.906 DEBUG 3183 --- [nio-8080-exec-4] sswcSecurityContextPersistenceFilter:SecurityContextHolder 现在已清除,因为请求处理已完成 2015-11-27 11:38:47.912 错误 3183 --- [ nio-8080-exec-4] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() for servlet [dispatcherServlet] 在路径 [] 的上下文中抛出异常 org.springframework.ldap.AuthenticationException: No key to店铺; 嵌套异常是 javax.naming.AuthenticationException:没有要存储的密钥 [根异常是 javax.security.auth.login.LoginException:没有要存储的密钥]
现在看来该应用程序能够验证我的用户,但我不知道它是否能找到我的用户信息。在 cr.openjdk.java.net/~weijun/7201053/webrev.00/raw_files/new/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java 查看 Krb5LoginModule.java 的源代码,你可以通过简单的搜索找到登录异常,没有密钥存储。代码说我的 ktab(我猜是 keytab)为空。奇怪的是,控制台输出确实表明,当我尝试使用浏览器导航时,keytab 为空,即使它不是在我启动应用程序时。
当我有用户尝试访问我的应用程序时,有谁知道为什么我的 keytab 会变为空?还是我的应用程序或系统配置有其他问题?