Pregunta

Estoy usando SPNEGO ( http://spnego.sourceforge.net ) para la autenticación Kerberos bajo JBoss.

necesito para descifrar vale Kerberos para acceder a la autorización de-datos que containt datos de APA. se necesitan los datos de PAC para decidir qué funciones deben ser otorgados al usuario.

Como el acceso y vale Kerberos descifrar? He buscado en la red de ejemplos, pero sin esfuerzo.

¿Fue útil?

Solución

Estos chicos tienen una implementación de la decodificación completa del PAC:

http://jaaslounge.sourceforge.net/

Puede utilizar el analizador de señal como esta:

HttpServletRequest request = (HttpServletRequest) req;
String header = request.getHeader("Authorization");
byte[] base64Token = header.substring(10).getBytes("UTF-8");
byte[] spnegoHeader = Base64.decode(base64Token);

SpnegoInitToken spnegoToken = new SpnegoInitToken(spnegoHeader);

Se va a necesitar para saltar aunque algunos aros si desea descifrar el vale Kerberos subyacente. No está seguro si necesita eso.

Grant

Otros consejos

he utilizado con éxito el filtro servlet de http://spnego.sourceforge.net en combinación con el PAC analizador de http://jaaslounge.sourceforge.net/ sin la necesidad de hacer algo de forma explícita con DER / ASN. 1 analizadores:

/** 
 * Retrieve LogonInfo (for example, Group SID) from the PAC Authorization Data
 * from a Kerberos Ticket that was issued by Active Directory.
 */  
byte[] kerberosTokenData = gssapiData;
try {
    SpnegoToken token = SpnegoToken.parse(gssapiData);
    kerberosTokenData = token.getMechanismToken();
} catch (DecodingException dex) {
    // Chromium bug: sends a Kerberos response instead of an spnego response 
    // with a Kerberos mechanism
} catch (Exception ex) {
    log.error("", ex);
}   

try {
    Object[] keyObjs = IteratorUtils.toArray(loginContext.getSubject()
                         .getPrivateCredentials(KerberosKey.class).iterator());
    KerberosKey[] keys = new KerberosKey[keyObjs.length];
    System.arraycopy(keyObjs, 0, keys, 0, keyObjs.length);

    KerberosToken token = new KerberosToken(kerberosTokenData, keys);
    log.info("Authorizations: "); 
    for (KerberosAuthData authData : token.getTicket().getEncData()
                                             .getUserAuthorizations()) {
        if (authData instanceof KerberosPacAuthData) {
            PacSid[] groupSIDs = ((KerberosPacAuthData) authData)
                                      .getPac().getLogonInfo().getGroupSids();
            log.info("GroupSids: " + Arrays.toString(groupSIDs));
            response.getWriter().println("Found group SIDs: " + 
                Arrays.toString(groupSIDs));
        } else {
            log.info("AuthData without PAC: " + authData.toString());
        }   
    }   
} catch (Exception ex) {
    log.error("", ex);
}   

También he escrito un nuevo HTTPFilter (en forma de horquilla de spnego.sf.net):. SPNEGO-pac, que revela la LogonInfo a través de la getUserPrincipal ()

Un proyecto de ejemplo que demuestra el código anterior en su totalidad se puede encontrar aquí:

https://github.com/EleotleCram/jetty-spnego-demo

El filtro SPNEGO-pac (utilizado en el ejemplo anterior) se puede encontrar aquí:

https://github.com/EleotleCram/spnego.sf.net-fork

Espero que esto es útil para cualquiera.

__
Marcel

Si se obtiene el mecanismo de token de la spnegoToken como esto:

byte[] mechanismToken = spnegoToken.getMechanismToken(); 

El token mecanismo es por lo general un KerberosApRequest. Hay un constructor que toma un KerberosToken KerberosApRequest. Basta con pasar en la matriz de bytes mechanismToken junto con la clave para descifrar el contenido.

proporciono mi propia solución al problema:

He basado mi solución en la biblioteca BouncyCastle (para analizar partes de token) y JaasLounge (para desencriptar la parte encriptada de token). Desafortunadamente, el código para decodificar toda SPNEGO token del JaasLounge no para mis necesidades. Tenía que escribir yo mismo.

He decodificado por parte billete parte, construyendo en primer lugar DERObjects de byte [] array:

private DERObject[] readDERObjects(byte[] bytes) throws IOException {
    ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(
        bytes));
    List<DERObject> objects = new ArrayList<DERObject>();
    DERObject curObj;
    while ((curObj = stream.readObject()) != null) {
        objects.add(untag(curObj));
    }
    return objects.toArray(new DERObject[0]);
}

El untag () es mi función auxiliar, para eliminar DERTaggedObject envoltura

