Kerberos 认证 javax.security.auth.logon.LoginException:拒绝链接 (Connection refused)

kerberos 服务重启之后异常

项目中用到了hive 和hdfs ,权限认证使用了Kerberos,因为机房异常,导致了Kerberos 服务重启,结果发现本来运行正常的应用服务hive 和hdfs 认证失败,报错信息是

典型的网络连接异常

排查思路

验证Kerberos 服务

首先想到Kerberos服务异常,防火墙拦截。通过hdfs 命令发现 Kerberos 服务正常。

后边自己写了一个hive 链接测试应用,发现同一台机器上可以正常验证通过访问hive。

排查为什么拒绝链接

应用本身上线有一段时间,期间未发生这种报错,所以思路集中在配置文件,服务器hosts配置方向,后边通过自己的测试服务 正常链接排除的环境因素那么就是程序本身问题,奇怪的点事本身服务运行正常,突然报异常了。

这个就有点奇怪,之后对比了代码发现

Kerberos 配置写法导致

正确的写法

java 复制代码
   try {
            Class.forName(JDBC_DRIVER);
 

            //登录Kerberos账号
            String keytabPath = "/opt/data/kerberos/" + keytab;

            Configuration configuration = new Configuration();
            configuration.set("hadoop.security.authentication", "Kerberos");
            configuration.set("java.security.krb5.conf", "/opt/data/kerberos/krb5.conf");
            UserGroupInformation.setConfiguration(configuration);

            UserGroupInformation.loginUserFromKeytab(krbUser, keytabPath);
            System.out.println("Kerberos 验证通过");

            Connection connection = null;
            ResultSet rs = null;
            PreparedStatement ps = null;
            try {
                connection = DriverManager.getConnection(CONNECTION_URL);
                ps = connection.prepareStatement("select * from ods_inc.k02_city");
                rs = ps.executeQuery();
                while (rs.next()) {
                    System.out.println(rs.getString(1));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
            return "exception";
        }
        return "finish";

    }

产生异常的写法

java 复制代码
try {
            log.debug(keyTabPath);
            log.debug(confPath);
            //设置krb配置文件路径,注意一定要放在Configuration前面,不然不生效
            System.setProperty("java.security.krb5.conf", confPath);
            Configuration conf = new Configuration();
            //设置认证模式Kerberos
            conf.set("hadoop.security.authentication", "Kerberos");
            UserGroupInformation.setConfiguration(conf);
            //设置认证用户和krb认证文件路径
            UserGroupInformation.loginUserFromKeytab(krbUser, keyTabPath);
            log.info("Kerberos 验证成功");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("Kerberos 验证失败", e);
            throw new PluginException("Kerberos 验证失败", e);
        }

关键点是

System.setProperty("java.security.krb5.conf", confPath);

这个配置文件在Kerberos 服务重启之后不生效了。

至于为什么不生效,欢迎高手一起研究交流。

总结

Kerberos 服务认证 内嵌在jdk中,某些jdk版本会导致Kerberos 认证异常,Kerberos 认证抛出的异常信息不足,很多时候排查问题比较耗费时间甄别,这种突然爆出的异常 应该和程序初始化有关系,或者Kerberos 服务重启之后的某些因素影响。

问题比较罕见,如果应用服务中环境可以通过防火墙策略配置,不建议使用Kerberos 认真大数据组件。

相关推荐
代码羊羊18 分钟前
Rust 迭代器完全通俗易懂指南(零基础全覆盖)
java·开发语言·rust
MY_TEUCK7 小时前
【Java 后端】SpringBoot 登录认证与会话跟踪实战(JWT + Filter/Interceptor)
java·开发语言·spring boot
今天长肉了吗8 小时前
银行风控项目踩坑实录:指标跑了6小时,风险评分全挂了
java
随读手机8 小时前
多式联运信息交互平台完整方案(2026版)
java·ai·eclipse·云计算·区块链
许彰午9 小时前
03-二叉树——从递归遍历到非递归实现
java·算法
nj01289 小时前
Spring 循环依赖详解:三级缓存、早期引用、AOP 代理与懒加载
java·spring·缓存
野生技术架构师9 小时前
2026年最全Java面试题及答案汇总(建议收藏,面试前看这篇就够了)
java·开发语言·面试
Agentic AI人工智能与大数据10 小时前
数据产品运营指南:如何提升用户活跃度?这4个策略让数据产品不再“沉睡”
大数据·ai·产品运营
一只叫煤球的猫10 小时前
ThreadForge 源码解读一:ThreadScope 如何把并发任务放进清晰边界?
java·面试·开源
洛_尘10 小时前
Python 5:使用库
java·前端·python