web-dev-qa-db-ja.com

GSSException:有効な資格情報が提供されていません(メカニズムレベル:Kerberos tgtが見つかりませんでした)

私はMOngoDBに非常に新しい+ Java構成。Javaアプリケーション。以下のコードは正常に実行されています。以下のコードは私の構成ファイルからのものです。

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:Sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.Java:147)のSun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactoryで有効な資格情報が提供されていません(メカニズムレベル:Kerberos tgtの検索に失敗しました) .Java:122)Sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.Java:193)at Sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.Java:427)at Sun.security.jgss.GSSCredentialImpl。(GSSCredentialImpl。 .Java:62)Sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.Java:154)at com.mongodb.DBPort $ GSSAPIAuthenticator.getGSSCredential(DBPort.Java:622)at com.mongodb.DBPort $ GSSAPIAuthenticator.createSaslClient( DBPort.Java:593)com.mongodb.DBPort $ SaslAuthenticator.authenticate(DBPort.Java:895)at com.mongodb.DBPort.authenticate(DBPort.Java:432)at com.mongodb.DBPort.checkAuth(DBPort.Java :443)com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.Java:289)at com.mongodb.DBTCPConnector.call(DBTCPConn ector.Java:269)com.mongodb.DBCollectionImpl.find(DBCollectionImpl.Java:84)at com.mongodb.DB.command(DB.Java:320)at com.mongodb.DB.command(DB.Java:299) )com.mongodb.DB.command(DB.Java:388)at com.mongodb.DBApiLayer.getCollectionNames(DBApiLayer.Java:152)

私の質問に答えて見てくれたすべての人に感謝します。

いくつかのシステムプロパティと新しい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="my-account@MY_REALM"
doNotPrompt=true
keyTab="path-to-my-keytab-file"
debug=true;};

私が投稿したコードは私のために働いています。これが他の人にも役立つことを願っています。

すでに非常に有用であるため、この投稿にいくつかの情報を追加しています。

Sasl/createSaslClientLoginContextから取得されるSubject:doAsメソッド内で実行されない場合、資格情報はkrb5.confファイルから取得されません。つまり、GSSコードは、Subject:doAsメソッドを介して登録されているサブジェクトの現在のスレッドのセキュリティマネージャーを調べ、このサブジェクトの資格情報を使用します。このSubjectjaasから取得する必要があります。これは正しいjaasおよびkrb5.conf資格情報を読み取りますが、saslを実行しない場合、 Subject:doAsメソッド内のsaslclientメソッドこれらはすべて重要ではありません。

javax.security.auth.useSubjectCredsOnly=falseを設定することで回避できます。クレデンシャルが見つからない場合、jaasファイルのデフォルト名の一部が検索されます LoginConfigImpl.Java#92 、1つはcom.Sun.security.jgss.initiate

例えば

com.Sun.security.jgss.initiate{
   com.Sun.security.auth.module.Krb5LoginModule required
   doNotPrompt=true
   useTicketCache=true
   useKeyTab=true
   keyTab="mykeytab"
   principal="service/Host@REALM";
 };
2
gerritjvv

「メカニズムレベル:Kerberos tgtの検索に失敗しました」という同じエラーが発生しました。私の問題はあなたのものとは異なって見えますが、同じエラーを抱えている他の人にとっては役に立つかもしれません。

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

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

プログラムでプリンシパルを設定/参照する場合は、コードでプリンシパル名の正確さを確認することもできます。よろしく

1
Fabiano Tarlao