JSch登录sftp时发现需要Kerberos身份验证

news2024/9/29 15:33:45

本问记录使用JSch登录sftps时遇到的Kerberos验证问题并记录了解决方法

项目场景:

项目开发中使用了SFTP,debug调试程序时发现了每次都需要手动输入 Kerberos的口令信息。这就很奇怪了难道每次连接SFTP时候都需要手动输入吗?

日志如下:

2023-06-26 17:26:00.125 [] [http-nio-11005-exec-1] WARN  o.g.j.s.ResourceModelConfigurator - Component of class interface cannot be instantiated and will be ignored.
Kerberos 用户名 [10001874]: 
10001874的 Kerberos 口令: 
2023-06-26 17:26:12.619 [] [http-nio-11005-exec-1] INFO  c.s.s.b.bank.util.impl.SftpUtil - 检测目录[/]
Kerberos 用户名 [10001874]: 10001874的 Kerberos 口令: 
2023-06-26 17:26:22.724 [] [http-nio-11005-exec-1] INFO  c.s.s.b.bank.util.impl.SftpUtil - 检测目录[/202306]
Kerberos 用户名 [10001874]: 10001874的 Kerberos 口令: 
2023-06-26 17:26:37.764 [] [http-nio-11005-exec-1] INFO  c.s.s.b.bank.util.impl.SftpUtil - 检测目录[/batchPhoneDestroyUser/202306]
2023-06-26 17:26:37.770 [] [http-nio-11005-exec-1] INFO  c.s.s.b.bank.util.impl.SftpUtil - Start to upload E:/202306/LN00_20230626_00010.txt to /202306
2023-06-26 17:26:37.773 [] [http-nio-11005-exec-1] INFO  c.s.s.b.bank.util.impl.SftpUtil - Start to upload E:/202306/LN00_20230626_00010.txt to /202306 success
2023-06-26 17:26:50.221 [] [http-nio-11005-exec-2] INFO  c.s.s.b.bank.util.impl.SftpUtil - 检测目录[/batchPhoneDestroyUser]
2023-06-26 17:26:50.225 [] [http-nio-11005-exec-2] INFO  c.s.s.b.bank.util.impl.SftpUtil - 检测目录[/batchPhoneDestroyUser/202306]
2023-06-26 17:26:50.228 [] [http-nio-11005-exec-2] INFO  c.s.s.b.bank.util.impl.SftpUtil - 检测目录[/batchPhoneDestroyUser/202306]
2023-06-26 17:26:50.233 [] [http-nio-11005-exec-2] INFO  c.s.s.b.bank.util.impl.SftpUtil - Start to upload E:/202306/LN00_20230626_00010.txt to /202306
2023-06-26 17:26:50.239 [] [http-nio-11005-exec-2] INFO  c.s.s.b.bank.util.impl.SftpUtil - Start to upload E:/202306/LN00_20230626_00010.txt to /202306 success

原因分析:

当提示输入Kerberos用户名和口令时,如果不输入用户名和口令,那么等一会就连接超时, 如果手工输入回车键,程序也能正常跑通。 从问题现象上看,使用JSch连接sftp时,自动做了kerberos认证。 

Kerberos认证协议:

Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。使用Kerberos时,一个客户端需要经过三个步骤来获取服务:

  • 认证:客户端向认证服务器发送一条报文,并获取一个含时间戳的Ticket-Granting Ticket(TGT)。

  • 授权:客户端使用TGT向Ticket-Granting Server(TGS)请求一个服务Ticket。

  • 服务请求:客户端向服务器出示服务Ticket,以证实自己的合法性。该服务器提供客户端所需服务,在Hadoop应用中,服务器可以是namenode或jobtracker。

从com.jcraft.jsch.Session 的connect方法我们可以了解到Session通过Jsch读取PreferredAuthentications的值, 然后将值通过逗号分割,然后处理认证

package com.jcraft.jsch;
public class Session implements Runnable{

  public String getConfig(String key){
    Object foo=null;
    if(config!=null){
      foo=config.get(key);
      if(foo instanceof String) return (String)foo;
    }
    //Session获取jsch 的config属性
    foo=jsch.getConfig(key);
    if(foo instanceof String) return (String)foo;
    return null;
  }

 public void connect(int connectTimeout) throws JSchException{

        //略
        //获取PreferredAuthentications配置属性
        //实际上这里是获取jsch 成员config的信息
        String cmethods=getConfig("PreferredAuthentications");
        
        //通过逗号分割字符串
        String[] cmethoda=Util.split(cmethods, ",");
        
        String smethods=null;
        if(!auth){
          smethods=((UserAuthNone)ua).getMethods();
          if(smethods!=null){
            smethods=smethods.toLowerCase();
          }
          else{
            // methods: publickey,password,keyboard-interactive
            //smethods="publickey,password,keyboard-interactive";
            smethods=cmethods;
          }
        }
        
        String[] smethoda=Util.split(smethods, ",");
        int methodi=0;
        
        //循环认证处理
        loop:
        while(true){
            while(!auth &&  cmethoda!=null && methodi<cmethoda.length){
                
            }
        }
    }
}

