Java GSSException:未提供有效凭据(机制级别:找不到任何Kerberos tgt)

Java GSSException:未提供有效凭据(机制级别:找不到任何Kerberos tgt),java,spring,mongodb,spring-mvc,spring-security-kerberos,Java,Spring,Mongodb,Spring Mvc,Spring Security Kerberos,我对MOngoDB+Java配置非常陌生。我正在尝试从Java应用程序实现远程mongodb服务器的连接。我想使用GSSAPI机制连接mongotemplate。以下代码已成功执行。下面的代码来自我的配置文件 List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>(); ServerAddress address = new ServerAddress(host, port);

我对MOngoDB+Java配置非常陌生。我正在尝试从Java应用程序实现远程mongodb服务器的连接。我想使用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);
List serverAddresses=new ArrayList();
服务器地址=新服务器地址(主机、端口);
serverAddresses.add(地址);
列表凭据=新建ArrayList();
MongoCredential凭证=MongoCredential.createGSSAPICredential(用户名);
凭证.withMechanismProperty(“服务名称”,gssapiServiceName);
credential.withMechanismProperty(“规范化主机名”,true);
凭证。添加(凭证);
返回新的MongoClient(服务器地址、凭据);
但当我试图执行下面的代码时,我得到了异常

DB db = mongoTemplate.getDb();
Set<String> dbCollections1 = db.getCollectionNames();
DB=mongoTemplate.getDb();
Set dbCollections1=db.getCollectionNames();
例外情况:

GSSException:未提供有效凭据(机制级别:找不到任何Kerberos tgt) 位于sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147) 位于sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.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.DBPort$GSSAPIAuthenticator.createSaslClient(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.dbapileyer.getCollectionNames(dbapileyer.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();
    }

我发布的代码对我有用。希望这对其他人有用。

在这篇文章中添加一些信息,因为它已经非常有用了

如果
Sasl/createSaslClient
未在
Subject:doAs
方法中运行 从
LoginContext
中检索的凭据,将不会从
krb5.conf
文件中获取凭据。也就是说,
GSS
代码查看通过
Subject:doAs
方法注册的主题的当前线程的安全管理器,然后使用来自该主题的凭据。这个
Subject
应该是通过
jaas
获得的,jaas会读取正确的
jaas
krb5.conf
凭证,但是如果您没有在
Subject:doAs
方法中运行
sasl
saslclient
方法,所有这些都不重要

您可以通过设置
javax.security.auth.useSubjectCredsOnly=false来绕过它,这意味着如果找不到凭据,将在jaas文件中搜索一些默认名称,一个是
com.sun.security.jgss.initiate

e、 g

我遇到了相同的错误“机制级别:找不到任何Kerberos tgt”。我的问题看起来和你的不同,但它可能对其他有相同错误的人有用

在我的例子中,这是由于在我的一个配置文件中写入主体名称时出错造成的

我建议检查主体的Jaas LoginManager配置文件(随java.security.auth.login.config提供)和策略文件。典型错误为小写域名:gino@authdemo.it而不是gino@AUTHDEMO.IT

在以编程方式设置/引用主体的情况下,还可以检查代码中主体名称的正确性。
关于MongoDB,我什么都不知道,但那个错误消息意味着GSSAPI认为您想要使用Kerberos协议——这是真的吗?如果是,您是否提供了配置来告诉GSSAPI如何联系Kerberos服务器?以及(a)缓存现有Kerberos票证的位置,或者(b)如何查找密码并动态创建票证?顺便问一下,如果您使用Sun/Oracle JVM,是否下载了“无限强度加密”策略JAR以启用AES256加密?是的,我想使用Kerberos协议。我已经设置了两个系统环境变量1。KRB5_CONFIG=KRB5.conf 2.KRB5_KTNAME=username.keytab这就是我在配置透视图中所做的。我正在从Java web应用程序访问这个mongodb服务器。希望我能够回答您的问题。请查看有关设置Kerberos配置的详细信息(好的,一些详细信息)以及用于解决配置问题的有用跟踪标志:
-Djava.security.debug=gssloginconconfig、configfile、configparser、logincontext
[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
}
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;};
com.sun.security.jgss.initiate{
   com.sun.security.auth.module.Krb5LoginModule required
   doNotPrompt=true
   useTicketCache=true
   useKeyTab=true
   keyTab="mykeytab"
   principal="service/host@REALM";
 };