2015-11-20 16 views
7

Ich bin sehr neu in der MOngoDB + Java-Konfiguration. Ich versuche, die Verbindung von Remote-Mongodb-Server von Java-Anwendung zu erreichen. Ich möchte GSSAPI-Mechanismus für die Verbindung mit Mongotemplate verwenden. Der folgende Code wurde erfolgreich ausgeführt. Der folgende Code stammt aus meiner Konfigurationsdatei.GSSException: Keine gültigen Anmeldeinformationen zur Verfügung gestellt (Mechanismus-Ebene: Kerberos tgt konnte nicht gefunden werden)

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

Aber wenn ich versuche, unter Code ausführen ich erhalte Ausnahme

DB db = mongoTemplate.getDb(); 
Set<String> dbCollections1 = db.getCollectionNames(); 

Ausnahme:

GSSException: Keine gültige Anmeldeinformationen zur Verfügung gestellt (Mechanism Ebene: Fehler alle Kerberos TGT finden) bei sun.security.jgss.krb5.Krb5InitCredential.getInstance (Krb5InitCredential.java:147) bei sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement (Krb 5MechFactory.java:122) bei sun.security.jgss.GSSManagerImpl.getCredentialElement (GSSManagerImpl.java:193) bei sun.security.jgss.GSSCredentialImpl.add (GSSCredentialImpl.java:427) bei sun.security.jgss. GSSCredentialImpl. (GSSCredentialImpl.java:62) bei sun.security.jgss.GSSManagerImpl.createCredential (GSSManagerImpl.java:154) bei com.mongodb.DBPort $ GSSAPIAuthenticator.getGSSCredential (DBPort.java:622) bei com.mongodb .DBPort $ GSSAPIAuthenticator.createSaslClient (DBPort.java:593) bei com.mongodb.DBPort $ SaslAuthenticator.authenticate (DBPort.java:895) bei com.mongodb.DBPort.authenticate (DBPort.java:432) bei com .mongodb.DBPort.checkAuth (DBPort.java:443) bei com.mongodb.DBTCPConnec tor.innerCall (DBTCPConnector.java:289) bei com.mongodb.DBTCPConnector.call (DBTCPConnector.java:269) bei com.mongodb.DBCollectionImpl.find (DBCollectionImpl.java:84) bei com.mongodb.DB. Befehl (DB.java:320) bei com.mongodb.DB.command (DB.java:299) bei com.mongodb.DB.command (DB.java:388) bei com.mongodb.DBApiLayer.getCollectionNames (DBApiLayer.java:152)

+0

Ich weiß nichts über MongoDB, aber diese Fehlermeldung bedeutet, dass GSSAPI denkt, dass Sie Kerberos-Protokoll verwenden möchten - ist das wahr? Wenn ja, haben Sie die Konfiguration zur Verfügung gestellt, um GSSAPI mitzuteilen, wie der Kerberos-Server kontaktiert werden soll? und * (a) * wo das vorhandene Kerberos-Ticket zwischengespeichert wird, oder * (b) * Wie finde ich das Passwort und erstelle das Ticket im laufenden Betrieb? Übrigens, wenn Sie eine Sun/Oracle JVM verwenden, haben Sie die JARs mit der "Unlimited Strength Crypto" -Richtlinie heruntergeladen, um die AES256-Verschlüsselung zu aktivieren? –

+0

Ja, ich möchte das Kerberos-Protokoll verwenden. Ich habe zwei Systemumgebungsvariablen 1 gesetzt. KRB5_CONFIG = krb5.conf 2.KRB5_KTNAME = username.keytab Das habe ich für die Konfigurationsperspektive getan. Ich greife von der Java-Webanwendung auf diesen mongodb-Server zu. Ich hoffe, ich kann Ihnen eine Antwort auf Ihre Fragen geben. –

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/21375372/accessing-hive-metastore-using-jdbc-with-kerberos-keytab für die schmutzigen Details der Einstellung der Kerberos conf (na ja, einige der Details) –

Antwort

7

Millionen Dank an alle, die geantwortet haben und werfen Sie einen Blick auf meine Frage.

Nachdem ich einige Systemeigenschaften und eine neue conf Datei hinzugefügt habe, kann ich endlich mit dem MongoDB Server verbunden werden. Hier die aktualisierte Code -

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

Meine krb5.conf Datei aussehen wie unten -

[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 
} 

Mein GSS-Jaas.conf wie unten aussehen -

com.sun.security.jgss.initiate { 
com.sun.security.auth.module.Krb5LoginModule required 
useKeyTab=true 
useTicketCache=false 
principal="[email protected]_REALM" 
doNotPrompt=true 
keyTab="path-to-my-keytab-file" 
debug=true;}; 

-Code ich geschrieben habe ist für mich arbeiten. Hoffe, das wird für andere funktionieren.

1

Hinzufügen von Informationen zu diesem Beitrag als sehr nützlich bereits.

Wenn die Sasl/createSaslClient im Subject:doAs Methode nicht ausgeführt wird , die aus dem LoginContext abgerufen wird, werden die Anmeldeinformationen nicht von der krb5.conf Datei aufgenommen. ICH.e Der Code GSS zeigt den Sicherheitsmanager des aktuellen Threads für den Betreff, der über die Methode Subject:doAs registriert wurde, und verwendet dann die Anmeldeinformationen dieses Themas. Diese Subject sollte über jaas erhalten worden sein, die wiederum die korrekten jaas und krb5.conf Anmeldeinformationen lesen würde, aber wenn Sie die sasl und saslclient Methoden innerhalb der Subject:doAs Methode nicht ausführen, ist das alles egal.

Sie können um ihn herum zu erhalten, indem javax.security.auth.useSubjectCredsOnly=false Einstellung, was bedeutet, wenn keine Anmeldeinformationen gefunden werden kann, werden einige Standardnamen in der JAA-Datei gesucht für http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/jgss/LoginConfigImpl.java#92 zu sehen, ist com.sun.security.jgss.initiate.

zB `` ` com.sun.security.jgss.initiate { com.sun.security.auth.module.Krb5LoginModule erforderlich doNotPrompt = true useTicketCache = true useKeyTab = true KEYTAB =" mykeytab " Prinzipal =" Dienst/Host @ REALM "; };

`` `

0

stand ich den gleichen Fehler "Mechanism Ebene: Fehler alle Kerberos TGT zu finden". Mein Problem sieht anders aus als bei Ihnen, aber es könnte für andere mit dem gleichen Fehler nützlich sein.

In meinem Fall wurde es durch einen Fehler beim Schreiben der Hauptname in einer meiner Konfigurationsdateien verursacht.

Ich empfehle, die Jaas LoginManager Konfigurationsdatei (mit java.security.auth.login.config bereitgestellt) und Richtliniendateien für Principals zu überprüfen. Ein typischer Fehler ist der Domain-Name in Kleinbuchstaben: [email protected] anstelle von [email protected]

Für den Fall, dass Sie den Principal programmatisch festlegen/referenzieren, können Sie auch die Korrektheit des Principal-Namens in Ihrem Code überprüfen. Grüße

Verwandte Themen