Nous avons un domaine kerberos dans mon entreprise et je cours quelques Java/Kerberos examples. La question que j'ai est autour du mécanisme de connexion du point de vue du serveur. Lors de l'exécution de l'exemple de serveur GssServer.java
, je dois obtenir un javax.security.auth.Subject
; dans le code fourni ce fait par un LoginContext
ainsi:Kerberos de Java - Obtenir un objet pour l'utilisateur actuellement authentifié
// Create a LoginContext with a callback handler and login
LoginContext context = new LoginContext(name, new TextCallbackHandler());
context.login();
Subject subject = context.getSubject();
Tout cela est OK et quand je lance l'exemple que je vois une belle invite de connexion. Cependant, mon problème est que c'est pas vraiment comment mon serveur va fonctionner et ni comment j'ai été amené à comprendre comment je devrais présenter des services à partir d'un domaine kerberos. Dans l'exemple GssServer
, le problème est mon serveur (lire: service) devrait pas besoin de s'authentifier au KDC
afin de présenter son service aux clients. L'accès au fichier keytab
côté serveur devrait être suffisant pour cela. Donc, pour la configuration exemple:
//jaas-krb5.conf
server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="/home/myusr/my-server.keytab"
principal="myserv/mymachine.some.domain";
};
Et dans le code Java:
GSSManager manager = GSSManager.getInstance();
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
GSSName gssName = manager.createName("myserv/[email protected]",
GSSName.NT_HOSTBASED_SERVICE);
GSSCredential serverCreds = manager.createCredential(gssName,
GSSCredential.DEFAULT_LIFETIME,
krb5Mechanism,
GSSCredential.ACCEPT_ONLY);
Le problème avec ceci est que les informations server
dans le fichier jaas-krb5.conf
n'est pas disponible à moins je me authentifier via le ligne:
Jaas.loginAndAction("server", action);
Je ne devrais pas avoir à passer par cette authentification! Mais si je ne m'authentifie pas, je me retrouve avec:
Exception in thread "main" GSSException: No valid credentials provided (Mechanism level: Attempt to obtain new ACCEPT credentials failed!)
at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:188)
at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:73)
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:77)
at sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:149)
at sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:389)
at sun.security.jgss.GSSCredentialImpl.<init>(GSSCredentialImpl.java:45)
at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:102)
at gsa.hk.GssServer$GssServerAction.run(GssServer.java:79)
at gsa.hk.GssServer.main(GssServer.java:57)
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for com.sun.security.jgss.accept
at javax.security.auth.login.LoginContext.init(LoginContext.java:256)
at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403)
at sun.security.jgss.LoginUtility.login(LoginUtility.java:72)
at sun.security.jgss.krb5.Krb5Util.getKeysFromSubject(Krb5Util.java:205)
at sun.security.jgss.krb5.Krb5AcceptCredential$1.run(Krb5AcceptCredential.java:184)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:181)
... 8 more
Il n'est pas surprenant qu'il y ait un problème. Après tout, à moins que je ne m'occupe du sujet server
, comment puis-je savoir où se trouve mon keytab
, ou quel service je fournis?
Donc ma question est: comment puis-je dire le sur le keytab/service sans m'authentifier dans le code?