com.jcraft.jsch.JSchException: Algorithm negotiation fail解决

1.背景:

某机构升级了ssh版本,对应造成sftp连接异常,异常信息:com.jcraft.jsch.JSchException: Algorithm negotiation fail
原jsch版本:jsch-0.1.50.jar
需升级版本:jsch-0.1.53.jar

报错说明引用:https://www.cnblogs.com/exmyth/p/14779241.html
小插曲:对应我维护的项目是一个老的项目,历经几任研发,生产只有一个jar包在运行,没有文档,也无代码,一旦有问题,那可真是要命,因为是对外的项目,承接外部机构,陆续出现了一些,更换http证书、rsa秘钥的,好在可以直接解压jar去修改配置文件,现在是更换依赖版本那可真是头疼,只能试,原因是有些jar包版本升级有些包路径、方法可能会有更新;这种情况,无解,没有好的办法;好在对应反编译中import路径对应无更新,对应方法五更改,所以可以替换,下面是替换过程,请参考;

2.解决方案;

2.1 机构方对应/etc/sshd_config 加入支持的低版本jsch-0.1.50.jar支持的算法,请参考对应引用;

2.2 客户端解决方案:(尽量让对方解决,问题是因为对方升级ssh造成的,对方解决不了的情况下,我们在介入解决)

#先备份原jar包
cp bull-prepose-file-1.1.0.jar ../bak/
#解压jar包
jar -xvf bull-prepose-file-1.1.0.jar 

3.2 解压后:多了三个文件夹 BOOT-INF,META-INF,org

image.png

3.3 将高版本的jsch-0.1.53.jar 放入 BOOT-INF/lib/目录,并删除原版本;

3.4 重新打包;

#重新打包
jar -cfM0 bull-prepose-file-1.1.0.jar ./BOOT-INF/ ./META-INF/ ./org/
image.png

3.5 重新启动项目:

image.png

福利:对应启动脚本分享:

#!/bin/sh
## java env
## API_NAME : 包名
API_NAME=bull-prepose-file
JAR_NAME=`ls $API_NAME*.jar`
#PID  代表是PID文件
PID=$API_NAME\.pid

#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
    exit 1
}

#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#启动方法
start(){
  is_exist
  if [ $? -eq "0" ]; then 
    echo ">>> ${JAR_NAME} is already running PID=${pid} <<<" 
  else 
    nohup java -server -Xmx1024M -Xms1024M -Xmn1024M  -XX:MaxMetaspaceSize=216M -XX:MetaspaceSize=216M -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly  -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/appuser/logs/dump/bull-prepose-file/ -Xloggc:/app/appuser/logs/dump/bull-prepose-file/gc.log -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=22232 -Dlog4j2.formatMsgNoLookups=true  -jar  $JAR_NAME >/dev/null 2>&1 &
    echo $! > $PID
    echo ">>> start $JAR_NAME successed PID=$! <<<" 
   fi
  }

#停止方法
stop(){
  #is_exist
  pidf=$(cat $PID)
  #echo "$pidf"  
  echo ">>> api PID = $pidf begin kill $pidf <<<"
  kill $pidf
  rm -rf $PID
  sleep 2
  is_exist
  if [ $? -eq "0" ]; then 
    echo ">>> api 2 PID = $pid begin kill -9 $pid  <<<"
    kill -9  $pid
    sleep 2
    echo ">>> $JAR_NAME process stopped <<<"  
  else
    echo ">>> ${JAR_NAME} is not running <<<"
  fi  
}

#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> ${JAR_NAME} is running PID is ${pid} <<<"
  else
    echo ">>> ${JAR_NAME} is not running <<<"
  fi
}

#重启
restart(){
  stop
  start
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac
exit 0

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容