JSchException: Algorithm negotiation fail问题解决之路
最近一个需求用到了SFTP上传功能,同事之前已经封装好了SFTP工具类,用的是JSch,本着不要重复造轮子的想法,就直接拿来用了。交代下环境,JDK为1.7,JSch版本为0.1.51。自测通过、测试环境也OK,但上到生产环境却抛出Algorithm negotiation fail异常,当即傻眼,下面是具体的异常信息:
com.jcraft.jsch.JSchException: Algorithm negotiation fail
at com.jcraft.jsch.Session.receive_kexinit(Session.java:583) ~[jsch-0.1.51.jar:na]
at com.jcraft.jsch.Session.connect(Session.java:320) ~[jsch-0.1.51.jar:na]
更纳闷的是,在本端(Client端)下用Linux命令SFTP(参考linux下FTP、SFTP命令详解)连接对端(Server端)是成功的,也能上传,首先排除了用户名/密码错误、网络不通、未添加白名单之类的原因了。然后想到是程序本身的问题,但为什么开发环境、测试环境都没抛错呢?难道是环境问题吗?用ssh -V命令查看ssh版本,测试环境的本端和对端,以及生产环境的本端均是“OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010”,但是生产环境的对端却是“OpenSSH_6.7p1, OpenSSL 1.0.1e-fips 11 Feb 2013”。看来真是环境问题了。
冷静下来,回到这个异常Algorithm negotiation fail,其意思是算法协商失败。查看jsch源码,异常发生在connect阶段。上网查找资料(SSH协议介绍),发现SSH通讯过程的五个阶段中,有一个是密钥和算法协商阶段,在这个阶段, 双方根据本端和对端支持的算法,协商出最终使用的算法。问题就应该出在了这里。5.3和6.7不同版本的OpenSSH默认的算法列表不同,导致了算法协商失败。参考com.jcraft.jsch.JSchException: Algorithm negotiation fail
那么如何才能知道不同版本OpenSSH默认的算法列表呢?参考What's openssh default kexalgorithms?通过ssh -vvv serverIp命令,如如下图所示:

其中1和2标记的分别是5.3和6.7版本OpenSSH默认的KexAlgorithms,可以看到,(本端)OpenSSH 5.3支持的diffie-hellman-group1-sha1 和 diffie-hellman-group-exchange-sha1 算法已经不在(对端)OpenSSH 6.7的默认列表里面。
原来,ssh升级后,为了安全,默认不再采用原来一些加密算法。既然没有了原来的一些加密算法,那么就手工添加进去,参照这篇博文。编辑/etc/sshd_config,加上 KexAlgorithms diffie-hellman-group1-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1
重启服务sshd。
就在以为能搞定的时候,对端的同事(因为是我连接他们的SFTP服务器,因此上述添加修改工作是由他们来做的)说修改后重启服务报错了:

