项目中使用不同版本jsch包连接sftp,出现低版本连不上的问题,影响一些老项目,就看了一下原因
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的区别
使用Beyond Compare工具对0.1.54和0.1.55的jsch包进行了对比
com.jcraft.jsch.jce.SignatureECDSA
默认只有256一种长度
有256、384、521三种长度
com.jcraft.jsch.jce.SignatureECDSAN
com.jcraft.jsch.jce.SignatureECDSA256
com.jcraft.jsch.jce.SignatureECDSA384
com.jcraft.jsch.jce.SignatureECDSA521
0.1.55支持更多ECDSA椭圆曲线数字签名算法密钥长度
客户端jsch连接到sftp服务器,对关键部位打断点,追溯到一处源码,看到默认长度为521
org.apache.sshd.server.kex.DHGServer
sshd中包含算法256、384、521三种长度,并且选中的长度为521,是jsch0.1.54没有521
org.apache.sshd.common.signature.SignatureECDSA
成功
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:新老版本可以兼容吗
根据shhd中得到521长度算法的地方反推
反推的深度大概有几十层,参数传递过程中经过了包括各种抽象类、构造器、类方法转换等,不一一展开
走到下面方法,可以看到
当属性keySize为0,会选择ECCurves.SORTED_KEY_SIZE第三位
当属性keySize不为0,使用keySize
org.apache.sshd.server.keyprovider.AbstractGeneratorHostKeyProvider
而ECCurves则是包含了256、384、521三种长度,按大小排列
org.apache.sshd.common.cipher.ECCurves
能不能自定义长度呢,根据keySize反推
AbstractGeneratorHostKeyProvider 有 setKeySize
org.apache.sshd.server.keyprovider.AbstractGeneratorHostKeyProvider
ok,我们在sftp server配置类中指定
并不优雅,其他人看到会不懂,既然我们追过源码,就可以这样明示此值含义
经过验证,兼容jsch0.1.54
更老的版本我没看,jsch能升级就升级,考虑稳定的话使用兼容方案
Q:新老版本可以兼容吗
A:可以通过设置key的长度,适配长度较短的低版本jsch