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版本,不过,我认为这并不重要。
$kinit -c credential_cache_file instance@domain.realm使用其他标志(如-A -p -f )也会给出一个单独的错误,但该类型的凭据缓存文件对任何java 8或java 11服务都不起作用。
java.nio.BufferOverflowException: null编辑:我实际上得到的最低级别错误是这样的。
Caused by: sun.security.krb5.KrbException: Invalid option in ticket request. (101)发布于 2022-02-03 20:38:14
实际上,更多的信息和堆栈跟踪将有助于调试该问题。根据上面提供的资料,
当kerberos credential中存在不匹配时,就会发生此credential。然后发生GSSException,并生成此消息。
Operation unavailable (Mechanism level: KRB_CRED not generated correctly.)码流
步骤1:此消息是Krb5Context类的一部分。这里,InquireType是KRB5_GET_KRB_CRED,这意味着它是一个属性类型,用于检索启动器将要发送给接收方的KRB_CRED消息。
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
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之间的变化
kerberos在Java 11中有很多变化。你可以在变化量g中找到它。例如。
与Java 11的InquireType相比,Java8的Krb5Context中的Krb5Context更少。
可能的解决方案
您正在使用的Kerberos客户端目前可能不支持配置文件(krb5.conf)中的'canonicalize'设置。因此,无法自定义名称规范化行为。如果TGT是false,客户端将在每个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版本。
从评论部分的讨论中更新
by: sun.security.krb5.KrbException: Invalid option in ticket request. (101)这可以链接到krb5.conf中的proxiable=true。删除值有助于解决问题。
Kerberos authentication fails with “java.nio.BufferOverflowException"此问题可能与JDBC驱动程序有关。当前版本可能不支持该操作。升级或降级oracle jdbc driver可能会导致解决方案。
发布于 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 (参见下文)。
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,如下所示:
kinit.exe -f wmmnpr@EXAMPLE.COM
Password for wmmnpr@EXAMPLE.COM:
New ticket is stored in cache file C:\Users\wnpr\krb5cc_wnprhttps://stackoverflow.com/questions/70327291
复制相似问题