2015-06-25 23 views
8

Sto cercando di utilizzare S4U2Proxy introdotto in Java 8. Purtroppo non sono riuscito a trovare questi molti esempi. Il mio requisito è che il client invii il suo certificato. Dovrei quindi delegare (usando kerberos) la sua richiesta, connettermi a KDC, ottenere il TGT, ottenere il ticket di servizio per contattare un altro server per conto dell'utente e infine contattare il servizio effettivo fornendo il ticket di servizio. Se java 8 non fornisce un approccio pulito, puoi indicarmi altre utilità che potrebbero risolvere il mio requisito.Utilizzo di Java 8 S4U2Proxy - Un buon esempio necessario

Subject.doAs(subject, new PrivilegedAction<Object>() { 
     @Override 
     public Object run() { 
      GSSManager manager = GSSManager.getInstance(); 
      GSSCredential self = null; 
      try { 
       GSSName selfUser = manager.createName("serviceWhoWantstoImpersonate", GSSName.NT_USER_NAME); 
       Oid krb5Oid = new Oid("1.2.840.113554.1.2.2"); 
       self = manager.createCredential(selfUser.canonicalize(krb5Oid), GSSCredential.DEFAULT_LIFETIME, krb5Oid, GSSCredential.INITIATE_ONLY); 
       GSSName user = manager.createName(clientName, GSSName.NT_USER_NAME); 
       GSSCredential impCred = ((ExtendedGSSCredential) self).impersonate(user); 
      } catch (GSSException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 
    }); 

Ovviamente ci saranno domande su come l'SPN è stato impostato nel KDC? Se l'account di servizio è autorizzato per la delega? L'SPN corretto è stato assegnato a quell'account di servizio? Quando l'utente "scimmia" nega ogni sorta di delega? ecc. ecc. In questo momento sento di aver fatto le impostazioni giuste in KDC. Il mio problema è quanto sopra si verifica anche prima che colpisca il KDC. Qualsiasi input valido aiuterà.

MODIFICA: Dopo alcune ricerche, sono stato in grado di eseguire S4u2self e s4u2proxy utilizzando java 8. Stupito che almeno un esempio avrebbe dovuto essere fornito dalla documentazione Oracle. Ad ogni modo, ora sto passando al prossimo stadio. Ora un altro scenario che devo gestire è la delega dei certificati Kerber tra domini. Dalla documentazione di java 8 che ho visto finora, deduce che attualmente il cross-realm non è supportato. È ancora vero?

+0

Chiunque ha alcun tipo di soluzione? – Nischit

+0

È possibile ottenere una risposta con uno snippet di codice? –

risposta

2

ho costruito un'applicazione dimostrativa stand-alone completo per Kerberos SFU estensioni caratteristiche in Java 8: https://github.com/ymartin59/java-kerberos-sfudemo

Ecco il frammento di codice breve che permette di generare un token SPNEGO con biglietto TGS per un utente rappresentato:

GSSManager manager = GSSManager.getInstance(); 
GSSName userName = manager.createName("targetUser", GSSName.NT_USER_NAME); 
GSSCredential impersonatedUserCreds = 
    ((ExtendedGSSCredential)serviceCredentials).impersonate(userName); 

final Oid KRB5_PRINCIPAL_OID = new Oid("1.2.840.113554.1.2.2.1"); 
GSSName servicePrincipal = 
    manager.createName("HTTP/webservice-host.domain.ltd", KRB5_PRINCIPAL_OID); 
ExtendedGSSContext extendedContext = 
    (ExtendedGSSContext) manager.createContext(servicePrincipal, 
              new Oid("1.3.6.1.5.5.2"), 
              impersonatedUserCreds, 
              GSSContext.DEFAULT_LIFETIME); 
final byte[] token = extendedContext.initSecContext(new byte[0], 0, 0); 

Beware extendedContext non è stato ancora stabilito. Potrebbero essere necessari più round con il server.

Java 8 Kerberos code non supporta trasversale regno rappresentazione ancora: consultare JDK-8005819

L'account di servizio Java può essere ospitato in una sfera e questo codice può indirizzare un servizio in un altro regno quanto questo ambito è esplicitamente allegato al SPN, come HTTP/[email protected]

Lo stesso modo per gli utenti conosciuti in altro ambito, si dovrebbe aggiungere al nome di login in modo createName("[email protected]", GSSName.NT_USER_NAME)

+0

il codice demo su GitHub contiene alcuni errori. Aprirò un problema per questo. –

+0

@Yves - Sai se Java supporta la rappresentazione di Cross Realm e la delega vincolata? Non sembra essere supportato, ma mi chiedo perché se non lo è. – manish

+0

@ ItestonlyinProd Per supportare la delega vincolata tra domini, alcune configurazioni avanzate in ActiveDirectory devono essere eseguite con le azioni di PowerShell ... ma non ho ancora provato (forse questa settimana di fatto) –

Problemi correlati