zoukankan      html  css  js  c++  java
  • JSchException: Algorithm negotiation fail异常处理过程

    JSchException: Algorithm negotiation fail异常处理过程

    场景:应用详情的评论页,用户评论文字+图片将直接上传到我们的sftp服务器中。

    异常产生:用户在模拟测试时发现上传图片后,图片找不到,查看后端erreo日志发现以下内容:

    2020-10-22 23:52:03,207 [com.aspire.mo.module.comment.util.CommentUtil]- 社交评论图片上传到资源服务器失败
    java.lang.Exception: java.lang.Exception: com.jcraft.jsch.JSchException: Algorithm negotiation fail
     at com.aspire.mo.module.comment.util.Util.synActivityFile(Util.java:75)
     at com.aspire.mo.module.comment.util.Util.uploadCateFileURL(Util.java:50)
     at com.aspire.mo.module.comment.util.CommentUtil.uploadImageFile(CommentUtil.java:145)
     at com.aspire.mo.module.comment.service.AddBaseCommentServlet.doPost(AddBaseCommentServlet.java:380)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at com.aspire.common.filter.xssfilter.XSSFilter.doFilter(XSSFilter.java:60)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:615)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
     at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
     at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:311)
     at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
     at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
     at org.apache.jk.common.ChannelSocket$
     Caused by: java.lang.Exception: com.jcraft.jsch.JSchException: Algorithm negotiation fail
     at com.aspire.mo.framework.sftp.SFTPServer.login(SFTPServer.java:58)
     at com.aspire.mo.framework.sftp.SFTPUtils.upload(SFTPUtils.java:45)
     at com.aspire.mo.module.comment.util.Util.synActivityFile(Util.java:67)
     ... 24 more
    Caused by: com.jcraft.jsch.JSchException: Algorithm negotiation fail
     at com.jcraft.jsch.Session.receive_kexinit(Session.java:552)
     at com.jcraft.jsch.Session.connect(Session.java:299)
     at com.jcraft.jsch.Session.connect(Session.java:162)
     at com.aspire.mo.framework.sftp.SFTPServer.initSession(SFTPServer.java:138)
     at com.aspire.mo.framework.sftp.SFTPServer.login(SFTPServer.java:47)
     ... 26 more
    

    解决过程:

    1.检查配置文件中的sftp地址、用户名和密码是否错误:

    经检查发现配置皆为正确的,且可以正常上传下载。

    2.查看ssh版本是否相同,结果为大致相同:

    [root@LGJF-ZYC5-MMSC-WEB18 ~]# ssh -V
    OpenSSH_8.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
    
    [root@LGJF-ZYC5-MMSC-LJCL01 ~]# ssh -V
    OpenSSH_8.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
    

    3.怀疑时JDK版本低导致,但由于生产环境不能直接升,所以继续查看报错日志,怀疑是代码中连接sftp服务器组件包jsch-0.1.48.jar版本低导致。然后去下载了一个新的包替换后,在下面测试中又出现以下异常:

    https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.55/jsch-0.1.55.jar
    
     2020-10-23 00:21:29,307 [com.aspire.mo.module.comment.util.CommentUtil]- 社交评论图片上传到资源服务器失败
    java.lang.Exception: java.lang.Exception: com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
            at com.aspire.mo.module.comment.util.Util.synActivityFile(Util.java:75)
            at com.aspire.mo.module.comment.util.Util.uploadCateFileURL(Util.java:50)
            at com.aspire.mo.module.comment.util.CommentUtil.uploadImageFile(CommentUtil.java:145)
            at com.aspire.mo.module.comment.service.AddBaseCommentServlet.doPost(AddBaseCommentServlet.java:380)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at com.aspire.common.filter.xssfilter.XSSFilter.doFilter(XSSFilter.java:60)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
            at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:615)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
            at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
            at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:311)
            at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
            at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
            at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
            at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
            at java.lang.Thread.run(Thread.java:662)
    Caused by: java.lang.Exception: com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
            at com.aspire.mo.framework.sftp.SFTPServer.login(SFTPServer.java:58)
            at com.aspire.mo.framework.sftp.SFTPUtils.upload(SFTPUtils.java:45)
            at com.aspire.mo.module.comment.util.Util.synActivityFile(Util.java:67)
            ... 24 more
    Caused by: com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
            at com.jcraft.jsch.Session.connect(Session.java:565)
            at com.jcraft.jsch.Session.connect(Session.java:183)
            at com.aspire.mo.framework.sftp.SFTPServer.initSession(SFTPServer.java:138)
            at com.aspire.mo.framework.sftp.SFTPServer.login(SFTPServer.java:47)
            ... 26 more
    

    4.经过搜索得知:是JDK 1.6版本低导致,因为JDK 1.6的加密算法和OPENSSH 8支撑的加密算法不一致。那么解决方法如下:

    方案1:升级JDK到1.8版本,因为jdk 1.8支持了大多数的加密算法。

    方案2:保持jdk 1.6版本,修改openssh配置文件

    ​ 1.修改/etc/ssh/sshd_config配置文件,添加jdk 1.6支持的加密算法,如下:

    KexAlgorithms +diffie-hellman-group1-sha1

    ​ 注意:

    • 如果使用的是jsch-0.1.52 jar包,只需按上述方法修改完就行;

    • 如果使用的是jsch-0.1.53及以上jar包,还需要对代码做如下修改:

      修改代码,在session中指定加密算法为:diffie-hellman-group1-sha1,如下所示:

      Properties sshConfig = new Properties();

      sshConfig.put("kex", "diffie-hellman-group1-sha1");

      为什么要修改代码呢?因为建立连接时openssh会把它支持的所有加密算法发给jsch,让jsch从中间挑一个。如果列表中有diffie-hellman-group1-sha1算法,jsch-0.1.52则会优先选择该算法,这个算法恰好是jdk 1.6支持的,所以连接成功。而jsch-0.1.53及以后的jar包默认选择其他算法,该算法jdk 1.6并不支持,所以报错。

      如果要使用jsch-0.1.53及以后的jar包,就需要在代码中指定使用diffie-hellman-group1-sha1算法。

    由于生产环境限制,我们使用的是jdch-0.1.52.jar,替换到生产后,并将sshd配置文件添加加密算法后重启,经验证,图片上传成功,问题解决!

  • 相关阅读:
    建立适当的索引
    Windows 10Bash命令
    代码生成工具介绍和使用
    分布式的任务调度框架
    Net分布式系统
    Keepalived+LVS+Nginx负载均衡之高可用
    call,apply,bind
    2015搜狐在线笔试题(内存泄露问题)(转)
    十步完全理解SQL(转)
    Linux shell用法和技巧(转)
  • 原文地址:https://www.cnblogs.com/hzxyf/p/13862409.html
Copyright © 2011-2022 走看看