在查看com.jcraft.jsch.JSch中的getConfig方法实现会发现, PreferredAuthentications信息是存储在内部的一个HashTable表中默认值是"gssapi-with-mic,publickey,keyboard-interactive,password",之前了解到属性值会被逗号分割,然后处理。

package com.jcraft.jsch;
public class JSch{

      static java.util.Hashtable config=new java.util.Hashtable();
      static{
          //...
          config.put("PreferredAuthentications", "gssapi-with-mic,publickey,keyboard-interactive,password");
          //...
      }
      
      
      public static String getConfig(String key){ 
          synchronized(config){
            return (String)(config.get(key));
          } 
     }
  }

  • publickey:基于公共密钥的安全验证方式(public key authentication method),通过生成一组密钥(public key/private key)来实现用户的登录验证。

  • keyboard-interactive:基于键盘交互的验证方式(keyboard interactive authentication method),通过服务器向客户端发送提示信息,然后由客户端根据相应的信息通过手工输入的方式发还给服务器端。

  • password:基于口令的验证方式(password authentication method),通过输入用户名和密码的方式进行远程机器的登录验证。

  • gssapi-with-mic: (Generic Security Services Application Programming Interface with Message Integrity Check)是一种客户端/服务端应用程序编程接口,它提供了一种标准的身份验证机制和消息完整整保护机制, 它使用Kerberos票据进行身份验证,并使用数字签名的消息完整性进行保护,GSSAPI通常与Kerberos秘钥分分系统一起使用,这意味着用户只需使用一个Kerberos身份验证标识符就可以访问多个服务器

可见本问题是PreferredAuthentications默认配置了gssapi-with-mic引起的。 

gssapi-with-mic的身份验证流程

1.客户端通过用户名和口令在Kerberos服务器上获取票证

2.客户端将该票证联通自己的身份验证请求一起发送到服务器

3.服务器使用Kerberos秘钥分发系统来检查接收和拒绝请求

gssapi的数据完整性保护流程

1.客户端向服务器端发送数据

2.客户端使用加密算法对数据加密

3.客户端将哈希值(HMAC)追加到加密数据的末尾

4.服务器使用哈斯算法计算收到的数据和哈希值,然后将其和客户端发送的哈希值进行对比


解决方案:

使用JSch实现sftp连接时设置PreferredAuthentications属性,取消gssapi-with-mic支持后就不会再要求验证Kerberos 口令了

参考代码如下:

@Override
public ChannelSftp create() throws Exception {
    JSch jSch = new JSch();
    Session session = jSch.getSession(username, host, port);
    session.setPassword(password);
    session.setConfig("StrictHostKeyChecking", "no");
    //设置PreferredAuthentications 不使用gssapi-with-mic
    session.setConfig(
            "PreferredAuthentications",
            "publickey,keyboard-interactive,password");
    session.connect();

    ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
    channelSftp.connect();

    return channelSftp;
}

参考资料

  • java - Skipping Kerberos authentication prompts with JSch - Stack Overflow
  • publickey,gssapi-with-mic意思 - 百度文库

上一篇:如何使用SonarQube+ SonarScanner分析项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RPC核心原理详解

什么是RPC&#xff1f; RPC的全称是Remote Procedure Call&#xff0c;即远程过程调用。简单解读字面上的意思&#xff0c;远程肯定是指要跨机器而非本机&#xff0c;所以需要用到网络编程才能实现&#xff0c;但是不是只要通过网络通信访问到另一台机器的应用程序&#xff0c…

基于Dubbo分布式学校信息管理系统设计与实现

一、引言 1.1 课题背景 随着时代的发展与进步,计算机网络也随之日益完善,渐渐覆盖了我们生活的各个方面。在信息化和数字化的时代背景下,使用计算机管理学校信息来提升教育工作的质量和效率,是大势所趋,所以近年来,随着网络技术的不断发展,使用信息管理系统的学校越来…

云原生时代数据治理的变革与创新

随着数字化进程的深入&#xff0c;企业对数据的依赖日益加深&#xff0c;数据资源的重要性愈发凸显。如何管好、用好数据&#xff0c;做好数据治理工作&#xff0c;发挥数据资源价值&#xff0c;成为企业提质增效过程中的重要议题。 在本次直播中&#xff0c;我们介绍了数据治…

leetcode:191. 位1的个数

难度&#xff1a;简单 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;…

qt 最小文件系统 交叉编译qt源码

busybox qt源码下载后&#xff0c;需要交叉编译&#xff0c;在开发板上生成相应的库&#xff0c;才能在开发板上使用 我用qt制作了一个计时器&#xff0c;有相应的按钮功能。在windows上我大概知道鼠标点击按钮能够触发相应事件。把该程序移植到linux开发板上&#xff0c;开发…

Qt QSqlTableModel详解

背景知识&#xff1a; Qt SQL的API分为不同层&#xff1a; 驱动层 驱动层 对于QT是基于C来实现的框架&#xff0c;该层主要包括QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorbase、QSqlDriverPlugin and QSqlResult。这一层提供了特定数据库和SQL API层之间的底层桥梁…

