【问题标题】:NodeJS SSH authentication host and command executionNodeJS SSH认证主机和命令执行
【发布时间】:2014-10-09 07:45:45
【问题描述】:

我想要一个 NodeJS 应用程序,我可以使用公钥通过 SSH 连接到该应用程序并向其发送一些数据。更明确地说,它应该如下所示:

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

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

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

【问题讨论】:

  • SSH 通常允许您执行命令,这些命令可以直接指向您的节点应用程序。为什么要在 node 中做 SSH 部分?
  • 因为,我不想让一些使用来自 SSH 的参数运行的 bash 脚本,我只想执行一些执行多项任务的节点函数。而不是从带有 HTTP 请求的服务器调用节点应用程序,我想使用 SSH 类型的连接,因为它更安全。因为我只想让请求来自少数允许的客户端
  • HTTPS 不够好?另一种选择是将您的节点应用程序设置为用户的登录外壳:)
  • HTTPS 已经足够好了。但我的主要问题是我不希望请求来自任何其他 IP,而不是来自给定服务器的请求。所以没有其他人可以触发来自任何其他 IP 的请求。到目前为止,我使用 express 仅允许来自 1 个 IP 的请求。但在该功能中,我必须允许来自我拥有的其他多台服务器的请求,并且此脚本将在许多其他服务器上运行。这将使管理变得一团糟。
  • 此应用程序将部署在多个服务器/vps 上。因此,如果我要更新允许的 IP 地址,那么访问每个服务器/vps 并更新允许的 IP 请求将是一团糟。这就是为什么我正在研究类似的东西,所以我可以通过公钥进行身份验证。

标签: node.js ssh


【解决方案1】:

如果您想使用证书,最好使用带有客户端证书的 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();

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2019-08-09
    • 2020-07-05
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多