2014-09-27 41 views
1

我想要一个NodeJS应用程序,我可以通过SSH与公钥连接并向其发送一些数据。为了更明确它应该如下:NodeJS SSH身份验证主机和命令执行

  • 的NodeJS应用程序有书面
  • 从我SSH方式的NodeJS应用程序的服务器的某些功能,并试图通过找出我我的公钥
  • 我验证后,我可以发送一些字符串,应用程序将解析字符串并执行不同的功能

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

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

+0

SSH通常允许您执行命令,该命令可以针对您的节点应用程序。你为什么要在节点上做SSH部分? – sje397 2014-09-27 22:51:13

+0

,因为我没有使用一些bsh脚本来运行SSH中的参数,而只是想执行一些执行多项任务的节点功能。而不是使用HTTP请求从服务器调用节点应用程序,我希望去SSH类型的连接,因为它更安全。因为我只想允许请求来自只有几个允许的客户端 – roshkattu 2014-09-27 22:53:14

+0

HTTPS不够好?另一种选择是将您的节点应用设置为用户的登录shell :) – sje397 2014-09-27 22:54:54

回答

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 -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();