Как подключиться к узлу socket.io-сервер из узла socket.io-клиент ** с помощью HTTPS**

#node.js #sockets #socket.io

#node.js #сокеты #socket.io

Вопрос:

Я настроил сокет-сервер следующим образом:

 /* node-server.js */
var port = 3333;
var fs = require('fs');
var options = {
    key: fs.readFileSync('ssl/server.key'),
    cert: fs.readFileSync('ssl/server.crt')
};
var server = require('https').Server(options);
var io = require('socket.io')(server);
console.log('Socket server listening on port '   port   '.');
server.listen(port);
io.sockets.on('connection', function(socket) {
    console.log("Client "   socket.id   " connected.");
});
  

И клиент узла, который подключается к нему:

 /* node-client.js */
var url = 'https://localhost:3333';
console.log('Connecting to '   url);
var io = require('socket.io-client');
var socket = io.connect(url, { reconnection: false });
socket.on('connect_error', function(error){ console.log('Error connecting to '   url, error);});
socket.on('connect', function() {
    console.log('Connected to '   url);
});
  

Однако при попытке подключиться я получаю сообщение об ошибке { [Error: xhr poll error] description: 503 } .

Эта ошибка исчезает, и все просто работает, если я удаляю компонент «HTTPS». Вот разница, показывающая, что именно я имею в виду.

Однако я не уверен, что проблема в HTTPS, потому что вот другой клиент (на этот раз в браузере вместо узла), который может нормально подключаться:

 <!DOCTYPE html>
<html>
<head>
    <script type="text/javascript"
        src="https://localhost:3333/socket.io/socket.io.js"></script>
</head>
<body onload="io.connect('https://localhost:3333');">
</body>
</html>
  

Как я могу заставить узел socket.io-client подключиться к узлу socket.io-server через HTTPS?

Комментарии:

1. приятно отметить, что этот вопрос и ответ касаются только самозаверяющих сертификатов.

Ответ №1:

Включено Node.js , TLS и HTTPS будет проверять сертификаты перед их принятием. Поэтому, чтобы использовать самозаверяющие сертификаты с узлом, вам нужно будет установить rejectUnauthorized опцию при выполнении запросов к false , или использовать:

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
  

Ответ №2:

Решением было добавить эту строку в клиент:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

Я обнаружил, что если я вручную отправил запросы HTTPS на сервер сокетов:

 var https = require('https');
var options = { host: 'localhost',
    port: '3333',
    path: '/socket.io/?EIO=3amp;transport=pollingamp;t=1404103832354-0amp;b64=1',
    method: 'GET',
    headers:
    { 'User-Agent': 'node-XMLHttpRequest',
    Accept: '*/*',
    Host: 'localhost:3333' },
    agent: false
};
https.globalAgent.options.rejectUnauthorized = false;
https.request(options, function() {
    console.log(arguments);
    throw 'done';
});
  

… тогда запросы завершатся ошибкой: DEPTH_ZERO_SELF_SIGNED_CERT

Socket.io , казалось бы, не смог сделать запросы по этой причине.

После поиска ошибки в Google я нашел эту страницу.

На этой странице кто-то предложил решение выше, которое работает.

По сути, я считаю, что он разрешает самозаверяющие сертификаты, которые могут быть «небезопасными».