Безопасные веб-сокеты с самозаверяющим сертификатом
Я хочу использовать безопасные веб-сокеты для повышения уровня успеха. Мне не нужно шифрование.
Должен ли я видеть предупреждение при использовании защищенных веб-сокетов (wss://example.com) с самозаверяющим сертификатом? Я попробовал это с Chrome 10, и я не вижу предупреждения, и он не просит меня принять сертификат. Это просто работает.
Это ошибка в Chrome или ожидаемое поведение? Смогу ли я использовать самозаверяющие сертификаты в будущем?
Спасибо
5 ответов
Да, это текущее поведение Chrome, но я не ожидал бы, что это будет оставаться политикой в будущем. В Firefox 4 (если вы включите WebSockets в about:config) вы получите предупреждение о сертификате. Чтобы утвердить сертификат, вам также может понадобиться ввести URL-адрес WebSockets в браузере (замените wss на https) и сначала утвердить его там (поскольку предупреждение от соединения WebSockets о самозаверяющем сертификате может не дать вам возможность утвердить его).
Я ожидал бы, что все браузеры соберутся на правильном поведении, которое вызовет диалоговое окно с предупреждением, которое позволяет одобрить самоподписанный сертификат.
Самоподписанные сертификаты отклоняются Chrome начиная с версии 19 ( http://crbug.com/53836). Если вы попытаетесь подключиться к URL-адресу wss, который использует самозаверяющий сертификат, запрос будет автоматически отменен.
Чтобы разрешить использование самозаверяющих сертификатов, запустите Chrome с --ignore-certificate-errors
флаг, е, г:
chromium --user-data-dir=/tmp/whatever --ignore-certificate-errors
Насколько мне известно, нет никакого способа заставить Firefox принять ваш самозаверяющий сертификат для wss. Так что просто используйте ws://
для тестирования в Firefox. Если вы тестируете свое веб-приложение по протоколу https, вам нужно переключить настройку, чтобы разрешить подключения (небезопасно) ws://
URL-адрес:
- Визит
about:config
- Задавать
network.websocket.allowInsecureFromHTTPS
вtrue
Я получил это, работая следующим образом:
https://github.com/einaros/ws/blob/master/test/WebSocketServer.test.js#L514
Сначала создайте свои подписанные сертификаты:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes
Затем создайте ваш httpsServer из экспресс-приложения, используя встроенный https-сервер узла:
var privateKey = fs.readFileSync('sslcert/key.pem', 'utf8');
var certificate = fs.readFileSync('sslcert/cert.pem', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();
//... bunch of other express stuff here ...
//pass in your express app and credentials to create an https server
var httpsServer = https.createServer(credentials, app);
httpsServer.listen(8443);
Затем настройте свой сервер веб-сокетов (по иронии судьбы он будет использовать тот же порт, что и http-сервер, я не знал этого, но, полагаю, протоколы могут совместно использовать порты? - это заставило меня ненадолго).
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({
server: httpsServer
});
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
Теперь перейдите к https://0.0.0.0:8443
сервер и принять самоподписанный сертификат в Chrome. Тогда веб-сокеты теперь должны работать внутри браузера.
Откройте консоль Chrome Devtools и введите:
var ws = new WebSocket('wss://0.0.0.0:8443');
ws.send('foo');
.... или любой другой узел: порт, который вы использовали для httpsServer, ключ здесь вы используете wss://
протокол
На вашем узле экспресс веб-сервера вы должны увидеть сообщение, записанное на консоль. Запустите сервер с node ./server.js
http://www.chovy.com/web-development/self-signed-certs-with-secure-websockets-in-node-js/
Когда вы используете wscat
, тогда вы можете использовать флаг -n (-n, --no-check: не проверять наличие неавторизованных сертификатов)
wscat -c "wss://30.90.212.255:8000" -n
У меня была аналогичная проблема с подключением кwss://...
с моим самоподписанным сертификатом. Решение состоит в том, чтобы принять сертификат в браузере:
- перейти к соответствующему
https://...
сайт в браузере Chrome - нажмите кнопку «Дополнительно»
- нажмите «перейти к xxx (небезопасно)»