java - 使用 jsch 连接到 azure 中托管的 sftp 服务器时连接重置

标签 java azure ssh azure-storage jsch

我们目前正在使用一个云产品,该产品在内部使用 JSCH 连接到外部 sftp 源。我正在调查尝试连接到 azure sftp 时遇到的连接重置异常。

使用wireshark,我确定问题是在我们发送客户端: key 交换初始化后发生的。与 filezilla 建立相同的连接就没有这个问题。

比较 jsch 和 filezilla 的软件包,我没有发现明显的问题,但我不是 ssh 协议(protocol)的专家。我将在下面发布这两个请求,如果有人能给我任何指示,我将不胜感激。

Request with JSCH (not working)

Request with Filezilla (working)

Response with Filezilla (working)

查看下面的日志输出:

INFO: Connecting to ***** port 22
INFO: Connection established
INFO: Remote version string: SSH-2.0-AzureSSH_1.0.0
INFO: Local version string: SSH-2.0-JSCH-0.1.54
INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
INFO: CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
INFO: CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
INFO: SSH_MSG_KEXINIT sent
INFO: Disconnecting from **** port 22
com.jcraft.jsch.JSchException: Session.connect: java.net.SocketException: Connection reset

编辑:按照詹姆斯的建议,我得到了相同的结果,连接关闭,但客户端请求仅将支持的算法作为有效负载。 因此,我尝试通过设置 jsch 配置来复制 FileZilla 请求,无论 jsch 是否实际上支持该算法,我只是想看看是否有任何响应。

但由于某种原因连接仍然被终止

Modified jsch request

最佳答案

感谢最新评论(来自 JGiltner62-0227,于 2022 年 2 月 18 日)https://learn.microsoft.com/en-us/answers/questions/713024/connection-to-azure-sftp-doesnt-work-using-jsch.html我现在有一个有效的 JSCH 实现。源代码中有两处需要更改,都在 Session.java 中。

  1. 第 71 行:

私有(private)字节[] V_C=Util.str2byte("SSH-2.0-JSCH-"+JSch.VERSION);//客户端版本

需要更改为:

私有(private)字节[] V_C=Util.str2byte("SSH-2.0-JSCH_"+JSch.VERSION);//客户端版本

(区别在于“JSCH”后面是下划线而不是破折号)。

  • 第 253 行:
  • byte[] foo=new byte[V_C.length+1];

    System.arraycopy(V_C, 0, foo, 0, V_C.length);

    foo[foo.length-1]=(byte)'\n';

    需要更改为

    byte[] foo=new byte[V_C.length+2];

    System.arraycopy(V_C, 0, foo, 0, V_C.length);

    foo[foo.length-2]=(byte)0x0D;

    foo[foo.length-1]=(byte)'\n';

    (变量'foo'需要是V_C.length + 2而不是+1,然后我们插入0x0D作为倒数第二个字节。)

    进行这两项更改后,我确认该库可以上传到 Azure SFTP。

    关于java - 使用 jsch 连接到 azure 中托管的 sftp 服务器时连接重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70878675/

    相关文章:

    java - Hibernate,保存新实体而不获取关联实体

    sql - 现有 SSIS 包转换为指向 Azure SQL 数据仓库

    python - 如何在 Linux 下 ssh.invoke_shell() 工作

    linux - 如何检查我可以通过 ssh 连接到哪些服务器?

    java - 为什么此转换不生成编译器警告?

    java - JBoss bean 验证需要调用 EJB

    azure - 工作线程服务中的事件日志未发布到 Azure Application Insight

    python - 在 Python 中使用 Paramiko ssh 到 ftp 服务器

    java - 为什么扩展 hashmap 的 map 助手会有用?为什么不直接使用 hashmap 呢?

    azure - 如何使用 Azure CLI 检索 Azure VM 的 VM 代理状态?