Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS SSH身份验证主机和命令执行_Node.js_Ssh - Fatal编程技术网

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

Node.js NodeJS SSH身份验证主机和命令执行,node.js,ssh,Node.js,Ssh,我希望有一个NodeJS应用程序,我可以使用公钥通过SSH连接到该应用程序,并向其发送一些数据。更明确地说,应该如下所示: NodeJS应用程序编写了一些函数 我从服务器ssh nodejs应用程序,并试图通过公钥识别我 经过身份验证后,我可以向它发送一些字符串,应用程序将解析字符串并执行不同的函数 唯一的问题是,我无法在任何SSH-npm包存在的情况下做到这一点。我希望nodejs应用程序只接受SSH连接并进行身份验证,然后等待一些字符串。这可能吗 编辑:我想使用这种方法,因为我只想调用节

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

  • NodeJS应用程序编写了一些函数
  • 我从服务器ssh nodejs应用程序,并试图通过公钥识别我
  • 经过身份验证后,我可以向它发送一些字符串,应用程序将解析字符串并执行不同的函数
唯一的问题是,我无法在任何SSH-npm包存在的情况下做到这一点。我希望nodejs应用程序只接受SSH连接并进行身份验证,然后等待一些字符串。这可能吗


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

您最好使用带有客户端证书的HTTPS,而不是在节点内使用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服务器,请执行以下操作:

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);
对于cURL,命令行类似于:
cURL-v-s--cacert server\u ca.crt--key client.key--cert client.crthttps://localhost
或跳过服务器验证:
curl-v-s-k--key client.key--cert client.crthttps://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();

SSH通常允许您执行命令,这些命令可以指向您的节点应用程序。为什么要在node中执行SSH部分?因为,我不想使用SSH中的params运行一些bash脚本,我只想执行一些执行多个任务的节点函数。我不想通过HTTP请求从服务器调用节点应用程序,而是希望因为SSH类型的连接更安全,所以我选择SSH类型的连接。因为我只想允许请求来自几个允许的客户端。HTTPS不够好?另一个选项是将节点应用程序设置为用户的登录shell:)HTTPS足够好。但我的主要问题是,我不希望请求来自给定服务器之外的任何其他IP。因此,其他任何人都无法触发来自任何其他IP的请求。到目前为止,我使用express只允许来自1个IP的请求。但是在该特性中,我必须允许来自我拥有的其他多个服务器的请求,并且该脚本将在许多其他服务器上运行。这将导致管理混乱。此应用程序将部署在多个服务器/VP上。因此,如果我要更新允许的IP地址,那么在每个服务器/vps上更新允许的IP请求将是一个混乱。这就是为什么我要研究类似的东西,这样我就可以通过公钥进行身份验证。