private DERObject untag(DERObject src) {
    if (src instanceof DERTaggedObject) {
        return ((DERTaggedObject) src).getObject();
    }
    return src;
}

Para extraer la secuencia de DERObject de DERObject dado que he escrito otra función auxiliar:

private DERObject[] readDERObjects(DERObject container) throws IOException {
// do operation varying from the type of container
if (container instanceof DERSequence) {
    // decode using enumerator
    List<DERObject> objects = new ArrayList<DERObject>();
    DERSequence seq = (DERSequence) container;
    Enumeration enumer = seq.getObjects();
    while (enumer.hasMoreElements()) {
    DERObject curObj = (DERObject) enumer.nextElement();
    objects.add(untag(curObj));
    }
    return objects.toArray(new DERObject[0]);
}
if (container instanceof DERApplicationSpecific) {
    DERApplicationSpecific aps = (DERApplicationSpecific) container;
    byte[] bytes = aps.getContents();
    return readDERObjects(bytes);
}
if (container instanceof DEROctetString) {
    DEROctetString octets = (DEROctetString) container;
    byte[] bytes = octets.getOctets();
    return readDERObjects(bytes);
}
throw new IllegalArgumentException("Unable to decode sequence from "+container);
}

Al final, cuando tengo DEROctetStream, que contenían cifrada parte, acabo de utilizar KerberosEncData:

KerberosEncData encData = new KerberosEncData(decrypted, matchingKey);

La secuencia de bytes que recibimos de navegador del cliente se analiza en un solo DERApplicationSpecific la cual es la raíz de entradas - nivel 0. Francia El raíz contiene:

  • DERObjectIdentifier - SPNEGO OID
  • DERSequence - nivel 1

Nivel 1 contiene:

  • Secuencia de DERObjectIdentifier - tipos mech
  • DEROctetString - envuelto DERApplicationSepecific - nivel 2

Nivel 2 contiene:

  • DERObjectIndentifier - Kerberos OID
  • tag KRB5_AP_REQ 0x01 0x00, analiza como boolean (false)
  • DERApplicationSpecific - recipiente de DERSequence - nivel 3

Nivel 3 contiene:

  • número de versión - debe ser 5
  • Tipo de mensaje - 14 (AP_REQ)
  • Opciones (AP DERBITString)
  • DERApplicationSpecific - envuelta DERSequence con la parte de entradas
  • DERSeqeuence con la parte boleto adicional - no procesada

Ticket parte - nivel 4 contiene:

  • Versión de entradas - debe ser de 5
  • Ticket reino - el nombre del ámbito en el que se autentica el usuario
  • DERSequence de nombres de servidores. Cada nombre del servidor es DERSequence de 2 cadenas: nombre del servidor y nombre de la instancia
  • DERSequence con la parte cifrada

secuencia de parte cifrada (nivel 5) contiene:

  • número algoritmo utilizado
    • 1, 3 - DES
    • 16 - des3-CBC-SHA1-kd
    • 17 - ETYPE-AES128-CTS-HMAC-SHA1-96
    • 18 - ETYPE-AES256-CTS-HMAC-SHA1-96
    • 23 - RC4-HMAC
    • 24 - RC4-HMAC-EXP
  • número de versión clave
  • parte cifrada (DEROctetStream)
El problema era con el constructor DERBoolean, que ArrayIndexOutOfBoundException tiro, cuando se encontró

secuencia de 0x01 0x00. Tenía que cambiar ese constructor:

public DERBoolean(
    byte[]       value)
{
// 2011-01-24 llech make it byte[0] proof, sequence 01 00 is KRB5_AP_REQ
if (value.length == 0)
    this.value = 0;
else
    this.value = value[0];
}

Wow sido un tiempo desde que he usado SPNEGO (casi un año) ... Usted está haciendo una pregunta muy fresco.

Hice un poco de investigación e iba a tratar de correr hasta un cierto código que tenía desde hace un tiempo que estaba trabajando con MS-AD pero no la sensación de que hoy en día: - /

De todos modos, he encontrado este enlace a través de Google: http://www.google.com/url?sa=t&source=web&cd=1&sqi=2&ved=0CBMQFjAA&url=http%3A%2F % 2Fbofriis.dk% 2Ffiles% 2Fms_kerberos_pac.pdf y rct = j & q = java% 20kerberos% 20privilege% 20attribute% 20certificate y ei = 2FASTbaLGcP38Abk07iQDg y USG = AFQjCNHcIfQRUTxkQUvLRcgOaQksCALTHA y SIG2 = g8yn7ie1PbzSkE2Mfv41Bw & CAD = rja

Con suerte que le puede dar una idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top