Spring Security Kerberos,Kerberos + AD - 错误:访问被拒绝,无密钥存储

时间:2015-11-27 23:25:54

标签: java spring spring-security kerberos spring-security-kerberos

这是来自https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth对应http://docs.spring.io/spring-security-kerberos/docs/1.0.1.RELEASE/reference/htmlsingle/#samples-sec-server-win-auth的Kerberos示例应用。

我正在做的就是修改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   principal是HTTP/client-server.example.org@REALM
  将使用keytab
  提交成功

所以我可以看到客户端应用程序到目前为止已接受我的设置。然后我尝试通过另一台机器上的chrome访问客户端服务器:8080 / hello。我得到的第一个错误是Acces被拒绝(用户是匿名的)。应该重定向到身份验证入口点。然后我得到以下内容,以“No key to store”结尾

  

[nio-8080-exec-4] w.a.SpnegoAuthenticationProcessingFilter:收到请求客户服务器的协商标题:8080 / favicon.ico:协商YIIHZAYGKwYBBQUCoIIHWDCCB1SgMDAuBgk ...... ./ 9AdsoFH2ya7C
   [nio-8080-exec-4] o.s.s.authentication.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& #39;,scope:subtree,searchTimeLimit:0,d​​erefLinkFlag:false]
  Debug为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是假
  从缓存中获取TGT   Principal是HTTP/client-server.example.org@REALM
  2015-11-27 11:38:47.906 DEBUG 3183 --- [nio-8080-exec-4] w.c.HttpSessionSecurityContextRepository:SecurityContext为空或内容为匿名 - 上下文不会存储在HttpSession中。   2015-11-27 11:38:47.906 DEBUG 3183 --- [nio-8080-exec-4] s.s.w.c.SecurityContextPersistenceFilter:SecurityContextHolder现已清除,请求处理完成   2015-11-27 11:38:47.912 ERROR 3183 --- [nio-8080-exec-4] oaccC [。[。[/]。[dispatcherServlet]:servlet [dispatcherServlet]的Servlet.service()与上下文path []抛出异常   org.springframework.ldap.AuthenticationException:没有要存储的密钥;嵌套异常是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)是null。奇怪的是,控制台输出确实说当我尝试使用浏览器导航时,keytab为null,即使它不是我启动应用程序时。

当有用户尝试访问我的应用程序时,是否有人知道为什么我的keytab为null?或者我的应用程序或系统配置还有其他问题吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我遇到了类似的问题,其根本原因实际上是由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