千家信息网

Kerberos环境下Java应用程序认证超时异常是怎么回事

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关Kerberos环境下Java应用程序认证超时异常是怎么回事的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。测试环境1.CM和CDH版本为5.15.
千家信息网最后更新 2026年11月03日Kerberos环境下Java应用程序认证超时异常是怎么回事

这篇文章给大家分享的是有关Kerberos环境下Java应用程序认证超时异常是怎么回事的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

测试环境

1.CM和CDH版本为5.15.1

2.操作系统版本为RedHat7.2

3.集群已启用Kerberos

问题描述

在使用JDK 8时,在Kerberos环境下应用程序在执行的过程中报以下错误:

Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]


问题分析

在Kerberos环境下长时间运行的作业会出现认证失败问题,认证失败是由于Ticket过期导致。Ticket过期是由ticket_lifetime和renew_lifetime两个参数控制,具体分析如下:

先了解下krb5.conf里ticket_lifetime和renew_lifetime参数:

ticket_lifetime = 24h
renew_lifetime = 7d

注:这里其实还跟kdc.conf里的ticket_lifetime和renew_lifetime相关,本文不做讨论,假设你配置都是一致的。

每一个Kerberos的ticket,包括TGT,都有一个ticket_lifetime(默认:1天);Ticket可以被延续,但最多只能延续到renew_lifetime(默认:7天),超过7天后无法再延续,此时ticket失效,只能重新login。

如果你的应用程序需要运行很长时间或者需要持续不断地一直运行,就会有一个问题,即:

在应用程序启动时进行Kerberos认证登录后,是否还需要定时renew ticket或在ticket期满失效后使用keytab重新login?例如,是否需要在应用程序代码里,在每个UGI.doAS(...)前调用UGI.checkTGTAndReloginFromKeytab或者使用一个Timer周期性地调用UGI.checkTGTAndReloginFromKeytab?

关于这个问题,首先需要了解在Hadoop系统里是如何进行Kerberos认证的:

Hadoop Kerberos认证的主要使用场景是Hadoop RPC框架(使用SASL进行kerberos认证)。大部分Hadoop daemon进程在启动时会调用UGI(org.apache.hadoop.security.UserGroupInformation),UGI.loginUserFromKeytab做kerberos认证并获取ticket,并在后续每一次RPC调用时使用该ticket认证。比如,DataNode必须认证它对NameNode的RPC调用,NodeManager也必须认证它对ResourceManager的RPC调用。那么,这些daemon进程为什么能在启动后长时间持续运行而不会出现kerberos ticket错误呢(甚至已经超过了renew_lifetime)?这是因为Hadoop在RPC Client层实现了一种自动relogin机制。在Client.handleSaslConnectionFailure(org.apache.hadoop.ipc.Client)方法里有如下代码:

      // try re-login
if (UserGroupInformation.isLoginKeytabBased()) {
UserGroupInformation.getLoginUser().reloginFromKeytab();
} else if (UserGroupInformation.isLoginTicketBased()) {
UserGroupInformation.getLoginUser().reloginFromTicketCache();
}

上述代码说明在使用RPC连接时,如果因为ticket失效造成认证失败,会自动relogin。

基于以上认识,可以得出以下结论:

1.如果应用程序的使用模式是从keytab登录后执行典型的Hadoop RPC Java调用(如调用HDFS FileSystem API),那么是不需要在应用层增加renew ticket或relogin代码的,因为RPC Client层已经帮你实现了。

2.如果应用程序的使用模式是不使用Hadoop RPC,而是调用HDFS REST API或YARN REST API(使用SPNEGO进行kerberos认证),那么需要在应用程序里增加relogin代码。具体实现方式是:

Java方式:主Java程序使用keytab调用UGI.loginUserFromKeytab登录,然后在每个UGI.doAS前调用UGI.checkTGTAndReloginFromKeytab方法,或者另启动一个线程周期性调用该方法。

Shell方式:主程序使用kinit登录,然后启动另一个子进程周期性的调用kinit -R去renew ticket或者调用kinit -kt去relogin。

需要注意的是当使用JDK 8时,UGI的relogin存在一个bug,即HADOOP-10786。该bug是因为JDK 8的Krb5LoginModule有些小改动,这些改动会造成UGI的relogin代码认为之前的登录并不是基于keytab登录的。所以,UGI.reloginFromKeytab和UGI.checkTGTAndReloginFromKeytab方法实际上什么都没有做,并没有执行relogin。所以,此时应用程序仍然会报以下错误:

Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

解决办法

对于使用JDK 8应用程序不能正常reloginFromKeytab的 bug,workaround是:

1. 使用JDK 7而不是JDK 8,或者

2. 确保hadoop-common包含了HADOOP-10786补丁。

建议使用CDH5.13.0或者以上版本的包,这些包已经包括了该补丁。如果仍然在IDE开发环境出现了以上问题,可以检查一下IDE依赖的hadoop-common包的版本是否有问题。

感谢各位的阅读!关于"Kerberos环境下Java应用程序认证超时异常是怎么回事"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

认证 程序 应用 应用程序 问题 环境 代码 登录 方法 版本 运行 周期 周期性 方式 进程 错误 长时 回事 内容 参数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 广州淘业互联网络科技 科技互联网产品 A股互联网金融科技公司 今日互联网科技 涨乐互联网科技 港股互联网科技股 智网互联网科技 互联网科技博客 深圳卡尔迅互联网科技有限公司怎么样 恒生科技互联网指数分析 互联网科技公司的市场部门 银川新华互联网科技学校地址 开启互联网科技时代小说 玖二柒互联网科技公司待遇 互联网科技实习生岗位职责 米聚互联网科技南京有限公司排面 本届互联网博览会上的黑科技 上海乐五互联网科技有限公司 互联网科技企业文化 青岛互联网科技公司 汇久创客互联网科技 奔汉互联网科技 互联网科技股午盘股票涨跌 互联网科技有哪些公司 企晟互联网信息科技有限公司 南通创西澳互联网科技有限公司 深圳无忧互联网科技 上海创道互联网络科技有限公司 科技互联网专业工作会议发言稿
0