Frage

Ich bin mit spnego ( http://spnego.sourceforge.net ) für die Kerberos-Authentifizierung unter JBoss.

Ich brauche Kerberos-Ticket für den Zugriff die Berechtigungsdaten zu entschlüsseln, die PAC Daten containt wird. Die PAC-Daten benötigt wird, um zu entscheiden, welche Rollen sind Benutzer erteilt werden.

Wie Zugriff und Entschlüsselung Kerberos-Ticket? Ich habe Beispiele gesucht Netz, aber ohne Anstrengung.

War es hilfreich?

Lösung

haben diese Jungs eine vollständige PAC Decodierung Implementierung:

http://jaaslounge.sourceforge.net/

Sie können das Token-Parser wie folgt aus:

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

Sie gehen zu müssen, obwohl einige Reifen zu springen, wenn Sie die zugrunde liegenden Kerberos-Ticket entschlüsseln möchten. Nicht sicher, ob Sie das brauchen.

Grants

Andere Tipps

Ich habe erfolgreich die Servlet-Filter von http://spnego.sourceforge.net in Kombination mit dem PAC Parser von http://jaaslounge.sourceforge.net/ ohne die Notwendigkeit, etwas explizit mit dER / ASN zu tun. 1 Parser:

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

Ich habe auch einen neuen Httpfilter (gegabelt von spnego.sf.net) geschrieben. Spnego-pac, das offenbart die LogonInfo durch die getUserPrincipal ()

Ein Beispielprojekt des obigen Code in vollem Umfang zeigen kann hier gefunden werden:

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

Die spnego-pac-Filter (im obigen Beispiel verwendet wird) können hier gefunden werden:

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

Hope Dies ist hilfreich für jeden.

__
Marcel

Wenn Sie den Mechanismus erhalten aus dem spnegoToken wie dieses Token:

byte[] mechanismToken = spnegoToken.getMechanismToken(); 

Der Mechanismus Token ist in der Regel ein KerberosApRequest. Es gibt einen KerberosToken Konstruktor, der eine KerberosApRequest nimmt. Übergeben Sie einfach im mechanismToken Byte-Array zusammen mit dem Schlüssel, den Inhalt zu entschlüsseln.

Ich stelle meine eigene Lösung für das Problem:

Ich habe meine Lösung auf Basis von BouncyCastle Bibliothek (für Teile des Token-Parsing) und JaasLounge (für verschlüsselten Teil des Token entschlüsseln). Leider, denn der Code ganze spnego von JaasLounge Token Decodierung fehlgeschlagen für meine Anforderungen. Ich musste es selbst schreiben.

Ich habe von einem Teil Ticket Teil dekodiert zunächst DERObjects von byte [] Array Konstruktion:

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

Die untag () ist meine Helferfunktion, DERTaggedObject Verpackung

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

Für Folge von DERObject aus gegebenen DERObject Extrahieren ich habe eine andere Hilfsfunktion geschrieben:

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

Am Ende, als ich habe DEROctetStream bekam, die Teil verschlüsselt enthalten ist, habe ich KerberosEncData nur verwendet:

KerberosEncData encData = new KerberosEncData(decrypted, matchingKey);

Die Bytefolge wir von Client-Browser empfangen wird in einzelne DERApplicationSpecific analysiert werden das ist Ticket root - Ebene 0.
Die Wurzel enthält:

  • DERObjectIdentifier - SPNEGO OID
  • DERSequence - Stufe 1

Stufe 1 enthält:

  • Folge von DERObjectIdentifier - mech Typen
  • DEROctetString - wickelte DERApplicationSepecific - Stufe 2

Stufe 2 enthält:

  • DERObjectIndentifier - Kerberos OID
  • KRB5_AP_REQ Tag 0x01 0x00, analysiert als Boolean (false)
  • DERApplicationSpecific - Container von DERSequence - Stufe 3

Stufe 3 enthält:

  • Versionsnummer - sollte 5
  • Nachrichtentyp - 14 (AP_REQ)
  • AP-Optionen (DERBITString)
  • DERApplicationSpecific - DERSequence mit Ticket Teil gewickelt
  • DERSeqeuence mit zusätzlichem Ticket Teil - nicht verarbeitet

Ticket Teil - Stufe 4 enthält:

  • Ticket-Version - sollte 5
  • Ticket Reich - der Name des Bereichs, in dem Benutzer authentifiziert
  • DERSequence von Servernamen. Jeder Servername ist DERSequence von 2 Strings: Servername und Instanzname
  • DERSequence mit verschlüsseltem Teil

Encrypted Teilsequenz (Stufe 5) enthält:

  • Gebraucht Algorithmus Nummer
    • 1, 3 - DIE
    • 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
  • Schlüsselversionsnummer
  • Verschlüsselte Teil (DEROctetStream)

Das Problem war, mit DERBoolean Konstruktor, dass throw ArrayIndexOutOfBoundException, wenn Sequenz 0x01 0x00 gefunden wurde. Ich musste diesen Konstruktor ändern:

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 schon eine Weile her, seit ich gebraucht spnego habe (fast ein Jahr) ... Sie sind eine sehr coole Frage zu stellen.

Ich habe ein wenig zu graben und wollte versuchen und einige Codes läuft bis ich von einer Weile hatte, die mit MS-AD funktioniert aber nur es heute nicht das Gefühl: - /

Wie auch immer, fand ich diesen Link durch 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

Hoffentlich Ihnen einen kleinen Einblick geben kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top