NodeJS SSH身份验证主机和命令执行

时间:2014-09-27 22:48:32

标签: node.js ssh

我希望有一个NodeJS应用程序,我可以通过SSH使用公钥连接到该应用程序并发送一些数据。为了更明确,它应该如下:

  • NodeJS应用程序编写了一些函数
  • 从服务器上我ssh the nodejs应用程序并尝试通过我的公钥识别我
  • 我通过身份验证后,我可以发送一些字符串,应用程序将解析字符串并执行不同的功能

唯一的问题是我无法使用现有的任何SSH npm软件包进行此操作。我希望nodejs应用程序只接受SSH连接并进行身份验证并等待一些字符串。这可能吗?

编辑:我想采用这种方法,因为我只想调用节点函数来执行某些允许的客户端(服务器),我不想通过HTTP发送这些请求,所以任何人都可以访问它/ p>

1 个答案:

答案 0 :(得分:3)

如果您想使用证书,最好不要在客户端证书中使用HTTPS,而不是在节点内使用SSH服务器(尽管您可以使用ssh模块,绑定到libssh2)。

以下是您设置HTTPS服务器的方法:

var https = require('https'),
    fs = require('fs');

var options = {
  key: fs.readFileSync('server.key'), // server private key
  cert: fs.readFileSync('server.crt'), // server certificate
  ca: fs.readFileSync('server_ca.crt'), // server CA, this can be an array of CAs too
  requestCert: true
};

https.createServer(options, function(req, res) {
  if (req.client.authorized) {
    res.writeHead(200);
    res.end('Hello world!');
  } else {
    res.writeHead(401);
    res.end();
  }
}).listen(443);

然后,只需使用您的HTTPS客户端使用的服务器CA生成客户端证书。

用于连接HTTPS服务器:

对于cURL ,命令行类似于:curl -v -s --cacert server_ca.crt --key client.key --cert client.crt https://localhost或跳过服务器验证:curl -v -s -k --key client.key --cert client.crt https://localhost

对于node.js ,您可以使用以下客户端代码:

var https = require('https'),
    fs = require('fs');

var options = {
  // normal http.request()-specific options
  method: 'GET',
  path: '/',

  // tls.connect()-specific options
  key: fs.readFileSync('client.key'), // client private key
  cert: fs.readFileSync('client.crt'), // client certificate
  ca: fs.readFileSync('server_ca.crt'), // server CA, this can be an array of CAs too
  // or comment out the `ca` setting and use the following to skip server verification,
  // similar to cURL's `-k` option:
  //rejectUnauthorized: false
};

https.request(options, function(res) {
  if (res.statusCode === 200)
    console.log('Accepted!');
  else
    console.log('Rejected!');

  // drain and discard any response data
  res.resume();
}).end();
相关问题