Nodejs:node-webkit 使用ssh2出错

Nodejs:node-webkit 使用ssh2出错

大家好,在使用node-webkit开发中使用了ssh2库链接远程主机,在连接的时候有时候会出现下面这个错误,平台是在windows下:

Uncaught node.js Error 
Error: Initialization failed
at new DiffieHellman (crypto.js:438:21)
at Object.DiffieHellman (crypto.js:431:12)
at onKEXDH_GEX_GROUP (E:\work\Toki\node_modules\ssh2\lib\Connection.js:1628:22)
at Parser.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:117:5)
at Parser.EventEmitter.emit (events.js:101:17)
at Parser.parsePacket (E:\work\Toki\node_modules\ssh2\lib\Parser.js:459:12)
at Parser.execute (E:\work\Toki\node_modules\ssh2\lib\Parser.js:249:14)
at Socket.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:506:18)
at Socket.EventEmitter.emit (events.js:98:17)
at readableAddChunk (_stream_readable.js:156:16)

4 回复

Nodejs:node-webkit 使用ssh2出错

大家好,在使用node-webkit开发中使用了ssh2库连接远程主机时,有时候会出现以下错误。平台是在Windows下:

Uncaught node.js Error
Error: Initialization failed
    at new DiffieHellman (crypto.js:438:21)
    at Object.DiffieHellman (crypto.js:431:12)
    at onKEXDH_GEX_GROUP (E:\work\Toki\node_modules\ssh2\lib\Connection.js:1628:22)
    at Parser.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:117:5)
    at Parser.EventEmitter.emit (events.js:101:17)
    at Parser.parsePacket (E:\work\Toki\node_modules\ssh2\lib\Parser.js:459:12)
    at Parser.execute (E:\work\Toki\node_modules\ssh2\lib\Parser.js:249:14)
    at Socket.eval (E:\work\Toki\node_modules\ssh2\lib\Connection.js:506:18)
    at Socket.EventEmitter.emit (events.js:98:17)
    at readableAddChunk (_stream_readable.js:156:16)

解决方法

该错误通常是由于某些加密算法或库版本不兼容引起的。以下是一些可能的解决方法:

  1. 更新ssh2库:确保你使用的ssh2库是最新的版本。

    npm install ssh2[@latest](/user/latest)
    
  2. 检查Node.js版本:确保你的Node.js版本与ssh2库兼容。ssh2通常支持最新的稳定版Node.js。

  3. 禁用Diffie-Hellman密钥交换:如果上述方法无效,可以尝试禁用Diffie-Hellman密钥交换,因为这可能是问题的根源。

    示例代码:

    const Client = require('ssh2').Client;
    
    const conn = new Client();
    conn.on('ready', () => {
      console.log('Client :: ready');
      conn.exec('ls -lh /etc', (err, stream) => {
        if (err) throw err;
        stream.on('close', (code, signal) => {
          console.log(`Stream :: close :: code: ${code}, signal: ${signal}`);
          conn.end();
        }).on('data', (data) => {
          console.log(`STDOUT: ${data}`);
        }).stderr.on('data', (data) => {
          console.log(`STDERR: ${data}`);
        });
      });
    }).connect({
      host: 'example.com',
      port: 22,
      username: 'username',
      password: 'password',
      algorithms: {
        kex: ['diffie-hellman-group1-sha1'] // 禁用Diffie-Hellman密钥交换
      }
    });
    
  4. 使用其他加密算法:如果禁用Diffie-Hellman密钥交换仍然无法解决问题,可以尝试使用其他加密算法。例如,你可以指定支持的密钥交换算法列表。

通过以上步骤,你应该能够解决在node-webkit中使用ssh2时遇到的初始化失败问题。希望这些解决方案能帮助到你!


打开nw,输入nw:version。看看Node.js的版本号,我用的是0.8.4做测试,Node.js的版本是0.11.*。 这个错误的原因是Node.js的问题,我用0.11的Node.js跑ssh库得到的结果也不不稳定。

有bug到这里提交吧,https://github.com/rogerwang/node-webkit/issues/

恩恩,已经提交,版本改为,node-webkit 版本改为0.8.* 之后没有出现问题,node.js 是v0.10.*,谢谢

这个问题通常是由于在Windows平台上使用ssh2库时缺少OpenSSL支持导致的。ssh2库依赖于OpenSSL来进行一些加密操作,如Diffie-Hellman密钥交换等。

解决方案:

1. 安装OpenSSL

确保你的系统已经安装了OpenSSL,并且环境变量PATH中包含了OpenSSL的路径。你可以从OpenSSL官网下载适用于Windows的OpenSSL版本。

2. 指定OpenSSL路径

如果你在Node.js环境中使用ssh2库,可以通过设置环境变量来指定OpenSSL路径。可以在启动应用之前设置环境变量:

set OPENSSL_CONF=C:\path\to\openssl.cnf

或者在代码中动态设置:

process.env.OPENSSL_CONF = 'C:\\path\\to\\openssl.cnf';

3. 示例代码

以下是一个简单的示例代码,展示如何使用ssh2连接到远程服务器:

const Client = require('ssh2').Client;

const conn = new Client();
conn.on('ready', () => {
    console.log('Client :: ready');
    conn.exec('uptime', (err, stream) => {
        if (err) throw err;
        stream.on('close', (code, signal) => {
            console.log(`Stream :: close :: code: ${code}, signal: ${signal}`);
            conn.end();
        }).on('data', (data) => {
            console.log(`STDOUT: ${data}`);
        }).stderr.on('data', (data) => {
            console.log(`STDERR: ${data}`);
        });
    });
}).connect({
    host: 'example.com',
    port: 22,
    username: 'username',
    password: 'password'
});

注意事项:

  • 确保OpenSSL配置文件(openssl.cnf)的路径正确。
  • 如果问题仍然存在,尝试更新ssh2库到最新版本。
  • 在某些情况下,可能需要重新编译ssh2库以支持特定的OpenSSL版本。

希望这些步骤能够帮助你解决问题。

回到顶部