2

这是来自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 会变为空?还是我的应用程序或系统配置有其他问题?

4

2 回答 2

2

我遇到了类似的问题,根本原因实际上是由 kinit 创建的损坏的密钥。解决方案是删除缓存(都在 /tmp/kbr5cc_[UID] 下,以及在 JAAS 配置文件中由 ticketCache="/home/solr/cache" 设置的值中,而不是在启动应用程序之前运行 kinit。

为了找出发生了什么,我在 JVM 中添加了以下标志:-Dsun.security.krb5.debug=true

我看到密钥的开始和结束时间设置为纪元日期:

>>>DEBUG <CCacheInputStream> key type: 0
>>>DEBUG <CCacheInputStream> auth time: Thu Jan 01 00:00:00 UTC 1970
>>>DEBUG <CCacheInputStream> start time: null
>>>DEBUG <CCacheInputStream> end time: Thu Jan 01 00:00:00 UTC 1970
>>>DEBUG <CCacheInputStream> renew_till time: null
于 2016-11-23T11:26:07.990 回答
0

所以我周末睡在这个上面。奇怪的是,由于从缓存中获取的 TGT 已超过更新时间,因此该解决方案现在似乎有效。我真的不知道这一切是如何工作的,但现在当我的用户导航到应用程序时,keytab 被接受。
剩下的唯一问题是由于用于查询 LDAP 的 Kerberos 用户名不匹配,Ldap 无法找到我的用户详细信息,因此我不得不重新实现 org.springframework.security.ldap.search.FilterBasedLdapUserSearch 来修改用户名。然后解决方案奏效了。

于 2015-11-30T19:18:30.960 回答