Я пытаюсь запустить socket.io с моим SSL-сертификатом, но он не подключается.
Я основал свой код на примере чата:
var https = require('https');
var fs = require('fs');
/**
* Bootstrap app.
*/
var sys = require('sys')
require.paths.unshift(__dirname + '/../../lib/');
/**
* Module dependencies.
*/
var express = require('express')
, stylus = require('stylus')
, nib = require('nib')
, sio = require('socket.io');
/**
* App.
*/
var privateKey = fs.readFileSync('../key').toString();
var certificate = fs.readFileSync('../crt').toString();
var ca = fs.readFileSync('../intermediate.crt').toString();
var app = express.createServer({key:privateKey,cert:certificate,ca:ca });
/**
* App configuration.
*/
...
/**
* App routes.
*/
app.get('/', function (req, res) {
res.render('index', { layout: false });
});
/**
* App listen.
*/
app.listen(443, function () {
var addr = app.address();
console.log(' app listening on http://' + addr.address + ':' + addr.port);
});
/**
* Socket.IO server (single process only)
*/
var io = sio.listen(app,{key:privateKey,cert:certificate,ca:ca});
...
Если я удаляю код SSL, он работает нормально, однако с ним я получаю запрос на http://domain.com/socket.io/1/?t=1309967919512
Обратите внимание, что он не пытается https, что приводит к сбою.
Я тестирую Chrome, так как это целевой браузер для этого приложения.
Прошу прощения, если это простой вопрос, я новичок в node / socket.io.
Спасибо!
Ответы:
Используйте безопасный URL для вашего начального соединения, то есть вместо «http: //» используйте «https: //». Если выбран транспорт WebSocket, то Socket.IO должен автоматически использовать «wss: //» (SSL) и для подключения WebSocket.
Обновление :
Вы также можете попробовать создать соединение, используя опцию «secure»:
источник
{secure: true}
не требуется, если вы указали https в URL. Вот выдержка из клиентского источника socket.iosecure: 'https' == uri.protocol
(версия 0.9.16), он устанавливает для параметра secure значение true, если в URL-адресе обнаружен https.{secure: true}
не должен был работать правильно.Вот как мне удалось настроить его с помощью Express:
Я надеюсь, что это сэкономит кому-то время.
Обновление: для тех, кто использует, позволяет шифровать это
источник
var server = https.createServer({ key: fs.readFileSync('/etc/letsencrypt/live/domain.name/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/domain.name/cert.pem'), ca: fs.readFileSync('/etc/letsencrypt/live/domain.name/chain.pem'), requestCert: false, rejectUnauthorized: false },app); server.listen(3000);
На той же ноте, если ваш сервер поддерживает оба,
http
иhttps
вы можете подключиться с помощью:для автоматического определения схемы браузера и подключения с использованием http / https соответственно. когда в https, транспорт будет защищен по умолчанию, так как подключение с использованием
будет использовать безопасные веб-сокеты -
wss://
({secure: true}
избыточно).для получения дополнительной информации о том, как легко обслуживать http и https с помощью одного и того же сервера узлов, ознакомьтесь с этим ответом .
источник
Если файл, сертифицированный вашим сервером, не является доверенным (например, вы можете самостоятельно создать хранилище ключей с помощью команды keytool в java), вам следует добавить дополнительную опцию rejectUnauthorized.
источник
проверьте это. Конфигурация ..
источник
Серверный:
Сторона клиента:
источник
В зависимости от ваших потребностей, вы можете разрешить как безопасные, так и незащищенные соединения и при этом использовать только один экземпляр Socket.io.
Вам просто нужно создать два сервера, один для HTTP и один для HTTPS, а затем подключить эти серверы к экземпляру Socket.io.
Сторона сервера:
Сторона клиента :
Если ваш сервер NodeJS отличается от вашего веб-сервера, вам, возможно, потребуется установить некоторые заголовки CORS. Поэтому на стороне сервера замените:
С участием:
И, конечно, отрегулируйте значения заголовков в соответствии с вашими потребностями.
источник
Для корпоративных приложений следует отметить, что вы не должны обрабатывать https в своем коде. Это должно быть автоматически обновлено через IIS или nginx. Приложение не должно знать, какие протоколы используются.
источник
Это мой конфигурационный файл nginx и код iosocket. Сервер (экспресс) прослушивает порт 9191. Хорошо работает: файл конфигурации nginx:
Сервер:
Клиент (реагируют):
источник