首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Kerberos身份验证主体的java 11错误- KRB_CRED未正确生成

带有Kerberos身份验证主体的java 11错误- KRB_CRED未正确生成
EN

Stack Overflow用户
提问于 2021-12-12 20:09:45
回答 2查看 4.6K关注 0票数 7
代码语言:javascript
复制
java.sql.SQLRecoverableException: IO Error: The service in process is not supported. Operation unavailable (Mechanism level: KRB_CRED not generated correctly.)

当我的HikariDataSource试图通过使用oracle作为身份验证手段与oracle数据库建立连接时,我就会得到这个异常。

我确信这个问题与我的原则不被接受有关,尽管我的凭证缓存文件对我的其他java 8项目非常好。

我认为主体存在问题的原因是,我在服务器上生成了一个单独的凭证缓存文件,该文件使用的主体与本地使用的主体不同。当该凭证缓存文件在本地用于此java 11项目时,我的服务器上的凭证缓存文件运行得非常好。但是,我不能用该主体在本地生成凭据缓存文件。

另外,我使用的是同一个krb5.conf文件,所以我不明白我的主体是如何被一个服务所接受的,而不是另一个.我还确保在执行以下命令时使用kinit.exe文件的kinit.exe版本,不过,我认为这并不重要。

代码语言:javascript
复制
$kinit -c credential_cache_file instance@domain.realm

使用其他标志(如-A -p -f )也会给出一个单独的错误,但该类型的凭据缓存文件对任何java 8java 11服务都不起作用。

代码语言:javascript
复制
java.nio.BufferOverflowException: null

编辑:我实际上得到的最低级别错误是这样的。

代码语言:javascript
复制
Caused by: sun.security.krb5.KrbException: Invalid option in ticket request. (101)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-03 20:38:14

实际上,更多的信息和堆栈跟踪将有助于调试该问题。根据上面提供的资料,

kerberos credential中存在不匹配时,就会发生此credential。然后发生GSSException,并生成此消息。

代码语言:javascript
复制
Operation unavailable (Mechanism level: KRB_CRED not generated correctly.)

码流

步骤1:此消息是Krb5Context类的一部分。这里,InquireTypeKRB5_GET_KRB_CRED,这意味着它是一个属性类型,用于检索启动器将要发送给接收方的KRB_CRED消息。

链接:Krb5Context InquireType

代码语言:javascript
复制
try {
     byte[] krbCred = new KrbCred(tgt, serviceCreds, key).getMessage();
      return new KerberosCredMessage( sender, recipient, krbCred);
    } catch (KrbException | IOException e) {
       GSSException gsse = new GSSException(GSSException.UNAVAILABLE, -1,
                            "KRB_CRED not generated correctly.");
        gsse.initCause(e);
        throw gsse;
   }

步骤2:然后调用KrbCred类,这里的验证失败。这个类封装了客户端用来向服务器发送其委托凭据的KRB-CRED消息。在条件检查中,服务票证的客户端与票证授予中的客户端不匹配。所以,正如你提到的,在我看来,这是一个主要问题。链接:KrbCred

代码语言:javascript
复制
PrincipalName client = tgt.getClient();
PrincipalName tgService = tgt.getServer();
if (!serviceTicket.getClient().equals(client))
    throw new KrbException(Krb5.KRB_ERR_GENERIC,

步骤3:首先抛出KrbException,然后由catch块捕获它,然后以Operation unavailable的形式抛回GSSException。中继线:普通GSSException

在Java 8和Java 11之间的变化

kerberosJava 11中有很多变化。你可以在变化量g中找到它。例如。

与Java 11的InquireType相比,Java8的Krb5Context中的Krb5Context更少。

可能的解决方案

您正在使用的Kerberos客户端目前可能不支持配置文件(krb5.conf)中的'canonicalize'设置。因此,无法自定义名称规范化行为。如果TGTfalse,客户端将在每个false请求中要求对其提供支持,并且KDC服务可能会更改客户端名称。

JDK 11: JDK实现现在支持canonicalize文件中的“krb5.conf”标志。当设置为真的时候。新的默认行为不同于以前的版本,在TGT请求中,客户总是向KDC服务请求名称规范化(前提是没有使用sun.security.krb5.disableReferrals系统或安全属性显式禁用对RFC 6806的支持)

这个问题也出现在很少的小型Java 8版本(1.8.0_242)中。您可以尝试使用票证中的示例来复制。JDK-8239385

更多信息JDK-8244465

默认情况下,跨领域推荐支持是启用的,而5是允许的最大推荐跳数。若要关闭它,请将sun.security.krb5.disableReferrals安全性或系统属性设置为false。若要配置自定义的最大推荐跳数,请将sun.security.krb5.maxReferrals安全性或系统属性设置为任意正值。

您可以尝试更改JAAS配置,以便在使用kinit预先创建的票证缓存中使用票证。

您也可以尝试升级java版本。

从评论部分的讨论中更新

代码语言:javascript
复制
by: sun.security.krb5.KrbException: Invalid option in ticket request. (101)

这可以链接到krb5.conf中的proxiable=true。删除值有助于解决问题。

代码语言:javascript
复制
Kerberos authentication fails with “java.nio.BufferOverflowException"

此问题可能与JDBC驱动程序有关。当前版本可能不支持该操作。升级或降级oracle jdbc driver可能会导致解决方案。

票数 4
EN

Stack Overflow用户

发布于 2022-10-31 15:10:11

我使用Java 11/ojdbc10.jar接收到了这个错误,考虑到所接受的答案是需要从Java 8升级到11,这让我很困惑。我在那里尝试了所有建议的解决方案,但最终解决了错误并允许我的应用程序连接的是kinit -f而不是kinit

贷给http://jiggermast.blogspot.com/2014/06/kerberos-invalid-option-setting-in.html

相关部分:

然而,在尝试访问web应用程序之前,登录模块尝试转到KDC (同样是ApacheDS)获得一张票证;然而,在它到达之前,会抛出一个KrbException (参见下文)。

代码语言:javascript
复制
Found ticket for wmmnpr@EXAMPLE.COM to go to 
krbtgt/EXAMPLE.COM@EXAMPLE.COM 
expiring on Wed Jun 04 10:03:36 CEST 2014
Entered Krb5Context.initSecContext with state=STATE_NEW
Service ticket not found in the subject
Credentials acquireServiceCreds: same realm
KrbException: Invalid option setting in ticket request. (101)
 at sun.security.krb5.KrbTgsReq.<init>(KrbTgsReq.java:98) 
 at sun.security.krb5.KrbTgsReq.<init>(KrbTgsReq.java:62)

在查看了第98行的sun.security.krb5.KrbTgsReq代码之后,我突然意识到是“转发”选项造成了问题。然后使用-f运行kinit,如下所示:

代码语言:javascript
复制
kinit.exe -f wmmnpr@EXAMPLE.COM
Password for wmmnpr@EXAMPLE.COM:
New ticket is stored in cache file C:\Users\wnpr\krb5cc_wnpr
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70327291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档