Je suis très nouveau dans la configuration Java de MOngoDB +. J'essaie d'établir la connexion à partir d'un serveur mongodb distant à partir d'une application Java. Je veux utiliser le mécanisme GSSAPI pour la connexion avec mongotemplate. Le code ci-dessous a été exécuté avec succès. Le code ci-dessous provient de mon fichier de configuration.
List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
ServerAddress address = new ServerAddress(Host, port);
serverAddresses.add(address);
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
MongoCredential credential = MongoCredential.createGSSAPICredential(userName);
credential.withMechanismProperty("SERVICE_NAME", gssapiServiceName);
credential.withMechanismProperty("CANONICALIZE_Host_NAME", true);
credentials.add(credential);
return new MongoClient(serverAddresses, credentials);
Mais quand j'essaye d'exécuter le code ci-dessous, je reçois une exception.
DB db = mongoTemplate.getDb();
Set<String> dbCollections1 = db.getCollectionNames();
Exception:
GSSException: aucune information d'identification valide fournie (niveau de mécanisme: impossible de trouver un tgt Kerberos) à Sun.security.jgss.krb5.Krb5InitCredential.getInstance (Krb5InitCredential.Java:147) sur Sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement (Krb5MechFactory.Java:122) à Sun.security.jgss.GSSManagerImpl.getCredentialElement (GSSManagerImpl.Java:193) à Sun.security.jgss.GSSCredentialImpl.add (GSSCredentialImpl.Java:427) à Sun.security.jgss.GSSCredentialImpl. (GSSCredentialImpl.Java:62) à Sun.security.jgss.GSSManagerImpl.createCredential (GSSManagerImpl.Java:154) à l'adresse com.mongodb.DBPort $ GSSAPIAuthenticator.getGSSCredential (DBPort.Java:622) à l'adresse com.mongodb.DBPort $ GSSAPIAuthenticator.createSaslClient (DBPort.Java:593) à l'adresse com.mongodb.DBPort $ SaslAuthenticator.authenticate (DBPort.Java:895) à l'adresse com.mongodb.DBPort.authenticate (DBPort.Java:432) à l'adresse com.mongodb.DBPort.checkAuth (DBPort.Java:443) à l'adresse com.mongodb.DBTCPConnector.innerCall (DBTCPConnector.Java:289) à l'adresse com.mongodb.DBTCPConnector.call (DBTCPConnector.Java:269) at com.mongodb.DBCollectionImpl.find (DBCollectionImpl.Java:84) à com.mongodb.DB.command (DB.Java:320) à com.mongodb.DB.command (DB.Java:299) à com.mongodb.DB.command (DB.Java:388) à l'adresse com.mongodb.DBApiLayer.getCollectionNames (DBApiLayer.Java:152)
Un million de remerciements à tous ceux qui ont répondu et jetez un œil à ma question.
Après avoir ajouté des propriétés système et un nouveau fichier de configuration, je peux enfin me connecter au serveur MongoDB. Ci-joint le code mis à jour -
try {
System.setProperty("Java.security.krb5.conf","C:/mongodb/UnixKeytab/krb5.conf");
System.setProperty("Java.security.krb5.realm","EXAMPLE.COM");
System.setProperty("Java.security.krb5.kdc","example.com");
System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
System.setProperty("Java.security.auth.login.config","C:/mongodb/UnixKeytab/gss-jaas.conf");
List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
ServerAddress address = new ServerAddress(Host, port);
serverAddresses.add(address);
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
MongoCredential credential = MongoCredential.createGSSAPICredential(username);
credentials.add(credential);
MongoClient mongoClient1 = new MongoClient(serverAddresses, credentials);
DB db = mongoClient1.getDB(database);
} catch (UnknownHostException e) {
e.printStackTrace();
}
Mon fichier krb5.conf ressemble à celui ci-dessous -
[libdefaults]
default_realm = EXAMPLE.COM
default_tkt_enctypes = des-cbc-md5 rc4-hmac
default_tgs_enctypes = des-cbc-md5 rc4-hmac
default_keytab_name = <keytab file path>
[realms]
EXAMPLE.COM = {
kdc = example.com
master_kdc = example.com
default_domain = EXAMPLE.COM
}
INTRANET = {
kdc = example.com
master_kdc = example.com
default_domain = example.com
}
Mon gss-jaas.conf ressemble à ci-dessous -
com.Sun.security.jgss.initiate {
com.Sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=false
principal="my-account@MY_REALM"
doNotPrompt=true
keyTab="path-to-my-keytab-file"
debug=true;};
Le code que j'ai posté fonctionne pour moi. J'espère que cela fonctionnera pour les autres.
Ajout de quelques informations à ce post car il est déjà extrêmement utile.
Si le Sasl/createSaslClient
n'est pas exécuté dans la méthode Subject:doAs
Qui est extraite de la LoginContext
, les informations d'identification ne seront pas extraites du fichier krb5.conf
. Le code GSS
examine le gestionnaire de sécurité du thread actuel pour le sujet qui est enregistré via la méthode Subject:doAs
, puis utilise les informations d'identification de ce sujet. Cette Subject
aurait dû être obtenue via jaas
qui lirait à son tour les informations d'identification correctes jaas
et krb5.conf
, mais si vous n'exécutez pas les méthodes sasl
et saslclient
dans la méthode Subject:doAs
, tout cela n'a pas d'importance.
Vous pouvez contourner ce problème en définissant javax.security.auth.useSubjectCredsOnly=false
, ce qui signifie que si aucune information d'identification ne peut être trouvée, certains noms par défaut du fichier jaas seront recherchés. Voir LoginConfigImpl.Java # 92 , l'un est com.Sun.security.jgss.initiate
.
par exemple
com.Sun.security.jgss.initiate{
com.Sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
useTicketCache=true
useKeyTab=true
keyTab="mykeytab"
principal="service/Host@REALM";
};
J'ai rencontré la même erreur "Niveau de mécanisme: Impossible de trouver un tgt Kerberos". Mon problème est différent du vôtre, mais il pourrait être utile à d’autres avec la même erreur.
Dans mon cas, cela est dû à une erreur d’écriture du nom principal dans l’un de mes fichiers de configuration.
Je suggère de vérifier le fichier de configuration Jaas LoginManager (fourni avec Java.security.auth.login.config) et les fichiers de règles pour les principaux. L'erreur typique est le nom de domaine en minuscule: [email protected] au lieu de [email protected]
Dans le cas où vous définissez/faites référence au principal par programmation, vous pouvez également vérifier l'exactitude du nom du principal dans votre code .