Java Spring Security Kerberos,Kerberos+;AD-错误:访问被拒绝,没有要存储的密钥

Java Spring Security Kerberos,Kerberos+;AD-错误:访问被拒绝,没有要存储的密钥,java,spring,spring-security,kerberos,spring-security-kerberos,Java,Spring,Spring Security,Kerberos,Spring Security Kerberos,这是在对应的上找到的Kerberos示例应用程序 我所做的只是修改src/main/resources/application.yml以适应我的系统,并在创建SPN和Keytab文件之间来回切换。 我的spring应用程序似乎开始运行良好。下面是通过控制台输出的Kerberos配置 调试为true storeKey trueuseTicketCache false useKeyTab truedoNotPrompt true ticketCache为null isInitiator falseK

这是在对应的上找到的Kerberos示例应用程序

我所做的只是修改src/main/resources/application.yml以适应我的系统,并在创建SPN和Keytab文件之间来回切换。 我的spring应用程序似乎开始运行良好。下面是通过控制台输出的Kerberos配置

调试为true storeKey trueuseTicketCache false useKeyTab truedoNotPrompt true ticketCache为null isInitiator falseKeyTab为/etc/client server。KeyTabrefreshKrb5Config为false主体为HTTP/client-server。示例。org@REALMtryFirstPass为false useFirstPass为false storePass为false clearPass为假
主体是HTTP/client-server.example。org@REALM
将使用keytab
提交成功

因此,我可以看到客户端应用程序到目前为止已经接受了我的设置。然后我尝试通过另一台机器上的chrome访问客户机服务器:8080/hello。我得到的第一个错误是拒绝访问(用户是匿名的)。它应该重定向到身份验证入口点。然后我得到以下结果,以“无需存储密钥”结尾

[nio-8080-exec-4]w.a.SPNEGAuthenticationProcessingFilter:接收到请求客户端服务器的协商头:8080/favicon.ico:协商Yihzaygwybqucoiihwdccb1sgmdaubgk……/9adsof2hya7c
[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]o.s.s.l.s.FilterbasedapUserSearch:搜索用户的myUsername@REALM,使用用户搜索[searchFilter:'',searchBase:'DC=xxxxx',作用域:子树,searchTimeLimit:0,DerefrinkFlag:false]
调试为true storeKey trueuseTicketCache true useKeyTab truedoNotPrompt true ticketCache为null isInitiator trueKeyTab为nullrefreshKrb5Config为false主体为HTTP/client-server.example。org@REALMtryFirstPass为假useFirstPass为假storePass为假clearPass为假
从缓存中获取TGT
主体是HTTP/client-server.example。org@REALM
2015-11-27 11:38:47.906调试3183---[nio-8080-exec-4]w.c.HttpSessionSecurityContextRepository:SecurityContext为空或内容为匿名-上下文不会存储在HttpSession中。 2015-11-27 11:38:47.906调试3183---[nio-8080-exec-4]s.s.w.c.SecurityContextPersistenceFilter:SecurityContextHolder现在已清除,请求处理完成 2015-11-27 11:38:47.912错误3183---[nio-8080-exec-4]o.a.c.c.c.[/].[dispatcherServlet]:路径[]上下文中Servlet[dispatcherServlet]的Servlet.service()引发异常 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的源代码,您可以通过简单的搜索找到登录异常,没有要存储的密钥奇怪的是,当我尝试使用浏览器导航时,控制台输出确实会说keytab为null,即使我启动应用程序时不是这样


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

所以我周末就睡在这个上面。奇怪的是,从缓存获取的TGT已经过了续费时间,现在看起来解决方案似乎可以工作了。我真的不知道怎么做这一切都是可行的,但现在当我的用户导航到应用程序时,keytab被接受。

剩下的唯一问题是,由于用于查询Ldap的Kerberos用户名不匹配,Ldap无法找到我的用户详细信息,因此我必须重新实现org.springframework.security.Ldap.search.FilterbasedapUserSearch来修改用户名。然后解决方案起了作用。

我遇到了类似的问题,而根本原因实际上是错误由kinit创建的upt密钥。解决方案是删除缓存(在/tmp/kbr5cc_Uuid下)和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
调试密钥类型:0 >>>调试验证时间:1970年1月1日星期四00:00:00 UTC >>>调试开始时间:null >>>调试结束时间:1970年1月1日星期四00:00:00 UTC >>>调试更新时间:null
我的情况也是如此。一旦我删除了上面提到的@Leo的缓存文件,这个奇怪的异常“无需存储的密钥”就消失了,keytab开始成功使用。