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

Connection reset when using jsch to connect to an sftp server hosted in azure

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

使用wireshark我确定问题发生在我们发送Client: Key Exchange Init之后。与 filezilla 建立相同的连接,我们没有这个问题。

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

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

我想 post 为遇到相同问题的任何人快速更新,我在 Microsoft 问答网站上打开了一个类似的问题,看起来这是他们正在处理的天蓝色方面的问题修复 GA Microsoft Q&A

来自SSH RFC

   When the connection has been established, both sides MUST send an
   identification string.  This identification string MUST be

      SSH-protoversion-softwareversion SP comments CR LF

   Both the 'protoversion' and 'softwareversion' strings MUST consist of
   printable US-ASCII characters, with the exception of whitespace
   characters and the minus sign (-).  The 'softwareversion' string is
   primarily used to trigger compatibility extensions and to indicate
   the capabilities of an implementation.  The 'comments' string SHOULD
   contain additional information that might be useful in solving user
   problems.  As such, an example of a valid identification string is

      SSH-2.0-billsSSH_3.6.3q3<CR><LF>

由于软件版本段中的“-”,这个库(和 ssh-keyscan)似乎违反了规范:JSCH-0.1.54

正如 Fabian 指出的那样,“修复”将在 SFTP GA 之前可用。

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

  1. 第 71 行:

private byte[] V_C=Util.str2byte("SSH-2.0-JSCH-"+JSch.VERSION); // client version

需要更改为:

private byte[] V_C=Util.str2byte("SSH-2.0-JSCH_"+JSch.VERSION); // client version

(不同之处在于 'JSCH' 之后是下划线而不是破折号)。

  1. 第 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。