Kerberos: GSSContext имя инициатора контекста является нулевым - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь интегрировать SSO через Kerberos / SPNEGO в свое приложение, как описано здесь https://docs.spring.io/spring-security-kerberos/docs/1.0.2.BUILD-SNAPSHOT/reference/htmlsingle/#samples-sec-server-win-auth

Мой context.xml выглядит так:

 <?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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">


    <sec:authentication-manager alias="authenticationManager">
        <sec:authentication-provider ref="kerberosAuthenticationProvider"/>
        <sec:authentication-provider ref="kerberosServiceAuthenticationProvider"/>
    </sec:authentication-manager>

    <bean id="kerberosAuthenticationProvider" class="org.springframework.security.kerberos.authentication.KerberosAuthenticationProvider">
        <property name="kerberosClient">
            <bean class="org.springframework.security.kerberos.authentication.sun.SunJaasKerberosClient">
                <property name="debug" value="true"/>
            </bean>
        </property>
        <property name="userDetailsService" ref="userDetailsService"/>
    </bean>

    <bean class="org.springframework.security.kerberos.authentication.sun.GlobalSunJaasKerberosConfig">
        <property name="debug" value="true"/>
    </bean>

    <bean id="spnegoEntryPoint" class="org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint">
        <constructor-arg value="/login"/>
    </bean>

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

    <bean id="kerberosServiceAuthenticationProvider"
          class="org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider">
        <property name="ticketValidator">
            <bean class="org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator">
                <property name="servicePrincipal" value="${myapp.kerberos.servicePrincipal}" />
                <property name="keyTabLocation" value="${myapp.kerberos.keytabLocation}" />
                <property name="debug" value="true" />
                <property name="holdOnToGSSContext" value="true"/>
            </bean>
        </property>
        <property name="userDetailsService" ref="userDetailsService" />
    </bean>

    <bean id="kerberosLdapContextSource" class="org.springframework.security.kerberos.client.ldap.KerberosLdapContextSource">
        <constructor-arg value="${myapp.ldap.ldapServerUrl}"/>
        <property name="loginConfig">
            <bean class="org.springframework.security.kerberos.client.config.SunJaasKrb5LoginConfig">
                <property name="keyTabLocation" value="${myapp.kerberos.keytabLocation}"/>
                <property name="servicePrincipal" value="${myapp.kerberos.servicePrincipal}"/>
                <property name="debug" value="true"/>
                <property name="isInitiator" value="true"/>
                <property name="useTicketCache" value="true"/>
            </bean>
        </property>
    </bean>

    <sec:ldap-user-service id="ldapUserDetailsService" server-ref="kerberosLdapContextSource" 
    user-search-filter="(| (userPrincipalName={0}) (sAMAccountName={0}))" />
</beans>

Я могу получить доступ к секретной части своего приложения, когда открыто открываю форму для входа и ввожу учетные данные AD (похоже, это работает в общем).

Когда я пытаюсь получить доступ к секретной части без предварительного явного входа в систему (что-то вроде / myapp / Administration), я получаю исключение BadCredentialsException с "GSSContext имя инициатора контекста равно нулю."

2018-05-11 16:10:07,578 [http-apr-8080-exec-3] WARN  org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter - Negotiate Header was invalid: Negotiate YHcG(...)==
org.springframework.security.authentication.BadCredentialsException: GSSContext name of the context initiator is null
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:173)
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:153)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:68)
    at org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:64)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:174)
    at org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:145)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)

Я думаю, что исключение говорит о том, что отправка TGT от клиента к Kerberos была изменена / не соответствует ожиданиям, поэтому клиент не считается заслуживающим доверия для получения Service Ticket. Но я не совсем уверен, правильно ли это.

Так ... что я пропускаю?

1 Ответ

0 голосов
/ 28 января 2019

У меня была такая же проблема, потому что я использовал неверный файл keytab. Попробуйте заменить его и проверьте процесс создания таблицы ключей.

...