简体   繁体   中英

How to make 2 nodejs servers connect with SSL websocket?

I am trying to make 2 servers communicate via socket.io library and SSL.

This used to work until an upgrade of socket.io package (can't tell you which).

I have managed to fix secure connection with a browser. I have also made it work between unsecure (http) servers. But the secure (https) servers refuse to connect between themselves. You may argue that socket.io is not made for server to server communications, but it would save me lots of work to fix it.

I am now running:

node: 7.5.0
express: 4.16.2
socket.io (and socket.io-client): 2.0.3

I cannot even make simple examples below work (removing all my middleware).

node server

// Use SSL certificate
const cert_path = "..";
const fs = require('fs');
const https_options = {
    key:  fs.readFileSync(cert_path+'/privkey.pem'),
    cert: fs.readFileSync(cert_path+'/cert.pem')
};

const app = require('express')();

const https = require('https');
const server = https.createServer(https_options, app);

const io = require('socket.io')(server);

server.listen(8000);

io.on('connection', function (socket) {
    console.log("connected");
});

node client

const io = require('socket.io-client');

const socket = io.connect(
    'https://localhost:8000',
    {secure: true}
);

socket.on("connect", function () {
    console.log("connected");
});

Nothing happens, none of them connect. Any idea why?


EDIT: I'm getting both connect_error and reconnect_error that pop every 5s on client side:

{ Error: xhr poll error
    at XHR.Transport.onError (../node_modules/engine.io-client/lib/transport.js:64:13)
    at Request.<anonymous> (../node_modules/engine.io-client/lib/transports/polling-xhr.js:128:10)
    at Request.Emitter.emit (../node_modules/component-emitter/index.js:133:20)
    at Request.onError (../node_modules/engine.io-client/lib/transports/polling-xhr.js:310:8)
    at Timeout._onTimeout (../node_modules/engine.io-client/lib/transports/polling-xhr.js:257:18)
    at ontimeout (timers.js:365:14)
    at tryOnTimeout (timers.js:237:5)
    at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }

Digging further in the errors, I see it may come from the certificate. But while I apply several workarounds of SO, I'm getting consecutively ECONNREFUSED, UNABLE_TO_VERIFY_LEAF_SIGNATURE, and finally DEPTH_ZERO_SELF_SIGNED_CERT...

After trying hard:

  • re-generate my Let's Encrypt certificate
  • re-generate my self-signed certificates (openssl) and use them by server+client
  • tinker with socket.io connect options (secure, rejectUnauthorized, ..)
  • tinker with nodejs global setup even ( process.env['NODE_TLS_REJECT_UNAUTHORIZED'] )

I finally stumbled on this page of github . It solved my issue and it's worth sharing it.

node client

const https = require('https');
https.globalAgent.options.rejectUnauthorized = false;

const io = require('socket.io-client');
const sockets = io.connect('https://localhost:8001', {agent: https.globalAgent});

Even if I would have preferred getting my connection authorized in the first place, this will work for me.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM