【问题标题】:Apache Mina and SSHD (reverse SSH): Invalid Packet length 0Apache Mina 和 SSHD(反向 SSH):无效数据包长度 0
【发布时间】:2021-06-15 17:09:24
【问题描述】:

请分享您对我们如何解决此异常的想法

我们正在开发基于 SSH 的 Netconf,使用的 SSH 库是 Apache Mina 和 SSHD。 Device 是 Netconf 服务器,Application 是 Netconf 客户端。由于设备位于防火墙后面,应用程序无法连接到设备,但设备可以连接到应用程序。因此,我们正在使用设备建立的会话与应用程序进行所有通信。

以下是遵循的步骤:

  1. 启动 NioSocketAcceptor 监听/绑定到一个端口号

  2. IoSessionConfig 的 useReadoperation 属性设置为 true

  3. 当一个 tcp 连接被接受时,我们有一个可用的 mina core IoSession,这里我们称之为 tcpSession。

  4. 我们想使用这个 mina IoSession 来读取和写入 netconf 消息。用于将mina核心会话转换为ssdh IoSession的代码如下

    新的 org.apache.sshd.common.io.IoSession() {

         @Override
         public long getId() {
             return tcpSession.getId();
         }
    
         @Override
         public Object getAttribute(final Object key) {
             return tcpSession.getAttribute(key);
         }
    
         @Override
         public Object setAttribute(final Object key, final Object value) {
             return tcpSession.getAttribute(key, value);
         }
    
         @Override
         public SocketAddress getRemoteAddress() {
             return tcpSession.getRemoteAddress();
         }
    
         @Override
         public SocketAddress getLocalAddress() {
             return tcpSession.getLocalAddress();
         }
    
         @Override
         public IoWriteFuture write(final Buffer buffer) {
             final ChannelAsyncOutputStream.IoWriteFutureImpl ioWriteFuture = new ChannelAsyncOutputStream.IoWriteFutureImpl(buffer);
             byte[] bytes = buffer.getCompactData();   
             int capacity = bytes.length + 8;   
             IoBuffer bytebuffer = IoBuffer.allocate(capacity).setAutoExpand(true);   
             //bytebuffer.putInt(bytes.length);   
             bytebuffer.put(bytes);   
             bytebuffer.flip();              
             buffer.clear();
             final WriteFuture write = tcpSession.write(bytebuffer);
             write.addListener(new IoFutureListener<WriteFuture>() {
                 @Override
                 public void operationComplete(final WriteFuture future) {
                     if (future.isWritten()) {
                         ioWriteFuture.setValue(true);
                     } else {
                         // TODO check the value type expected + if exception can go there
                         ioWriteFuture.setValue(future.getException());
                     }
                 }
             });
    
             return ioWriteFuture;
         }       
    
         @Override
         public CloseFuture close(final boolean immediately) {
             final DefaultCloseFuture defaultCloseFuture = new DefaultCloseFuture(null);
             tcpSession.close(immediately).addListener(new IoFutureListener<org.apache.mina.core.future.CloseFuture>() {
                 @Override
                 public void operationComplete(final org.apache.mina.core.future.CloseFuture future) {
                     if(future.isClosed()) {
                         defaultCloseFuture.setValue(true);
                     } else {
                         // TODO check the value type expected
                         defaultCloseFuture.setValue(false);
                     }
                 }
             });
             return defaultCloseFuture;
         }
    
         @Override
         public IoService getService() {
             throw new UnsupportedOperationException("No service available");
         }
    
         @Override
         public boolean isClosed() {
             return tcpSession.getCloseFuture().isClosed();
         }
    
         @Override
         public boolean isClosing() {
             return tcpSession.isClosing();
         }
     });
    
  5. 用于将 Apache SSHD IoSession 附加到客户端的代码如下

    final ConnectFuture connectFuture = new DefaultConnectFuture(null); ClientSessionImpl 会话 = null; 尝试 { session = new ClientSessionImpl(sshClient, ioSession); AbstractSession.attachSession(ioSession, session); MyAsyncSshHandlerReader async = new MyAsyncSshHandlerReader(ioSession); } 捕捉(异常 e){ // TODO 自动生成的 catch 块 e.printStackTrace(); }

  6. MyAsyncSshHandlerReader 是用于从 tcpSession 读取数据的类。

    类 MyAsyncSshHandlerReader 实现 IoFutureListener、AutoCloseable {

     private final org.apache.sshd.common.io.IoSession ioSession;
    
     public MyAsyncSshHandlerReader(org.apache.sshd.common.io.IoSession ioSession) {
         this.ioSession = ioSession;
         minaCoreIoSession.read().addListener(this);
     }
    
     @Override
     public void close() throws Exception {
         // TODO Auto-generated method stub
    
     }
    
     @Override
     public void operationComplete(ReadFuture future) {
         long msgsRead = future.getSession().getReadMessages();
         if(future.isRead() && !future.isClosed()){
    
             IoBuffer msg = (IoBuffer)future.getMessage();               
             msg.flip();
             Buffer buf = new Buffer(msg.array());           
             try {               
                 if(AbstractSession.getSession(ioSession) != null){
                     AbstractSession.getSession(ioSession).messageReceived(buf);                 
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
             minaCoreIoSession.read().addListener(this);
         }           
     }
    

    }

  7. 在应用程序端创建客户端会话时,会调用以下方法。

    1. 发送标识
    2. sendKexInit()
  8. 应用程序还收到了从设备交换的识别消息和密钥 并且识别消息被正确读取但无法解码密钥交换消息,library has throwed SshException "invalid packet length 0"

2015-11-02 13:02:48,831 |信息 | oupCloseable-6-2 | ClientSessionImpl | 210 - org.apache.sshd.core - 0.14.0 |解码包错误(长度无效) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 0 0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 fc 07 14 34 2 4 7 4e 4b 7e 2e e3 55 27 ef 00 00 00 b7 65 63 64 68 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36 2c 65 63 64 68 2d 73 68 61 32 2d 6e 69 3 8 74 70 6 56 36 74 70 6 33 2d 73 68 61 32 2d 6e 69 74 74 70 35 32 32 31 2C 64 69 69 66 66 66 69 69 69 65 2d 68 68 6c 6c 6c 6c 6c 6c 6 d 61 d 6 e 61 6 e 2d 67 72 6f 75 75 70 2d 70 2d 65 78 63 61 61 61 61 61 61 61 67 67 67 65 2d 73 68 68 68 68 61 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 36 2C 64 69 66 66 69 69 65 2D 68 68 6C 6C 6C 6D 6D 61 61 6E 2D 67 72 6F 75 75 70 2D 65 78 65 78 63 68 68 61 61 67 67 67 67 65 2D 73 68 61 313 61 31 31 31 2C 64 69 66 66 66 66 66 69 69 65 2D 65 65 65 65 6C 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D时6e 2d 67 72 6f 75 70 31 34 2d 73 68 61 31 2c 64 69 66org.apache.sshd.common.SshException:无效的数据包长度:0 在 org.apache.sshd.common.session.AbstractSession.decode(AbstractSession.java:719) 在 org.apache.sshd.common.session.AbstractSession.messageReceived(AbstractSession.java:308) 在 org.opendaylight.controller.netconf.nettyutil.handler.ssh.client.ReversedAsyncSshHandler$MyAsyncSshHandlerReader.operationComplete(ReversedAsyncSshHandler.java:220)

  1. 请说明 AbstractSession.decode() 方法的工作原理

根据我的调试,rpos 和 limit 变量保持相同的值,例如 1536。我的阅读方式有问题吗?

【问题讨论】:

    标签: sshd apache-mina


    【解决方案1】:

    在浏览了许多示例和 Apache mina 库之后,我发现问题在于我们从 mina 核心 IoSession 中读取的方式。

    正确的阅读方式::

    int r=ioBuffer.remaining();
    byte[] b=new byte[r];
    ioBuffer.get(b,0,r);
    
    Buffer buf = new Buffer(b);
    AbstractSession.getSession(tcpSession).messageReceived(buf)
    

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 2015-09-02
      • 2015-07-01
      • 2013-10-14
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      相关资源
      最近更新 更多