Настройте связь между сервером и сервером по протоколу SSL с помощью socket.io в файле node.js.

Я пытаюсь настроить соединение между серверами, используя socket.io поверх ssl-соединения. Это мой пример:

/**
 * Server
 */


var app = require('express')();
var config = require('./config');
var https = require('https');
var http = require('http');
var fs = require('fs');
var server = https.createServer({key: fs.readFileSync(config.ssl.key), cert: fs.readFileSync(config.ssl.cert), passphrase: config.ssl.passphrase}, app);
//var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.listen(config.port);

app.get('/', function (req, res) {
    res.send('Server');
  //res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});



/**
 * Client
 */


var io = require('socket.io-client');
//var socket = io.connect('http://localhost', {port: 8088});
var socket = io.connect('https://localhost', {secure: true, port: 8088});
  socket.on('connect', function(){
    socket.on('event', function(data){});
    socket.on('disconnect', function(){});
  });

Код работает нормально при запуске без SSL. Я подозреваю, что мой самозаверяющий сертификат может быть не принят, но я не знаю, как заставить клиента принять его.

Пожалуйста, покажите мне, как: 1. Принять самозаверяющий сертификат SSL. или 2. Помогите мне сделать эту работу другим способом.

Заранее спасибо.

4 ответа

Решение

После еще нескольких поисков добавление этого в клиент заставляет его работать:

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

/**
 * Client
 */


var io = require('socket.io-client');
//var socket = io.connect('http://localhost', {port: 8088});

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

var socket = io.connect('https://localhost', {secure: true, port: 8088});
  socket.on('connect', function(){
    socket.on('event', function(data){});
    socket.on('disconnect', function(){});
  });

Мне пришлось сделать что-то немного по-другому на клиенте, чтобы заставить это работать, вручную указав socket.io, чтобы он также использовал этого агента (и secure: true подразумевается https:). Вот:

// Client
var io = require('socket.io-client');
var https = require('https');
https.globalAgent.options.rejectUnauthorized = false;
var socket = io.connect('https://localhost:3210/', { agent: https.globalAgent });
socket.on('connect', function(){ console.log('connected'); });

Это использует socket.io v1.0.2.

В качестве альтернативы, у меня также был успех со следующим, как указано здесь: Socket.io + SSL + самозаверяющий сертификат CA выдает ошибку при подключении

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
var io = require('socket.io-client');
var socket = io.connect('https://localhost:3210/');
socket.on('connect', function(){ console.log('connected'); });

Предыдущие ответы не сделали это для меня. require('https').globalAgent всегда undefined,

Поиски и нашел rejectUnauthorized параметр в документах ( https://nodejs.org/api/tls.html). Не уверен, связан ли он с SocketIO, но он как-то работает с самозаверяющими сертификатами:

var socket = io.connect('//yourhost:8000', {secure: true, rejectUnauthorized: false})

secure: true может быть необязательным, но мне все равно нравится применять его.

Хотя все вышеперечисленные решения сосредоточены на rejectUnauthorized=falseЯ хотел бы предложить альтернативу.

const https = require('https');
const rootCas = require('ssl-root-cas').create();
rootCas.addFile('cert/ca.crt');
https.globalAgent.options.ca = rootCas; // optional

const io = require("socket.io-client");
var socket = io.connect("https://...", { agent: https.globalAgent });
Другие вопросы по тегам