Безопасные веб-сокеты с самозаверяющим сертификатом - PullRequest
26 голосов
/ 15 марта 2011

Я хочу использовать безопасные веб-сокеты для повышения уровня успеха.Мне не нужно шифрование.

Должен ли я видеть предупреждение при использовании защищенных веб-сокетов (wss: //example.com) с самозаверяющим сертификатом?Я попробовал это с Chrome 10, и я не вижу предупреждения, и он не просит меня принять сертификат.Это просто работает.

Это ошибка в Chrome или ожидаемое поведение?Смогу ли я использовать самозаверяющие сертификаты в будущем?

Спасибо

Ответы [ 3 ]

19 голосов
/ 15 марта 2011

Да, это текущее поведение Chrome, но я бы не ожидал, что он останется таким же в будущем. В Firefox 4 (если вы включите WebSockets в about: config) вы получите предупреждение о сертификате. Чтобы утвердить сертификат, вам также может понадобиться ввести URL-адрес WebSockets в браузере (замените wss на https) и сначала утвердить его там (поскольку предупреждение от соединения WebSockets о самозаверяющем сертификате может не дать вам возможность утвердить его ).

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

14 голосов
/ 13 апреля 2014

Самоподписанные сертификаты отклоняются Chrome начиная с версии v19 (http://crbug.com/53836). Если вы попытаетесь подключиться к URL-адресу wss, который использует самоподписанный сертификат, запрос будет автоматически отменен.
Чтобы разрешить использование самозаверяющих сертификатов, запустите Chrome с флагом --ignore-certificate-errors, e, g:

chromium --user-data-dir=/tmp/whatever --ignore-certificate-errors

Насколько мне известно, нет способа заставить Firefox принять ваш самоподписанный сертификат для wss. Так что просто используйте ws:// для тестирования в Firefox. Если вы тестируете свое веб-приложение по протоколу https, вам нужно переключить параметр, чтобы разрешить подключения к (небезопасным) ws:// URL-адресам:

  1. Визит about:config
  2. Установить network.websocket.allowInsecureFromHTTPS на true
12 голосов
/ 14 января 2015

Я получил его, выполнив следующее:

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...