Question

J'utilise SPNEGO ( http://spnego.sourceforge.net ) pour l'authentification kerberos sous JBoss.

Je dois déchiffrer kerberos billet d'accès à l'autorisation des données-qui contiennent des données PAC. Les données PAC est nécessaire pour déterminer quels rôles doivent être accordés à l'utilisateur.

Comment l'accès et Décrypter billet kerberos? J'ai cherché net des exemples, mais sans effort.

Était-ce utile?

La solution

Ces gars-là ont une mise en œuvre complète de décodage PAC:

http://jaaslounge.sourceforge.net/

Vous pouvez utiliser l'analyseur jeton comme ceci:

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

Vous allez avoir besoin de sauter si quelques cerceaux si vous voulez déchiffrer le ticket Kerberos sous-jacent. Je ne sais pas si vous avez besoin que.

Grant

Autres conseils

I ai utilisé avec succès le filtre de servlet en combinaison de http://spnego.sourceforge.net avec le PAC analyseur de http://jaaslounge.sourceforge.net/ sans qu'il soit nécessaire de faire quelque chose explicitement DER / ASN. 1 parseurs:

/** 
 * 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);
}   

Je l'ai aussi écrit une nouvelle HTTPFilter (en forme de fourche de spnego.sf.net). SPNEGO-pac, qui indique les LogonInfo par la getUserPrincipal ()

Un exemple de projet démontrant le code ci-dessus complet se trouve ici:

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

peut être trouvé Le filtre SPNEGO-pac (utilisé dans l'exemple ci-dessus) ici:

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

Espérons que cela est utile à tout le monde.

__
Marcel

Si vous obtenez le mécanisme jeton du spnegoToken comme ceci:

byte[] mechanismToken = spnegoToken.getMechanismToken(); 

Le jeton de mécanisme est généralement un KerberosApRequest. Il est un constructeur de KerberosToken qui prend KerberosApRequest. Il suffit de passer dans le tableau d'octets de mechanismToken avec la clé pour décrypter le contenu.

Je donne ma propre solution au problème:

J'ai fondé ma solution sur la bibliothèque BouncyCastle (pour analyser les parties de jeton) et JaasLounge (pour décrypter partie chiffrée du jeton). Unfortunatelly, le code pour le décodage SPNEGO tout jeton de JaasLounge a échoué pour mes besoins. Je devais l'écrire moi-même.

J'ai décodées partie de billets en partie, la construction d'une part DERObjects de tableau d'octets []:

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

Le untag () est ma fonction d'aide, pour enlever l'emballage DERTaggedObject

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

Pour extraire la séquence de DERObject de DERObject donné, je l'ai écrit une autre fonction d'assistance:

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

A la fin, quand j'ai DEROctetStream, qui contenaient une partie chiffrée, je viens utilisé KerberosEncData:

KerberosEncData encData = new KerberosEncData(decrypted, matchingKey);

La séquence d'octets que nous recevons de navigateur client sera analysé en simple DERApplicationSpecific qui est la racine de billets - niveau 0.
La racine contient:

  • DERObjectIdentifier - OID SPNEGO
  • DERSequence - niveau 1

Niveau 1 contient:

  • SEQUENCE de DERObjectIdentifier - types mech
  • DEROctetString - enveloppé DERApplicationSepecific - niveau 2

Niveau 2 contient:

  • DERObjectIndentifier - OID Kerberos
  • balise KRB5_AP_REQ 0x01 0x00, analysable comme booléen (false)
  • DERApplicationSpecific - conteneur de DERSequence - niveau 3

Niveau 3 contient:

  • numéro de version - devrait être 5
  • type de message - 14 (AP_REQ)
  • Options AP (de DERBITString)
  • DERApplicationSpecific - enveloppé DERSequence avec une partie de billets
  • DERSeqeuence avec une partie de billets supplémentaires - non traitées

Ticket partie - niveau 4 contient:

  • Version Ticket - devrait être 5
  • royaume Ticket - le nom du domaine dans lequel l'utilisateur est authentifié
  • DERSequence des noms de serveurs. Chaque nom de serveur est DERSequence de 2 chaînes: nom du serveur et le nom d'instance
  • DERSequence avec une partie cryptée

Séquence Encrypted partiel (niveau 5) comporte:

  • Numéro d'algorithme utilisé
    • 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
  • numéro de version clé
  • partie chiffrée (DEROctetStream)

Le problème était avec le constructeur DERBoolean, que ArrayIndexOutOfBoundException throw, quand a été trouvé séquence 0x01 0x00. Je devais changer ce constructeur:

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 été un moment que je l'ai utilisé SPNEGO (près d'un an) ... Vous vous posez une question très cool.

Je l'ai fait creuser un peu et je vais essayer de courir un peu de code que j'avais depuis un certain temps qui travaillait avec MS-AD, mais tout simplement pas se sentir aujourd'hui: - /

Quoi qu'il en soit, j'ai trouvé ce lien par 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 & rct = j & q = java% 20kerberos% 20privilege% 20attribute% 20certificate & ei = 2FASTbaLGcP38Abk07iQDg & usg = AFQjCNHcIfQRUTxkQUvLRcgOaQksCALTHA & sig2 = g8yn7ie1PbzSkE2Mfv41Bw & CAD = RJA

Il faut espérer que peut vous donner un aperçu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top