因为服务器不在我这边,我不能亲自调试,这下我也没辙了。
最后,不甘心每天要手动上传,去JSch官网看一下,竟然有所收获,在它的ChangeLog里发现,
Changes since version 0.1.52:
- bugfix: the rekey initiated by the remote may crash the session.
是说修复了“由远程发起的密钥更新可能会使会话崩溃”的bug,这说的就是我遇到的问题啊,把JSch的版本升级到了最新的0.1.53,可以成功上传,问题解决。
转载于:https://my.oschina.net/greatqing/blog/740179
JSchException: Algorithm negotiation fail问题解决之路的更多相关文章
- ssh com.jcraft.jsch.JSchException: Algorithm negotiation fail报错问题解决
我司自动安装部署工具ideploy,使用ssh连接主机并部署业务.今天提供给一线安装规划后,安装报错,测试连接主机失败,而直接使用ssh是可以连接上主机的.查看问题错误堆栈如下: ERROR pool ...
- 使用SharpSSH连接服务器报Algorithm negotiation fail解决办法
SharpSSH或JSCH使用diffie-hellman-group1-sha1和diffie-hellman-group-exchange-sha1密钥交换算法,而OpenSSH在6.7p1版本之 ...
- 主机ssh升级到6.7以上版本后,使用jsch jar包ssh连接不上报Algorithm negotiation fail问题的解决办法
ssh连接问题是由于主机ssh中缺少与jsch jar包匹配的加密算法导致,jsch jar包的默认加密算法貌似是diffie-hellman-group-exchange-sha1. 在目标主机ss ...
- JSch Algorithm negotiation fail
https://stackoverflow.com/questions/30846076/jsch-algorithm-negotiation-fail As you can see, the ser ...
- [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一
1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...
- Debian 8 jessie, OpenSSH ssh connection server responded Algorithm negotiation failed
安装了debian 8.5 就出问题了. root@debian8:~# lsb_release -aNo LSB modules are available.Distributor ID: Debi ...
- SSH Secure File Transfer Client连接远程设备报“algorithm negotiation failed”错的解决方法
SSH Secure File Transfer Client连接远程设备报"algorithm negotiation failed"错的解决方法 ssh client 报 al ...
- SSH Secure :Algorithm negotiation failed,反复提示输入password对话框
在嵌入式开发中,SSH Secure File Transfer Client 软件使用,方便了windows和linux之间文件拷贝,尤其是多台主机状况下. 最近装了Ubuntu 16.0.4,在V ...
- Server responded "Algorithm negotiation failed" SSH Secure链接服务器错误
Ubuntu 16.04安装openssh-server后,使用ssh客户端连接时可能报此错误,情况如下图所示: server responded "algorithm negotiatio ...
- Algorithm negotiation failed
#用pycharm工具ssh client 报 algorithm negotiation failed#导致原因:是ssh升级后,为了安全,默认不再采用原来一些加密算法,我们手工添加进去即可#目前出 ...
随机推荐
- 使用KFold交叉验证方法划分训练集和验证集
在进行深度学习时,为了提高精度,或者为了评估我们模型的优劣,以及如何选择一个更好的模型.这样我们就需要用到交叉验证方法. 我们主要实现如何使用KFold划分训练集和验证集 #coding:utf-8f ...
- 批量读取nii文件的shape
import SimpleITK as sitk from glob import glob import os path = glob(r"D:\MyData\date\*") ...
- 2023年6月中国数据库排行榜:OceanBase 连续七月踞榜首,华为阿里谋定快动占先机
群雄逐鹿,酣战墨坛. 2023年6月的 墨天轮中国数据库流行度排行 火热出炉,本月共有273个数据库参与排名.本月排行榜前十变动不大,可以用一句话概括为:OTO 组合连续两月开局,传统厂商GBase南 ...
- .NET 白板书写预测-曲线拟合
白板软件书写速度是其最核心的功能,注册StylusPlugin从触摸线程拿触摸点数据并在另一UI线程绘制渲染是比较稳妥的方案,具体的可以查看小伙伴德熙的2019-1-28-WPF-高性能笔 - lin ...
- 如何对 Vue 首屏加载实现优化 ?
首屏加载优化是对于 SPA 来说的 ,首次加载所有的 html css js 所需的文件 ,后面就不会因为用户对页面的操作而跳转页面 ,没有跳转页面如何展示不同的内容呢 ? 使用 Vue 的路由机制 ...
- go~wasm插件的开发
Go和TinyGo是两种不同的Go语言编译器,它们之间有以下几点区别: 目标平台: Go:Go语言编译器主要面向通用计算机平台,如Windows.Linux.macOS等. TinyGo:TinyGo ...
- Kubernetes的RBAC权限控制
role和roleBinding Role资源定义了哪些操作可以在哪些资源上执行.也可以直接控制访问的url的权限,下面的cluster也是这样. 查询所有service的demo: apiVersi ...
- EBS GL 当前职责有访问权限的所有账套
CREATE OR REPLACE VIEW CUX_GL_ACCESS_LEDGER_V AS SELECT L.LEDGER_ID,L.NAME,L.LEDGER_CATEGORY_CODE FR ...
- LDAP和SSO
什么是LDAP(Lightweight Directory Access Protocol)?很多公司会使用各种开源平台(例如: gitlab. Jenkins. chat 等等),维护这些账号是一件 ...
- 宝塔linux 搭建
前言 2020年的时候,用宝塔搭了个WordPress,一个人的博客不算是博客,没有社区氛围.就转到博客园了. 21年跟着教程,写了一个PHP的个人博客项目. 又有一台阿里云的服务器,就把代码部署上去 ...