Comment obtenir un ticket de service kerberos via GSS-API?
Quelqu'un sait-il comment obtenir un ticket de service à partir du Centre de Distribution de Clés (KDC) à l'aide de Java GSS-API?
J'ai un client lourd-application de la première authentifie via JAAS à l'aide de la Krb5LoginModule pour aller chercher le TGT à partir du cache de ticket (contexte: Windows par exemple, utilise une implémentation kerberos et stocke le tgt sécuritaire dans une zone de mémoire). À partir de la LoginManager je reçois le Sujet de l'objet qui contient le TGT. Maintenant, j'espère quand je créer un GSSCredential objet de mon service, le service de billetterie sera mis dans le Sujet les données d'identification ainsi (j'ai lu quelque part sur le web). J'ai donc essayé le suivant:
//Exception handling ommitted
LoginContext lc = new LoginContext("HelloEjbClient", new DialogCallbackHandler());
lc.login()
Subject.doAs(lc.getSubject(), new PrivilegedAction() {
public Object run() {
GSSManager manager = GSSManager.getInstance();
GSSName clientName = manager.createName("clientUser", GSSName.NT_USER_NAME);
GSSCredential clientCreds = manager.createCredential(clientName, 8 * 3600, createKerberosOid(), GSSCredential.INITIATE_ONLY);
GSSName serverName = manager.createName("myService@localhost", GSSName.NT_HOSTBASED_SERVICE);
manager.createCredential(serverName, GSSCredential.INDEFINITE_LIFETIME, createKerberosOid(), GSSCredential.INITIATE_ONLY);
return null;
}
private Oid createKerberosOid() {
return new Oid("1.2.840.113554.1.2.2");
}
});
Malheureusement je reçois un GSSException: Non valide les informations d'identification fournies (Mécanisme de niveau: impossible de trouver tout Kerberos tgt (ticket granting ticket).
OriginalL'auteur Roland Schneider | 2008-12-16
Vous devez vous connecter pour publier un commentaire.
Ma compréhension de l'obtention du ticket de service était mauvais. Je n'ai pas besoin d'obtenir les informations d'identification du service - ce n'est pas possible sur le client, car le client n'est pas vraiment un TGT (ticket granting ticket pour le serveur et donc n'ont pas le droit d'obtenir les informations d'identification du service.
Ce manque juste ici est de créer un nouveau GSSContext et de l'initialiser. La valeur de retour de cette méthode contient le ticket de service, si j'ai bien compris. Voici un exemple de code. Il doit être exécuté dans un PrivilegedAction au nom d'un connecté sujet:
La outToken contient contient alors le Ticket de Service. Cependant, ce n'est pas la façon dont le GSS-API est destinée à être utilisé. Son but est de cacher les détails pour le code, il est donc préférable d'établir un GSSContext à l'aide de la GSS-API sur les deux côtés. Sinon, vous devriez vraiment savoir ce que vous faites en raison de potentielles failles de sécurité.
Pour plus d'informations, lisez le Soleil SSO tutoriel avec kerberos avec plus de soin que j'ai fait.
EDIT:
Juste oublié que je suis sous Windows XP SP2. Il y a une nouvelle "fonction" dans cette version de Windows qui interdit l'utilisation de la TGT dans la RAM sous Windows. Vous devez modifier le registre pour permettre cela. Pour plus d'informations, jetez un coup d'oeil à la JGSS Dépannage page sujet dans le cas où vous l'expérience d'une "KrbException: KDC n'a pas de support pour le chiffrement de type (14)" comme je l'ai fait.
vérifiez votre lien de Soleil SSO tutoriel avec kerberos et ont un look à la figure 6. Il est la boucle que j'ai écrit sur.
Je pense que je n'ai pas inclure la boucle parce que je n'arrivais pas à comprendre ce que l'readToken() et sendToken(...) les méthodes sont censés faire.
dans le cas de HTTP
readToken
demande une réponse HTTP et extraits le jeton,sendToken
effectue l'inverse.OriginalL'auteur Roland Schneider
J'ai eu beaucoup de problèmes pour utiliser ce code, mais j'ai au moins une solution. Je l'ai poster ici, peut-être que ça aidera certains d'entre vous...
OriginalL'auteur Olivier Faucheux