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升级后,为了安全,默认不再采用原来一些加密算法,我们手工添加进去即可#目前出 ...
随机推荐
- Java日期时间API系列28-----Jdk8中java.time包中的新的日期时间API类,计算节假日和二十四节气。
1.节日信息计算代码 package com.xkzhangsan.time.holiday; import java.time.DayOfWeek; import java.time.LocalDa ...
- 【官宣】2024 DTC数据技术嘉年华全议程发布:汇聚行业精英,共襄年度盛宴
龙腾四海内,风云际会时.由墨天轮数据社区和中国数据库联盟(ACDU)主办的第十三届数据技术嘉年华 将于2024年4月12日至13日在北京新云南皇冠假日酒店盛大召开.本次大会的主题是"智能·云 ...
- manim边做边学--有向图
有向图和上一篇介绍的无向图基本一样,唯一的区别在于有向图的边有方向性,它表示的是顶点之间的单向或依赖关系. 有向图G一般表示为:G=<V,E>.和无向图一样,V是顶点集合,E是边的集合. ...
- 3DRealCar: An In-the-wild RGB-D Car Dataset with 360-degree Views
3DRealCar:An In-the-wild RGB-D Car Dataset with 360-degree Views Du, Xiaobiao and Sun, Haiyang and W ...
- javascript 中==和===的区别【转载】
javascript 中==和===的区别[转] 对于JavaScript中比较运算符,可能大家用的比较多的是"==".对于"==="很多人可能很陌生 ...
- 狂神说-Docker基础-学习笔记-07 容器数据卷
狂神说-Docker基础-学习笔记-07 容器数据卷 视频地址:https://www.bilibili.com/video/BV1og4y1q7M4?p=21 什么是容器数据卷 运行时数据都在容器中 ...
- chrony服务器
1.安装 yum install chrony -y 2.配置文件 主配置文件:/etc/chrony.conf server ntp.aliyun.com iburst ---指定阿 ...
- Python获取jenkins job信息
pip install Python-jenkins 如果只是想获取到jenkins的全局变量(比如job url),使用jenkins全局变量就能做到. https://www.jb51.net/ ...
- 【2024.9.30】NOIP2024 赛前集训-刷题训练(4)
[2024.9.30]NOIP2024 赛前集训-刷题训练(4) Problem - 2000D - Codeforces 给一串数和一串LR字符,L 可以向右连接 R, 覆盖部分的LR不能再使用,但 ...
- GPU 环境搭建指南:使用 GPU Operator 加速 Kubernetes GPU 环境搭建
本文主要分享如何使用 GPU Operator 快速搭建 Kubernetes GPU 环境. 1. 概述 上一篇文章 GPU 使用指南:如何在裸机.Docker.K8s 等环境中使用 GPU 分享了 ...