sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD

目录

  • 问题
  • JSCH
    • 0.1.54
    • 0.1.55
  • jsch连接到sshd
  • jsch对比长度
    • 0.1.54
    • 0.1.55
  • 问题原因结论
  • 新问题
  • sshd默认长度来源追溯
  • 自定义算法长度
  • 解决结论

项目中使用不同版本jsch包连接sftp,出现低版本连不上的问题,影响一些老项目,就看了一下原因

给出双方版本对比如下
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第1张图片

问题

Q:使用jsch 0.1.54连接apache-mina-sshd 2.8.0时报错验证失败 verify false

深层思考

Q:jsch 0.1.54 与0.1.55搭配apache-mina-sshd 2.8.0的区别

前置知识:ssh握手过程,来自b站的技术蛋老师
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第2张图片

JSCH

使用Beyond Compare工具对0.1.54和0.1.55的jsch包进行了对比

com.jcraft.jsch.JSch
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第3张图片
发现如下结果

0.1.54

com.jcraft.jsch.jce.SignatureECDSA

默认只有256一种长度

0.1.55

有256、384、521三种长度

com.jcraft.jsch.jce.SignatureECDSAN

com.jcraft.jsch.jce.SignatureECDSA256

com.jcraft.jsch.jce.SignatureECDSA384

com.jcraft.jsch.jce.SignatureECDSA521

sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第4张图片

0.1.55支持更多ECDSA椭圆曲线数字签名算法密钥长度

sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第5张图片

jsch连接到sshd

客户端jsch连接到sftp服务器,对关键部位打断点,追溯到一处源码,看到默认长度为521

org.apache.sshd.server.kex.DHGServer
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第6张图片
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第7张图片
sshd中包含算法256、384、521三种长度,并且选中的长度为521,是jsch0.1.54没有521
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第8张图片

org.apache.sshd.common.signature.SignatureECDSA

jsch对比长度

com.jcraft.jsch.KeyExchange
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第9张图片

0.1.54

获取ecdsa

失败
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第10张图片

0.1.55

获取ecdsa521
在这里插入图片描述

成功

sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第11张图片

问题原因结论

Q:使用jsch 0.1.54连接apache-mina-sshd 2.8.0时报错验证失败 verify false

A:jsch 0.1.54中ecdsa算法只有256长度,0.1.55中支持256、384、521三种长度

sshd 2.8.0中默认使用521长度

在jsch比较时,0.1.54比较不相等

深层思考

Q:jsch 0.1.54 与0.1.55搭配apache-mina-sshd 2.8.0的区别

A:jsch 0.1.55和sshd 2.8.0 都使用更长的521长度,应该是出于安全性考虑

当然,也可以进一步降低加密算法等级,比如变成rsa,下一篇会说
sftp连接工具ganymed-ssh2,连接不到Apache MINA SSHD sftp服务器的问题

新问题

Q:新老版本可以兼容吗

sshd默认长度来源追溯

根据shhd中得到521长度算法的地方反推

反推的深度大概有几十层,参数传递过程中经过了包括各种抽象类、构造器、类方法转换等,不一一展开

走到下面方法,可以看到

​ 当属性keySize为0,会选择ECCurves.SORTED_KEY_SIZE第三位

​ 当属性keySize不为0,使用keySize

org.apache.sshd.server.keyprovider.AbstractGeneratorHostKeyProvider
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第12张图片

而ECCurves则是包含了256、384、521三种长度,按大小排列

org.apache.sshd.common.cipher.ECCurves
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第13张图片

自定义算法长度

能不能自定义长度呢,根据keySize反推

AbstractGeneratorHostKeyProvider 有 setKeySize

org.apache.sshd.server.keyprovider.AbstractGeneratorHostKeyProvider
sftp连接工具jsch:0.1.54与0.1.55版本的区别,连接到Apache SSHD_第14张图片

ok,我们在sftp server配置类中指定
在这里插入图片描述
并不优雅,其他人看到会不懂,既然我们追过源码,就可以这样明示此值含义

在这里插入图片描述

经过验证,兼容jsch0.1.54

更老的版本我没看,jsch能升级就升级,考虑稳定的话使用兼容方案

解决结论

Q:新老版本可以兼容吗

A:可以通过设置key的长度,适配长度较短的低版本jsch

你可能感兴趣的:(报错处理经验,开发工具,技术,apache,java,开发语言)