2015-11-20 2 views
7

मैं MONgoDB + जावा कॉन्फ़िगरेशन के लिए बहुत नया हूं। मैं जावा एप्लिकेशन से दूरस्थ mongodb सर्वर से कनेक्शन प्राप्त करने की कोशिश कर रहा हूँ। मैं mongotemplate के संबंध में जीएसएसएपीआई तंत्र का उपयोग करना चाहता हूं। नीचे कोड सफलतापूर्वक निष्पादित किया गया है। नीचे कोड मेरी विन्यास फाइल से है।जीएसएसएक्सप्शन: प्रदान किए गए कोई वैध प्रमाण-पत्र (तंत्र स्तर: किसी भी केर्बेरोस टीजीटी को खोजने में विफल)

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

लेकिन जब मैं कोड मैं हो रही है अपवाद नीचे निष्पादित कोशिश कर रहा हूँ

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

अपवाद:

GSSException: प्रदान की कोई मान्य क्रेडेंशियल्स (तंत्र का स्तर: किसी भी करबरोस TGT को ढूंढने में विफल) sun.security.jgss.krb5.Krb5InitCredential.getInstance (Krb5InitCredential.java:147) sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement (Krb पर 5MechFactory.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) पर com.mongodb.DBPort $ GSSAPIAuthenticator.getGSSCredential (DBPort.java:622) com.mongodb पर पर com पर com.mongodb.DBPort.authenticate (DBPort.java:432) पर .DBPort $ GSSAPIAuthenticator.createSaslClient (DBPort.java:593) com.mongodb.DBPort $ SaslAuthenticator.authenticate (DBPort.java:895) पर com.mongodb.DBTCPConnec पर .mongodb.DBPort.checkAuth (DBPort.java:443) tor.innerCall (DBTCPConnector.java:289) com.mongodb.DBTCPConnector.call (DBTCPConnector.java:269) पर com.mongodb.DBCollectionImpl.find (DBCollectionImpl.java:84) पर com.mongodb.DB पर । आदेश (DB.java:320) com.mongodb.DB.command (DB.java:299) पर com.mongodb.DB.command (DB.java:388) पर com.mongodb.DBApiLayer.getCollectionNames पर (DBApiLayer.java:152)

+0

मुझे मोंगोडीबी के बारे में कुछ भी पता नहीं है, लेकिन उस त्रुटि संदेश का अर्थ है कि जीएसएसएपीआई सोचता है कि आप केर्बेरोज प्रोटोकॉल का उपयोग करना चाहते हैं - क्या यह सच है? यदि हां, तो क्या आपने GSSAPI को Kerberos सर्वर से संपर्क करने का तरीका बताया है? और * (ए) * जहां मौजूदा केर्बेरोज टिकट कैश किया गया है, या * (बी) * पासवर्ड कैसे ढूंढें और फ्लाई पर टिकट कैसे बनाएं? वैसे, यदि आप सूर्य/ओरेकल जेवीएम का उपयोग करते हैं, तो क्या आपने AES256 एन्क्रिप्शन को सक्षम करने के लिए "असीमित ताकत क्रिप्टो" नीति JARs डाउनलोड की है? –

+0

हां, मैं केर्बेरोज प्रोटोकॉल का उपयोग करना चाहता हूं। मैंने दो सिस्टम पर्यावरण वैरिएबल सेट किए हैं 1. केआरबी 5_CONFIG = krb5.conf 2.KRB5_KTNAME = username.keytab यह मैंने कॉन्फ़िगरेशन परिप्रेक्ष्य के लिए किया है। मैं जावा वेब एप्लिकेशन से इस mongodb सर्वर तक पहुंच रहा हूँ। आशा है कि मैं आपके प्रश्नों का उत्तर प्रदान कर पाऊंगा। –

+0

Kerstos conf (अच्छी तरह से, कुछ विवरण) को सेट करने के गंदे विवरण के लिए http://stackoverflow.com/questions/21375372/accessing-hive-metastore-using-jdbc-with-kerberos-keytab पर एक नज़र डालें (अच्छी तरह से, कुछ विवरण) –

उत्तर

7

उन लोगों के लिए लाखों धन्यवाद जिन्होंने जवाब दिया है और मेरे प्रश्न पर एक नज़र डालें।

कुछ सिस्टम गुण और एक नई conf फ़ाइल जोड़ने के बाद, अंततः मैं MongoDB सर्वर से कनेक्ट होने में सक्षम हूं। इसके साथ अद्यतन कोड -

नीचे की तरह
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(); 
    } 

मेरे krb5.conf फ़ाइल देखो -

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

मेरे जीएसएस-jaas.conf नीचे की तरह लग रहे -

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

कोड मैं पोस्ट किया है है मेरे लिए काम करना उम्मीद है कि यह दूसरों के लिए काम करेगा।

1

इस पोस्ट को कुछ जानकारी पहले से ही बेहद उपयोगी के रूप में जोड़ना है।

Sasl/createSaslClientSubject:doAs विधि कि LoginContext से लिया गया है में चलने नहीं है, तो साख krb5.conf फ़ाइल से उठाया नहीं किया जाएगा। मैं।e GSS कोड विषय के लिए वर्तमान थ्रेड के सुरक्षा प्रबंधक को देखता है जो Subject:doAs विधि के माध्यम से पंजीकृत है, और उसके बाद इस विषय से प्रमाण-पत्र का उपयोग करता है। यह Subjectjaas जो बारी में सही jaas और krb5.conf साख पढ़ें के माध्यम से प्राप्त करना चाहिए किया गया है, लेकिन अगर आप Subject:doAs विधि के अंदर sasl और saslclient तरीकों नहीं चला यह सब फर्क नहीं पड़ता।

आपको इसके चारों ओर javax.security.auth.useSubjectCredsOnly=false की स्थापना जिसका मतलब है कि अगर कोई साख पाया जा सकता है, JAAS फाइल में कुछ डिफ़ॉल्ट नाम एक com.sun.security.jgss.initiate है यह देखने के लिए http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/jgss/LoginConfigImpl.java#92 खोज की जाएगी, द्वारा प्राप्त कर सकते हैं।

जैसे `` ` com.sun.security.jgss.initiate { com.sun.security.auth.module.Krb5LoginModule आवश्यक doNotPrompt = सच useTicketCache = सच useKeyTab = सच keyTab =" mykeytab " प्रिंसिपल =" सेवा/मेजबान @ REALM "; };

`` `

0

मैं एक ही त्रुटि" तंत्र का स्तर: किसी भी करबरोस TGT को ढूंढने में विफल "सामना करना पड़ा। मेरी समस्या आपके से अलग दिखती है, लेकिन यह एक ही त्रुटि के साथ अन्य लोगों के लिए उपयोगी हो सकती है।

मेरे मामले में यह मेरी कॉन्फ़िगरेशन फ़ाइलों में से किसी एक में मूल नाम लिखने में त्रुटि के कारण हुआ था।

मैं Jaas LoginManager कॉन्फ़िगरेशन फ़ाइल (java.security.auth.login.config के साथ प्रदान किया गया) और प्रिंसिपल के लिए नीति फ़ाइलों की जांच करने का सुझाव देता हूं। विशिष्ट त्रुटि लोअरकेस में डोमेन नाम है: [email protected]

के बजाय [email protected] यदि आप प्रोग्रामेटिक रूप से प्रिंसिपल को सेट/संदर्भित करते हैं, तो आप अपने कोड में प्रिंसिपल नेम शुद्धता भी देख सकते हैं। सम्मान

संबंधित मुद्दे

 संबंधित मुद्दे