Kerberos: заголовок согласования недействителен (причина GSSException: не предоставлены действительные учетные данные (уровень механизма: не удалось найти учетные данные Kerberos)) - PullRequest
1 голос
/ 15 мая 2019

Moin!

Мои попытки аутентификации пользователя с помощью единого входа в Spring Security 5 и Kerberos терпят неудачу из-за исключения из глубины кода Kerberos. Сначала я покажу трассировку стека и вызывающий ее код, а затем предоставлю дополнительную информацию о моей среде, которая может помочь устранить некоторые возможности.

трассировка стека

WARN 3932 --- [apr-8080-exec-1] w.a.SpnegoAuthenticationProcessingFilter : Negotiate Header was invalid: Negotiate YIILSwYGKwYBBQUCoIILPzCCCzugMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCN[and so on]

org.springframework.security.authentication.BadCredentialsException: Kerberos validation not successful
at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:71) ~[spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
at org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:64) ~[spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:174) ~[spring-security-core-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199) ~[spring-security-core-5.1.1.RELEASE.jar:5.1.1.RELEASE]
at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:512) ~[spring-security-config-5.1.1.RELEASE.jar:5.1.1.RELEASE]
...
Caused by: java.security.PrivilegedActionException: null
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_162]
at javax.security.auth.Subject.doAs(Subject.java:422) ~[na:1.8.0_162]
at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:68) ~[spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
...
Caused by: org.ietf.jgss.GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)
at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:87) ~[na:1.8.0_162]
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:127) ~[na:1.8.0_162]
at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:198) ~[na:1.8.0_162]
  1. Итак, BadCredentialsException пока мой SunJaasKerberosTicketValidator проверяет билет SSO. Это просто отбрасывание PrivilegedActionException от

    public KerberosTicketValidation validateTicket(byte[] token) {
    try {
        return Subject.doAs(this.serviceSubject, new KerberosValidateAction(token));
    }
    catch (PrivilegedActionException e) {
        throw new BadCredentialsException("Kerberos validation not successful", e);
    }
    

    }

  2. PrivilegedActionException трудно отследить, поскольку он исходит из native метода java.security.AccessController.doPrivileged. Я не знаю реализацию. Что мне интересно - это то, что PrivilegedActionException печатается как

    Caused by: java.security.PrivilegedActionException: null
    

    Метод PrivilegedActionException.toString -

    public String toString() {
        String s = getClass().getName();
        return (exception != null) ? (s + ": " + exception.toString()) : s;
    }
    

    То есть exception (исключение причины) не равно нулю, а выводится как null ...

  3. Однако трассировка стека говорит нам, что корень проблемы - это GSSException из класса Krb5AcceptCredential .

    if (creds == null)
        throw new GSSException(GSSException.NO_CRED, -1,"Failed to find any Kerberos credentails");
    

    И creds == null, потому что Krb5Util.getServiceCreds (см. реализация ) возвращает null, не вызывая исключения.

Это то, как далеко я дошел до сих пор. Теперь дополнительная информация.

Создание средства проверки заявок в моем WebSecurityConfig

    SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator(); 
    ticketValidator.setServicePrincipal("HTTP/host@REALM");

    FileSystemResource fs = new FileSystemResource("PATH_TO_KEYTAB");
    ticketValidator.setKeyTabLocation(fs);
    LOGGER.info(fs.exists()); // prints 'true'

Создание KerberosServiceAuthenticationProvider

Это конфигурация объекта, который будет выбрасывать BadCredentialsException.

    KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider();
    provider.setTicketValidator(sunJaasKerberosTicketValidator());
    provider.setUserDetailsService(myUserDetailService);
    provider.supports(KerberosServiceRequestToken.class);

Я знаю, что SSO работает

Я могу позволить себе роскошь доказать, что SSO-инфраструктур моей компании работает. На этом же сервере запущено другое приложение (Spring Security 4 с Kerberos), в котором пользователь может успешно пройти аутентификацию через единый вход. Так что, скорее всего, что-то не так с моей настройкой.

Кстати, я использую Chrome, но я также тестировал его в IE.

Если вам нужна дополнительная информация из моего WebSecurityConfig или что-то еще, я предоставлю ее. Да пребудет с тобой сила: -)

Другие вопросы

Это то, что я нашел до сих пор, но эти примеры немного отличаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...