Browsers continua enviando token NTLM em vez de Kerberos - como resolvê-l

Não consigo configurar o sistema corretamente e o navegador envia um kerberos ticket para o servidor web. Em vez disso, umNTLM token é enviado.

Q: Como posso resolver isso

odos os detalhes e configurações estão listados abaix

A infraestrutura

Tenho três máquinas no domínioCOMPANY.local:

PC-I7.COMPANY.local (em192.168.0.5). Atua comoKDC, é umActive-Directory servidor com as outras máquinas (veja abaixo) registradas no AD. Também tem oDNS para a rede local configurada. O domínio no Active Directory é:COMPANY.localSOFTWARE.COMPANY.local (em192.168.0.10) executa o jetty aplicativo da web que possui oJetty/SPNego suporte configurado.OTHER.COMPANY.local (em192.168.0.9), apenas um cliente para que eu possa acessar o servidor de software de outra máquin

Os dois últimos são realmenteVMs rodando em umlinux servidor na intranet. Eles são acessíveis com seu próprio IP. O @ principal delDNS emNetwork Configuration aponta para192.168.0.5.

Ambos se juntam aCOMPANY.local e estão presentes como computadores noAD.

Conheço cliente e servidor deve ficar em máquinas diferentes; e sendo eles em dois diferentesVM deve evitar esse problem

Todas as três máquinas são registradas comoA hosts noDNS com um ponteiro reverso para cada um deles noReverse lookup zone.

SPN

Depois de criar o usuáriosoftware no Active Directory, eu gero o arquivo keytab

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

Recebo a seguinte saída que parece conter um erro:

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)

OAD usuário tem os doisThis account supports the Kerbers AES-...aixas de seleção marcada

OOTHER.COMPANY.local servido

Fazer login nesta máquina viaRDP com as credenciais:

user: Administrator
pass: ARandomPass

Ao solicitar um ingresso deOTHER servidor com

kinit HTTP/[email protected]

Eu posso ver esses pacotes comwireshark

@ Internet Explorer (e, portanto, o Chrome) tem as seguintes configurações emInternet Options:

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

Quando chego ao aplicativo da Web emhttp://software.company.local:8998/software/login

Posso ver o navegador envia umNTLM request

e eu posso ver o Exceção de token defeituoso no lado do servidor

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)

Também esta informação aparece nojava registro

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

Informações que posso coletar a partir da resposta vinculada:

Point 1: O SPN do serviço HTTP corresponde à URL inserida pelo navegador. Eu insirosoftware.company.local no navegador igual ao SPNHTTP/[email protected]

Point 2:*.company.local é adicionado aos sites confiáveis.

Ponto 3: não estou restringindo a criptografia aDES-CBC-MD5

Ponto 3: verifiqueiAES-128 eAES-256 ... mas nãoDES porque a versão do Windows Server com a qual estou trabalhando tem a caixa de seleção dizendoUse only Kerberos DES encryption types for this account, que não é o que eu quero. Devo verificar?

OSOFTWARE.COMPANY.local servido

O jetty aplicativo da web está registrado como um Windows Serve

Estes são os arquivos de configuração:

krb5.ini Arquivo

[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 Arquivo

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;
};

e esse é ospnego.properties Arquivo

targetName = HTTP/software.company.local

Minhasjetty-web.xml arquivo de configuração contém:

<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>

É assim que registro programaticamente ospnego configuração emJava:

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: informações adicionais

Transferi oKerberos Authentication Tester Tool e ao executá-lo a partir doKDC servidor 192.168.0.5) e teste contrahttp://software.company.local:8998 mostra um @ correKerberos autenticação.

Quando executá-lo a partir do192.168.0.10 server (onde está o navegador) diz:

Cabeçalho de autorização inesperada

e método de autenticação:NTLM.

Acho que é umDNS questão ou o fato de que eles são doisVM no mesmo servidor.

questionAnswers(1)

yourAnswerToTheQuestion