AutoSAR系列讲解(入门篇)3.2-RTE对Runnables的运行支撑

目录 一、作为运行环境的主要功能点 二、Runnables的触发条件 一、作为运行环境的主要功能点 通过RTE给runnable提供触发事件。 之前说过了runnable是可以被触发的&#xff0c;就是需要通过RTE来实现这个触发和调用runnable&#xff0c;具体在下面讲解 通过RTE给runnable提供…

STM32外设系列—DHT11

文章标题 一、DHT11简介二、数据手册分析2.1 接口说明2.2 串行通信说明2.2.1 单总线通信2.2.2 单总线传输数据位定义2.2.3 时序图 三、DHT11程序设计3.1 初始化GPIO3.2 发送起始信号3.3 接收一个字节数据3.4 接收温湿度信息并校准 四、总结 一、DHT11简介 DHT11是一款常用的数…

Qt生成安卓工程运行闪退分析

提示找不到库 jin目录下库是存在的 提示下列库没有找到 libopencv_java4.so libtiff.so libboost_filesystem.so.1.71.0 libboost_chrono.so.1.71.0 libboost_regex.so.1.71.0 导致无法加载符号 最终导致应用无法启动&#xff0c;而退出 重新编译为静态库,并以静态库方式链…

技术管理第三板斧招聘与解聘-升级汰换

1.开除人“心要慈&#xff0c;刀要快” No Surprise&#xff1a; 不要突然Fire一个人&#xff08;离职一定不是一个突发行为&#xff09;&#xff0c;没有任何征兆告诉员工 A“你被开除了”&#xff0c;这是典型的管理失职。如果A存在问题&#xff0c;你应该先告知&#xff0…

数据结构--顺序表的基本操作--插入 and 删除

数据结构–顺序表的基本操作–插入 顺序表的插入操作 实现目标 ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct {int data[MaxSize];int len; }Sqlist;代码实现&#xff1a; #include <stdio.h> #include <stdlib.h> …

前端JavaScript入门-day03

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 1、循环-for 1. for 循环-基本使用 1. for循环语法 2. 退出循环 2. for 循环嵌套 2、数组 1 数组是…

易点易动设备管理平台:为制药厂提升设备管理效率保驾护航

在高度竞争的制药行业中&#xff0c;设备管理对企业的生产效率和产品质量起着至关重要的作用。如何在保证设备安全、高效运行的同时&#xff0c;降低成本和提高设备利用率呢&#xff1f;易点易动设备管理平台为您提供了完美的解决方案。本文将详细阐述易点易动设备管理平台如何…

Linux搭建sqli-labs(sql注入实战)

目录 一、安装phpstudy 二、更改配置文件 三、加载数据库 一、安装phpstudy 需要php、mysql、httpd环境&#xff0c;phpstudy可以做到快速部署。 cd /opt yum install -y wget wget -O install.sh https://notdocker.xp.cn/install.sh && sudo bash install.sh wget…

Podman安装nacos使用(默认最新版)

一,命令熟悉 --name : 命名容器的名称. -d:表示在后台运行容器. -p:指定端口映射。如: 左边的8848是宿主机的端口,右边的8848是nacos容器内部的端口。 docker.io/nacos/nacos-server:表示根据docker.io/nacos/nacos-server镜像运行容器。 --restart=always 表示启…

【MySQL】看完这篇不信你学不会如何使用数据处理函数

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

JDK的生成keytool证书

JDK的生成keytool证书 首先安装jdk环境 地址: https://www.oracle.com/downloads/ 点击页面下方的java 选择Java (JDK) for Developers 选择你的环境安装包&#xff0c;我的电脑是windows64位&#xff0c;选择x64 MSI Installer 下载完成后安装 进入jdk根路径执行命令 keytoo…

PaddleOCR #使用PaddleOCR进行光学字符识别 - OCR模型对比

PaddleOCR 在其工具包中提供了多种模型&#xff0c;并且非常易于应用。根据准确性和速度比较模型始终是一个好习惯。在本节中&#xff0c;我们将比较 PaddleOCR 提供的四种模型&#xff0c;即 SRN、PP-OCRv2、PP-OCRv3 和 NRTR。比较将在 COCO-text 数据集上进行&#xff0c;该…

【每日编程Day30】最难的问题 因子个数

目录 一、选择题 二、编程题 1、最难的问题 2、因子个数 一、选择题 &#xff08;1&#xff09;当包装类与基本数据类型比较&#xff0c;包装类会自动茶香变为基本数据类型再比较&#xff1b; &#xff08;2&#xff09;包装数据类直接赋值&#xff0c;默认调用其对用的val…

项目经理提高影响力的6大原则

在很多临时组建的项目团队中&#xff0c;项目经理往往处于权、责、利不匹配的尴尬状态&#xff0c;即有责无权。项目经理既需要对项目目标的实现负责&#xff0c;又没有相匹配的权利。 在这种情况下&#xff0c;项目经理不能通过权利进行团队管理&#xff0c;只能通过个人影响力…