2012-09-20 62 views
5

我想用SPNEGO執行驗證。我使用:BadCredentialsException:Kerberos驗證不成功

  • 彈簧芯3.1.0.RELEASE.jar
  • 彈簧安全核心3.1.0.RELEASE.jar
  • 彈簧安全Kerberos的核心1.0.0 .M2.jar從春天 核心安全
  • 包編解碼器3.0.7(https://jira.springsource.org/browse/SES-98)
  • tomcat的

我的配置文件看起來像以下。當我嘗試使用上述庫進行認證時,我得到以下異常。

有人有同樣的問題,並處理它?

配置文件(從彈簧安全的Kerberos例如採取):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <!-- This configuration uses SPNEGO by default, but one could also use a form if he directly goes to /login.html --> 
    <sec:http entry-point-ref="spnegoEntryPoint" use-expressions="true"> 
     <sec:intercept-url pattern="/secure/**" access="isAuthenticated()" /> 
     <sec:custom-filter ref="spnegoAuthenticationProcessingFilter" 
      position="BASIC_AUTH_FILTER" /> 
     <sec:form-login login-page="/login.html" default-target-url="/secure/index.jsp"/> 
    </sec:http> 

    <bean id="spnegoEntryPoint" 
     class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" /> 

    <bean id="spnegoAuthenticationProcessingFilter" 
     class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter"> 
     <property name="authenticationManager" ref="authenticationManager" /> 
    </bean> 

    <sec:authentication-manager alias="authenticationManager"> 
     <sec:authentication-provider ref="kerberosServiceAuthenticationProvider" /> <!-- Used with SPNEGO --> 
     <sec:authentication-provider user-service-ref="dummyUserDetailsService"/> <!-- Used with form login --> 
    </sec:authentication-manager> 



    <bean id="kerberosServiceAuthenticationProvider" 
     class="org.springframework.security.extensions.kerberos.KerberosServiceAuthenticationProvider"> 
     <property name="ticketValidator"> 
      <bean 
       class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator"> 
       <property name="servicePrincipal" value="HTTP/[email protected]" /> 
       <!-- Setting keyTabLocation to a classpath resource will most likely not work in a Java EE application Server --> 
       <!-- See the Javadoc for more information on that --> 
       <property name="keyTabLocation" value="file:/home/xxxxx/conf/krb5/krb5.keytab" /> 
       <property name="debug" value="true" /> 
      </bean> 
     </property> 
     <property name="userDetailsService" ref="dummyUserDetailsService" /> 
    </bean> 

    <!-- This bean definition enables a very detailed Kerberos logging --> 
    <bean 
     class="org.springframework.security.extensions.kerberos.GlobalSunJaasKerberosConfig"> 
     <property name="debug" value="true" /> 
    </bean> 

    <!-- 
     Just returns the User authenticated by Kerberos and gives him the 
     ROLE_USER 
    --> 

    <bean id="dummyUserDetailsService" 
     class="org.springframework.security.extensions.kerberos.sample.DummyUserDetailsService" /> 

</beans> 

例外其中我得到:

org.springframework.security.authentication.BadCredentialsException: Kerberos validation not succesfull 
     at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:69) 
     at org.springframework.security.extensions.kerberos.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:86) 
     at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) 
     at org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:131) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:219) 
     at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
     at java.lang.Thread.run(Thread.java:722) 
Caused by: java.security.PrivilegedActionException: GSSException: Failure unspecified at GSS-API level (Mechanism level: Invalid argument (400) - Cannot find key of appropriate 
type to decrypt AP REP - RC4 with HMAC) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:415) 
     at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:67) 
     ... 29 more 
Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Invalid argument (400) - Cannot find key of appropriate type to decrypt AP REP - RC4 with HMAC) 
     at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:778) 
     at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342) 
     at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) 
     at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:871) 
     at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:544) 
     at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342) 
     at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) 
     at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:146) 
     at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:136) 
     ... 32 more 
Caused by: KrbException: Invalid argument (400) - Cannot find key of appropriate type to decrypt AP REP - RC4 with HMAC 
     at sun.security.krb5.KrbApReq.authenticate(KrbApReq.java:273) 
     at sun.security.krb5.KrbApReq.<init>(KrbApReq.java:144) 
     at sun.security.jgss.krb5.InitSecContextToken.<init>(InitSecContextToken.java:108) 
     at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:761) 
     ... 40 more 
+0

嗯,看起來像我的bug。嘗試在[Spring Security的JIRA](https://jira.springsource.org/browse/SEC)上填寫一張票。 – Xaerxess

+0

這看起來像一個kerberos配置問題。檢查您的密鑰表文件是否包含正確類型的密鑰(rc4-hmac爲23)。 –

回答

2

我發現這個問題。 Spring-security-kerbos需要路徑爲keytab文件作爲「資源字符串」(詳細信息:http://static.springsource.org/spring/docs/3.0.x/reference/resources.html)。 當我將路徑設置爲「file:/home/xxxxx/conf/krb5/krb5.keytab」時,應用程序將運行,但我認爲它以後無法打開該文件,Kerberos不能加載任何密鑰。不幸的是,從Kerberos登錄並不是很清楚。

當我設置路徑爲「/home/xxxxx/conf/krb5/krb5.keytab」我得到了以下異常

Caused by: java.io.FileNotFoundException: ServletContext resource [/home/xxxxx/conf/krb5/krb5.keytab] cannot be resolved to URL because it does not exist 

解決此問題,可在文件SunJaasKerberosTicketValidator.java修復:

private String keyTabLocation; 

LoginConfig loginConfig = new LoginConfig(keyTabLocation, servicePrincipal, debug); 

代替:

private Resource keyTabLocation; 

LoginConfig loginConfig = new LoginConfig(keyTabLocation.getURL().toExternalForm(), servicePrincipal, debug); 

與此修復程序一切正常。我們可以設置文件路徑爲「/home/xxxxx/conf/krb5/krb5.keytab」

如果有人知道更多關於它的細節,請在這裏寫下。

-1

至少Java 7沒有(或者,我的版本不能)能夠處理「file:」前綴:See this link。我必須像你一樣對Spring源進行相同的修改。謝謝,這很有幫助。嘗試不同的配置浪費了半個星期。

+0

這似乎不是問題的答案。你應該發佈它作爲對其他答案的評論。 – Barmar