Браузеры продолжают отправлять токен NTLM вместо Kerberos - как его решить?

Я не могу правильно настроить систему, и браузер отправляет Керберос билет на веб-сервер. Вместо этогоNTLM токен отправлен.

Q: Как я могу решить это?

Все детали и конфигурации перечислены ниже.

Infrastructure:

У меня есть три машины в доменеCOMPANY.local:

PC-I7.COMPANY.local (на192.168.0.5). Действует какKDC, этоActive-Directory сервер с другими машинами (см. ниже), зарегистрированными в AD. Также имеетDNS для локальной сети. Домен в Active Directory:COMPANY.localSOFTWARE.COMPANY.local (на192.168.0.10) работает Молы веб-приложение, которое имеетJetty/SPNego поддержка настроена.OTHER.COMPANY.local (на192.168.0.9), просто клиент, чтобы я мог получить доступ к серверу программного обеспечения с другого компьютера.

Последние два на самом делеVM работает наlinux сервер в интранете. Они доступны с их собственным IP. Их основнойDNS вNetwork Configuration указывает на192.168.0.5.

Оба присоединяются вCOMPANY.local и присутствуют как компьютеры вAD.

Я знаю клиента и сервер должен оставаться на разных машинах; и быть их на двух разныхVM следует избегать этой проблемы.

Все три машины зарегистрированы какA хосты вDNS с обратным указателем для каждого из них вReverse lookup zone.

SPN

После создания пользователяsoftware в Active Directory я создаю файл keytab

ktpass -princ HTTP/[email protected] -mapuser [email protected] -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass __PassForADUserSoftware__ -out C:/winnt/krb5.keytab

Я получаю следующий вывод, который, кажется, содержит ошибку:

Targeting domain controller: PC-I7.COMPANY.local
  Failed to set property 'userPrincipalName' to 'HTTP/[email protected]' on Dn 'CN=Software SSO Kerberized WebServer,DC=COMPANY,DC=local': 0x13.
  WARNING: Failed to set UPN HTTP/[email protected] on CN=Software SSO Kerberized WebServer,DC=COMPANY,DC=local.
  kinits to 'HTTP/[email protected]' will fail.
Successfully mapped HTTP/software.company.local to software.
Password successfully set!
Key created.
Key created.
Key created.
Key created.
Key created.
Output keytab to C:/winnt/krb5.keytab:
Keytab version: 0x502 
keysize 64 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x1 (DES-CBC-CRC) keylength 8 (0x0bf1688040abadba)
keysize 64 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x3 (DES-CBC-MD5) keylength 8 (0x0bf1688040abadba)
keysize 72 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x17 (RC4-HMAC) keylength 16 (0x737d9811dd38e108741461ba79153192)
keysize 88 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x12 (AES256-SHA1) keylength 32 (0xcc8ab2939f822f9df6904a987954e0cfaa261bc36803af6c5f8d9a98f1d4f2aa)
keysize 72 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x11 (AES128-SHA1) keylength 16 (0xd616b814dcd1b955f125ab4de5895d39)

TheAD пользователь имеет дваThis account supports the Kerbers AES-... флажки отмечены.

TheOTHER.COMPANY.local сервер

Я захожу на эту машину черезRDP с учетными данными:

user: Administrator
pass: ARandomPass

Когда просишь билет уOTHER сервер с

kinit HTTP/[email protected]

Я вижу эти пакеты сwireshark

Internet Explorer (и, следовательно, Chrome) имеют следующие настройки вInternet Options:

Security > Local Intranet > Sites > *.company.local
Security > Custom level > Automatic logon only in Intranet area

Когда я доберусь до веб-приложения наhttp://software.company.local:8998/software/login

Я вижу, что браузер отправляетNTLM запро

и я могу видеть Исключение дефектного токена на стороне сервера

WARN:oejs.SpnegoLoginService:qtp506835709-28: 
GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at sun.security.jgss.GSSHeader.<init>(GSSHeader.java:97)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:306)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
at org.eclipse.jetty.security.SpnegoLoginService.login(SpnegoLoginService.java:138)
at org.eclipse.jetty.security.authentication.LoginAuthenticator.login(LoginAuthenticator.java:61)
at org.eclipse.jetty.security.authentication.SpnegoAuthenticator.validateRequest(SpnegoAuthenticator.java:99)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:483)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:524)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
at java.lang.Thread.run(Thread.java:748)

Также эта информация появляется вjava журнал

Debug is true storeKey true useTicketCache false useKeyTab true doNotPrompt false 
ticketCache is null isInitiator false 
KeyTab is C:/software/inst/modules/common-config/auth/krb5.keytab refreshKrb5Config is false 
principal is HTTP/[email protected] tryFirstPass is false 
useFirstPass is false storePass is false clearPass is false

Информация, которую я могу получить из связанного ответа:

Point 1: SPN для службы HTTP соответствует URL-адресу, введенному браузером. Я вводsoftware.company.local в браузере, который совпадает с SPNHTTP/[email protected]

