#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 я нашел эту страницу.
На этой странице кто-то предложил решение выше, которое работает.
По сути, я считаю, что он разрешает самозаверяющие сертификаты, которые могут быть «небезопасными».