Browsers sigue enviando token NTLM en lugar de Kerberos: ¿cómo resolverlo?

arece que no puedo configurar correctamente el sistema y que el navegador envíe una kerberos ticket para el servidor web. En cambio, unaNTLM token es enviado.

Q: ¿Como puedo resolver esto

odos los detalles y configuraciones se enumeran a continuació

Infraestructura

Tengo tres máquinas dentro del dominioCOMPANY.local:

PC-I7.COMPANY.local (en192.168.0.5). Actúa comoKDC, se trata de unActive-Directory servidor con las otras máquinas (ver más abajo) registradas en el AD. También tiene laDNS para la red local configurada. El dominio en el Active Directory es:COMPANY.localSOFTWARE.COMPANY.local (en192.168.0.10) ejecuta elembarcader aplicación web que tiene laJetty/SPNego soporte configurado.OTHER.COMPANY.local (en192.168.0.9), solo un cliente para poder acceder al servidor de software desde otra máquina.

Los dos últimos son en realidadVMs corriendo en unalinux servidor en la intranet. Son accesibles con su propia IP. Su primariaDNS inNetwork Configuration puntos a192.168.0.5.

Ambos están unidos enCOMPANY.local y están presentes como computadoras en elAD.

Conozco cliente y servidor debe permanecer en diferentes máquinas; y estar en dos diferentesVM debería evitar este problema.

Las tres máquinas están registradas comoA hosts en elDNS con un puntero inverso para cada uno de ellos en laReverse lookup zone.

SPN

Después de haber creado el usuariosoftware en Active Directory, genero el archivo de tabla de claves

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

Obtengo el siguiente resultado que parece contener un error:

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)

LosAD usuario tiene las dosThis account supports the Kerbers AES-... casillas marcadas.

LosOTHER.COMPANY.local servidor

Inicio sesión en esta máquina a través deRDP con las credenciales:

user: Administrator
pass: ARandomPass

Cuando solicite un boleto deOTHER servidor con

kinit HTTP/[email protected]

Puedo ver estos paquetes conwireshark

Internet explorer (y, por lo tanto, Chrome) tienen la siguiente configuración enInternet Options:

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

Cuando llego a la aplicación web enhttp://software.company.local:8998/software/login

Puedo ver que el navegador envía unNTLM solicitu

y puedo ver elExcepción de token defectuoso en el lado del 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)

También esta información aparece en eljava Iniciar sesión

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

Información que puedo obtener de la respuesta vinculada:

Point 1: El SPN para el servicio HTTP coincide con la URL ingresada por el navegador. Yo ingresosoftware.company.local en el navegador que es el mismo que el SPNHTTP/[email protected]

Punto 2:*.company.local se agrega a los sitios de confianza.

Point 3: no estoy restringiendo la encriptación aDES-CBC-MD5

Point 3: he marcadoAES-128 yAES-256 ... pero noDES porque la versión de Windows Server con la que estoy trabajando tiene la casilla de verificación que diceUse only Kerberos DES encryption types for this account, que no es lo que quiero. ¿Debería verificarlo?

LosSOFTWARE.COMPANY.local servidor

Losembarcader la aplicación web está registrada como un servidor de Windows.

Estos son los archivos de configuración:

krb5.ini archivo

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

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

y esta es laspnego.properties archivo

targetName = HTTP/software.company.local

Mijetty-web.xml el archivo de configuración contiene:

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

Así es como programáticamente registro laspnego configuración enJava:

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: Información adicional

He descargado la Herramienta de prueba de autenticación Kerberos y al ejecutarlo desde elKDC servidor 192.168.0.5) y pruebas contrahttp://software.company.local:8998 muestra una @ correcKerberos autenticación.

Al ejecutarlo desde el192.168.0.10 servidor (donde está el navegador) dice:

Encabezado de autorización inesperado

y método de autenticación:NTLM.

Supongo que es unaDNS problema o el hecho de que son dosVM en el mismo servidor.

Respuestas a la pregunta(1)

Su respuesta a la pregunta