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升级后,为了安全,默认不再采用原来一些加密算法,我们手工添加进去即可#目前出 ...
随机推荐
- 一些OI常用小技巧啊
1.卡常 \[---总有人以为自己比编译器聪明 \;\;\;by\;\;bezel \] 我们可能确实没有编译器聪明,但是,为了防止CCF的老人机出现什么问题,卡一卡常还是有必要的. 如果实在被逼无奈 ...
- iOS中RunLoop和线程的关系
RunLoop又叫运行循环,主要用来管理线程.一个线程对应一个RunLoop,一个RunLoop又有五种模式.只有主线程的RunLoop是默认开启的,所以程序在开启后,会一直运行,不会退出.其他线程的 ...
- vue2基于 vue-cropper插件对图片裁剪
<template> <div id="app"> <div class="model" v-show="model&q ...
- day11-基本运算符
运算符 java语言支持如下运算符: 优先级 ( 多敲,多练习 ) 算术运算符:+,-,*,/,%(模运算:取余),++,-- package operator; public class De ...
- Required request parameter ‘xxx‘ for method parameter type xxxx is not present 解决方式
我在controller层传实体参数时加了@RequestParam,结果报Required request parameter 'pointlist' for method parameter ty ...
- 防火墙NAT+DHCP+ACL+ACAP
任务要求: SwitchA作为有线终端网关与DHCP Server,为无线终端与有线终端分配IP地址,并配置ACL访问控制列表控制不同用户的访问权限,客户机只能跟DMZ区域服务器互访,无线访客禁止访问 ...
- Squid设置用户名密码
在ubutnu上设置squid代理认证 为了在Ubuntu上设置Squid代理身份验证,您需要对Squid配置文件进行以下一些调整: 生成Squid代理身份验证密码 htpasswd是两种可用于生成代 ...
- Windows 使用 Mingw-w64 配置GCC套件
Mingw-w64里的gcc和g++应该是很多人常用的编译工具.但是他的下载资源很乱,不好找(注意:MinGW和MinGW-w64是同宗同源的两款软件!),要么就是版本太老.SourceForge上有 ...
- 2024年全国大学生信息安全竞赛安徽省赛-WP
2024年全国大学生信息安全竞赛安徽省赛-WP 没有re,不会...... 0X01 初赛(CTF) MISC 图像损坏 损坏的GIF文件,补上缺失的文件头 用puzz拆分GIF,得到多个图片 ...
- Spark原理及关键技术点
Spark Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎.Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop M ...