NodeJS服务器 – 服务器安全通信

我有两台服务器在同一个域上使用NodeJS。 (server1.example.com和server2.example.com)

我想以安全的方式将消息从一台服务器发送到另一台服务器。

现在,我正在使用通过发送HTTPS POST(例如https://example.com {secret:XXXXX,message:1234}来发送我的消息。

有没有更干净的方法来做到这一点? 如果是这样,那么确切的步骤是什么? 注意:我在网站上有SSLauthentication。 两台服务器都在同一个域中。

有几个选项我可以想到,当然,如果HTTPS不足以满足特定通信的要求,则这取决于您要查找的encryption和安全性的大小。 (虽然提到你有HTTPS。)

  1. 您可以让发送服务器发布整个JWT路由。 用令牌发送信息并在另一端进行validation。 确保令牌也有一个短的TTL。 (如果你真的想在这里破产,你可以开始实施OAuth2框架,虽然这可能是完全矫枉过正。)

  2. 另外,您可以创build一个WebSocket HTTPS服务器,并且只接受来自特定传入端口信息的信息。 这将允许您使用JWT并通过端口访问进一步validation。 您打开的端口将只允许接受来自特定IP的数据包,这是您的传出服务器。

  3. 您可以通过encryption整个消息(通过一个节点NPM模块或通过encryption)来添加另一个图层,因此消息和秘密都被散列。

  4. 您还可以添加一个caching层(Redis或节点caching模块),在这里将完成所有的解密操作来加速进程。

  5. 另一个使用的技巧,虽然你必须制定出实际的时间表,但要根据stream程或不同的时间,或者你想要的任何时间表来混合你使用的各种哈希例程。

  6. 最后,一个有时被忽视的select是在接收计算机上安装一个防火墙,对接收的内容和从哪里接收的内容都有非常明确的规定。 (虽然这不是一个节点的过程,并可能需要时间才能得到正确的。)

以上都没有链接到Express,或者中间件。 我假设如果你采用上述任何一种,你将需要一些NPM模块的最终结果。

大概忘了一些select,但希望这有助于。

只要添加已经发布的其他解决scheme,就可以在两端使用证书,这样您就可以在TLS层而不是应用程序层进行身份validation了。

假设你在两台服务器上都使用节点,你可以这样做:

  1. 创build一个自定义CA,然后为每个服务器创build一个证书和一个私钥。
  2. 每个服务器可能具有如下代码:

     const tls = require('tls'); function onMessage(socket, msg) { // `msg` is a parsed message received from `socket` } // Receive incoming messages tls.createServer({ rejectUnauthorized: true, requestCert: true, ca: MY_CUSTOM_CA, cert: THIS_SERVER_CERT, key: THIS_SERVER_PRIVATE_KEY }, (socket) => { if (!socket.authorized) return socket.end(); // Certificate did not check out console.log('Connection accepted'); // example protocol: newline-delimited JSON var jsonBuffer = ''; socket.setEncoding('utf8'); socket.on('data', (chunk) => { var chunks = chunk.split('\n'); var numComplete = chunks.length - 1; // Last line does not have trailing newline var incompleteChunk = chunks[numComplete]; if (numComplete === 0) { jsonBuffer += incompleteChunk; return; } chunks[0] = jsonBuffer + chunks[0]; for (var i = 0; i < numComplete; ++i) { try { onMessage(socket, JSON.parse(chunks[i])); } catch (ex) {} } jsonBuffer = incompleteChunk; }); socket.on('end', () => { console.log('Connection ended'); }); }).listen(MY_PORT); // Send outgoing messages function sendMessages(host, port, msgs, cb) { if (!Array.isArray(msgs)) msgs = [msgs]; var req = tls.connect({ host, port, rejectUnauthorized: true, ca: MY_CUSTOM_CA, cert: THIS_SERVER_CERT, key: THIS_SERVER_PRIVATE_KEY }, () => { if (!this.authorized) return this.end(); // Certificate did not check out for (var i = 0; i < msgs.length; ++i) this.write(JSON.stringify(msgs[i]) + '\n'); this.end(); }).once('error', onError).once('close', onClose); function onError(err) { req.removeListener('close', onClose); cb(err); } function onClose() { cb(); } } 
  3. onMessage()添加传入消息处理,并使用sendMessages()发送传出消息。

你也可以只保持一个单独的套接字打开,而不是使用每个外出消息的新连接,但这会涉及一点点,因为你需要添加一个应用程序级别的keepalive机制等等,但是当然可行。

您可以通过HOSTORIGIN标头validation请求的主机,从而增强安全性。

签出: https : //stackoverflow.com/questions/18498726/how-do-i-get-the-domain-originating-the-request-in-express-js

从本质上讲,你应该确保具有encryption秘密的请求实际上来自特定的服务器,而不是任何。