原始環境:
JDK版本 1.6
使用插件 jsch-0.1.55.jar
問題:
給遠端主機使用sftp報錯com.jcraft.jsch.JSchException: Algorithm negotiation fail
使用 ssh -vvv ip 命令和遠端主機對比

以上原理解釋參考
https://my.oschina.net/greatqing/blog/740179
冷靜下來,回到這個例外Algorithm negotiation fail,其字面意思是演算法協商失敗。查看jsch原始碼,例外發生在connect階段。上網查找資料(SSH協議介紹),發現SSH通訊程序的五個階段中,有一個是密鑰和演算法協商階段,在這個階段, 雙方根據本端和對端支持的演算法,協商出最終使用的演算法。問題就應該出在了這里。不同版本的OpenSSH默認的演算法串列不同,導致了演算法協商失敗。參考com.jcraft.jsch.JSchException: Algorithm negotiation fail
那么如何才能知道不同版本OpenSSH默認的演算法串列呢?參考What's openssh default kexalgorithms?通過ssh -vvv serverIp命令,如如上圖所示:
百度各種解決方法很多都需要服務端添加組態檔,還需要重啟服務。需要對端配合(舍棄該方式)
各種嘗試后解決方案需要調整以下兩步
1、升級jdk
2、調整連接的配置
本人將jdk從jdk1.6升級至1.7最后升級為1.8,若jdk版本不升級則會報錯
com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
調整連接配置添加配置代碼
Properties sshConfig = new Properties();
sshConfig.put("kex", "diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256");
參考:https://stackoverflow.com/questions/26424621/algorithm-negotiation-fail-ssh-in-jenkins
完成以上兩步,則可以正常連接和使用sftp上傳檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130956.html
標籤:Java相關
上一篇:新人問題
