2015-11-20 12 views
7

MOngoDB + Javaの設定が新しくなりました。私はJavaアプリケーションからリモートmongodbサーバーからの接続を達成しようとしています。 mongotemplateとの接続にGSSAPIメカニズムを使用したい。以下のコードは正常に実行されています。以下のコードは私の設定ファイルのものです。GSSException:有効な資格情報が提供されていません(メカニズムレベル:Kerberos tgtを見つけることができませんでした)

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:ありません有効な認証情報(メカニズムレベル:Kerberos TGTが見つかりませんでした) at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147) at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb sun.security.jgssでsun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:427) でsun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:193) で5MechFactory.java:122) 。 GSSCredentialImpl。(GSSCredentialImpl.java:62) sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:154) でcom.mongodbでcom.mongodb.DBPort $ GSSAPIAuthenticator.getGSSCredential(DBPort.java:622) で.DBPort $ GSSAPIAuthenticator.createSaslClient(DBPort.java:593) at com.mongodb.DBPort $ SaslAuthenticator.authenticate(DBPort.java:895) at com.mongodb.DBPort.authenticate(DBPort.java:432) at com .mongodb.DBPort.checkAuth(DBPort.java:443) at com.mongodb.DBTCPConnec 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) at com.mongodb.DB.command(DB.java:299) at com.mongodb.DB.command(DB.java:388) at com.mongodb.DBApiLayer.getCollectionNames DBApiLayer.java:152)

+0

私はMongoDBについて何も知らないけど、そのエラーメッセージはGSSAPIがあなたにKerberosプロトコルを使いたいと思っていることを意味します - 本当ですか?はいの場合は、GSSAPIにKerberosサーバへの接続方法を伝える設定を提供しましたか? *(a)*既存のKerberosチケットがキャッシュされる場所、または(b)*パスワードを見つけてその場でチケットを作成する方法は?ところで、Sun/Oracle JVMを使用する場合は、AES256暗号化を有効にするために「無制限暗号化」ポリシーJARをダウンロードしましたか? –

+0

はい、Kerberosプロトコルを使用します。私は2つのシステム環境変数1を設定しました。KRB5_CONFIG = krb5.conf 2.KRB5_KTNAME = username.keytabこれは設定の観点から行ったものです。私はJava Webアプリケーションからこのmongodbサーバーにアクセスしています。私はあなたの質問に答えてくれることを願っています。 –

+0

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

マイGSS-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/createSaslClientLoginContextから取得されSubject:doAs方法 内で実行されていない場合は、資格情報はkrb5.confファイルからピックアップされることはありません。私。e GSSコードSubject:doAsメソッドを介して登録された件名の現在のスレッドのセキュリティマネージャを見て、この件の資格情報を使用します。このSubjectjaasで取得されていて、正しいjaaskrb5.confの資格情報を読み込む必要がありますが、Subject:doAsメソッド内でsaslsaslclientのメソッドを実行しない場合はすべて問題ありません。

javax.security.auth.useSubjectCredsOnly=falseと設定すると回避できます。つまり、資格情報が見つからない場合は、http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/security/jgss/LoginConfigImpl.java#92、1つがcom.sun.security.jgss.initiate、jaasファイルのデフォルト名が検索されます。

例えば `` ` com.sun.security.jgss.initiate { のcom.sun.security.auth.module.Krb5LoginModuleが必要 doNotPrompt =真 useTicketCache =真 useKeyTab =真 KEYTAB =" mykeytab " プリンシパル="サービス/ホスト@ REALM "; };

`` `

0

私は同じエラー "メカニズムのレベルを:任意のKerberosのTGTを見つけることができませんでした" に直面しました。私の問題はあなたのものと違って見えますが、同じエラーの他のものには役に立ちます。

私の場合は、構成ファイルの1つにプリンシパル名を書き込む際にエラーが発生したためです。

私は、Jaas LoginManager構成ファイル(java.security.auth.login.configで提供)とプリンシパルのポリシーファイルを確認することをお勧めします。典型的なエラーは小文字のドメイン名です:[email protected]の代わりに[email protected]

プリンシパルをプログラムで設定または参照する場合は、コード内のプリンシパル名の正しさをチェックすることもできます。 よろしくお願いします。

関連する問題