GSSException: не предоставлены действительные учетные данные (уровень механизма: не удалось найти любой Kerberos tgt)

Я очень новичок в конфигурации MOngoDB + Java. Я пытаюсь установить соединение с удаленным сервером mongodb из приложения Java. Я хочу использовать механизм GSSAPI для связи с 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 Kerberos) в sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147) в sun.security.jgss.krb5.Krb5MactFactoryFactoryFactoryFactory (.java:122) в sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:193) в sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:427) в sun.securitylmpdenSredenSredenSredenSjst.java:62) at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:154) в com.mongodb.DBPort$GSSAPIAuthenticator.getGSSCredential(DBPort.java:622SS) в com.mongodb.Client DBPort.java:593) на com.mongodb.DBPort$SaslAuthenticator.authenticate(DBPort.java:895) на com.mongodb.DBPort.authenticate(DBPort.java:432) на com.mongodb.DBPort.checkAuth(DBPort.java:443) на com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:289) на com.mongodb.DBTCPConnector.call(DBTCPConnector.java:269) на 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) на com.mongodb.DBApiLayer.getCollectionNames(DBApiLayer.java:152)

3 ответа

Большое спасибо всем, кто откликнулся и взглянул на мой вопрос.

После добавления некоторых системных свойств и нового файла конфигурации, наконец, я могу подключиться к серверу 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/createSaslClient не работает в пределах Subject:doAs метод, который извлекается из LoginContextучетные данные не будут получены из krb5.conf файл. То есть GSS код смотрит на менеджер безопасности текущего потока для субъекта, который зарегистрирован через Subject:doAs метод, а затем использует учетные данные из этой темы. это Subject должен был быть получен через jaas который в свою очередь будет читать правильный jaas а также krb5.conf учетные данные, но если вы не запускаете sasl а также saslclient методы внутри Subject:doAs метод все это не имеет значения.

Вы можете обойти это, установив javax.security.auth.useSubjectCredsOnly=false Это означает, что, если учетные данные не могут быть найдены, некоторые имена по умолчанию в файле jaas будут искать, см. 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.jgss.initiate{ com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=true useTicketCache=true useKeyTab=true keyTab="mykeytab"Principal =" service / host @ REALM "; };

`` `

Я столкнулся с той же ошибкой "Уровень механизма: не удалось найти какой-либо Kerberos tgt". Моя проблема выглядит не так, как ваша, но может быть полезна другим с такой же ошибкой.

В моем случае это было вызвано ошибкой записи имени участника в один из моих файлов конфигурации.

Я предлагаю проверить файл конфигурации Jaas LoginManager (поставляется с java.security.auth.login.config) и файлы политики для принципалов. Типичная ошибка - доменное имя в нижнем регистре: gino@authdemo.it вместо gino@AUTHDEMO.IT

В случае, если вы устанавливаете / ссылаетесь на принципала программным способом, вы также можете проверить правильность имени субъекта в своем коде. С уважением

Другие вопросы по тегам