Point 2:*.company.local добавлен в доверенные сайты.

Point 3: я не ограничиваю шифрованиеDES-CBC-MD5

Point 3: я проверилAES-128 а такжеAES-256 ... но нетDES потому что версия Windows Server, с которой я работаю, имеет флажок с надписьюUse only Kerberos DES encryption types for this account, это не то, что я хочу. Должен ли я это проверить?

TheSOFTWARE.COMPANY.local сервер

The Молы веб-приложение зарегистрировано как Windows Server.

Это файлы конфигурации:

krb5.ini файл

[libdefaults]
default_realm = COMPANY.LOCAL
permitted_enctypes = rc4-hmac,aes128-cts,aes256-cts,arcfour-hmac-md5,aes256-cts-hmac-sha1-96    
default_tgs_enctypes = rc4-hmac,aes128-cts,aes256-cts,arcfour-hmac-md5,aes256-cts-hmac-sha1-96
default_tkt_enctypes = rc4-hmac,aes128-cts,aes256-cts,arcfour-hmac-md5,aes256-cts-hmac-sha1-96
default_keytab_name = FILE:C:/software/inst/modules/common-config/krb5.keytab

[domain_realm]
COMPANY.local = COMPANY.LOCAL
.company.local = COMPANY.LOCAL

[realms]
COMPANY.LOCAL = {
    admin_server = PC-I7.COMPANY.local
    kdc = PC-I7.COMPANY.local:88
}

spnego.conf файл

com.sun.security.jgss.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    principal = "HTTP/[email protected]"
    keyTab = "C:/software/inst/modules/common-config/auth/krb5.keytab"
    useKeyTab = true
    storeKey = true
    debug = true
    isInitiator = false;
};

com.sun.security.jgss.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    principal = "HTTP/[email protected]"
    useKeyTab = true
    keyTab = "C:/software/inst/modules/common-config/auth/krb5.keytab"
    storeKey=true
    debug=true
    isInitiator=false;
};

и этоspnego.properties файл

targetName = HTTP/software.company.local

Мояjetty-web.xml файл конфигурации содержит:

<Get name="securityHandler">
    <Set name="loginService">
        <New class="org.eclipse.jetty.security.SpnegoLoginService">
            <Set name="name">Company Realm</Set>
            <Set name="config">
                <SystemProperty name="jetty.home" default="."/>/modules/common-config/auth/spnego.properties</Set>
        </New>
    </Set>
    <Set name="checkWelcomeFiles">true</Set>
</Get>

Вот как я программно регистрируюspnego конфигурация вJava:

private SecurityHandler wrapEnableSSOAuthHandlers(final Handler collection) {

    // ini file
    System.setProperty(
            "java.security.krb5.conf",
            _config.getString("authentication.win_sso.spnego.krb5") // the krb5.ini file
    );
    System.setProperty(
            "java.security.auth.login.config",
            _config.getString("authentication.win_sso.spnego.login") // the spnego.conf file
    );
    System.setProperty(
            "javax.security.auth.useSubjectCredsOnly",
            "false"
    );

    final Constraint spnegoConstraint = new Constraint();
    spnegoConstraint.setName(Constraint.__SPNEGO_AUTH);

    final String domainRealm = _config.getString("authentication.win_sso.domain.realm");    // resolves to COMPANY.LOCAL

    spnegoConstraint.setRoles(new String[]{domainRealm});
    spnegoConstraint.setAuthenticate(true);

    final ConstraintMapping mapping = new ConstraintMapping();
    mapping.setConstraint(spnegoConstraint);
    mapping.setPathSpec("/*");

    final String spnegoProperties = _config.getString("authentication.win_sso.spnego.properties");      // the spnego.properties file

    final SpnegoLoginService loginService = new SpnegoLoginService();
    loginService.setConfig(spnegoProperties);
    loginService.setName(domainRealm);

    final ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
    securityHandler.setLoginService(loginService);
    securityHandler.setConstraintMappings(new ConstraintMapping[]{mapping});
    securityHandler.setRealmName(domainRealm);
    securityHandler.setAuthenticator(new SpnegoAuthenticator());
    securityHandler.setHandler(collection);
    return securityHandler;
}

а такж

// here I disable the TRACE method for all calls 
Handler wrappedSecurityHandler = wrapDisableTraceHandlers(handlers);
wrappedSecurityHandler = wrapEnableSSOAuthHandlers(wrappedSecurityHandler);
_server.setHandler(wrappedSecurityHandler);

EDIT 1: Дополнительная информация

Я скачал Kerberos Authentication Tester Tool и при запуске сKDC сервер 192.168.0.5) и тестирование противhttp://software.company.local:8998 показывает правильныйKerberos аутентификация

При запуске с192.168.0.10 сервер (где находится браузер):

Неожиданный заголовок авторизации

и метод аутентификации:NTLM.

Думаю, это либоDNS вопрос или тот факт, что они дваVM на том же сервере.

Ответы на вопрос(1)

Ваш ответ на вопрос