使用自签名证书保护websockets

时间:2011-03-15 13:19:10

标签: ssl ssl-certificate websocket

我想使用安全的Websockets来提高成功率。 我不需要加密。

在使用带有自签名证书的安全Websockets(wss://example.com)时,我是否会看到警告? 我尝试使用Chrome 10,我没有看到警告,也没有要求我接受证书。它只是有效。

这是Chrome中的错误还是预期的行为? 我将来能否使用自签名证书?

由于

4 个答案:

答案 0 :(得分:19)

是的,这是Chrome目前的行为,但我不认为它将来会继续成为这项政策。在firefox 4中(如果在about:config中启用WebSockets),您将收到有关证书的警告。要批准证书,您可能还必须在浏览器中输入WebSockets URL(用https代替wss)并首先批准它(因为WebSockets连接中有关自签名证书的警告可能不会给您批准它的机会)。

我希望所有浏览器都能收集正确的行为,即抛出一个允许自签名证书被批准的警告对话框。

答案 1 :(得分:14)

自第19版(http://crbug.com/53836)以来,Chrome拒绝自签名证书。如果您尝试连接到使用自签名证书的wss URL,则会以静默方式中止请求 要允许使用自签名证书,请使用--ignore-certificate-errors标记启动Chrome,例如:

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

据我所知,没有办法让Firefox接受你的wss自签名证书。因此,只需使用ws://在Firefox中进行测试即可。如果您通过https测试自己的网络应用,那么您必须切换首选项以允许连接到(不安全的)ws://网址:

  1. 访问about:config
  2. network.websocket.allowInsecureFromHTTPS设为true

答案 2 :(得分:12)

我按照以下方式开始工作:

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

然后使用节点的内置https服务器从快速应用创建您的httpsServer:

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);

然后设置你的websocket服务器(具有讽刺意味的是,这将使用与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中的自签名证书。然后,websockets现在应该工作在浏览器旁边。

打开chrome devtools控制台并输入:

var ws = new WebSocket('wss://0.0.0.0:8443');
ws.send('foo');

....或者您用于httpsServer的任何主机:端口,此处的关键是您使用wss://协议

在节点快速Web服务器中,您应该看到一条消息记录到控制台。使用node ./server.js

启动服务器

http://www.chovy.com/web-development/self-signed-certs-with-secure-websockets-in-node-js/

答案 3 :(得分:0)

使用wscat时,可以使用-n标志(-n,--no-check:不要检查未经授权的证书)

wscat -c "wss://30.90.212.255:8000" -n