web-dev-qa-db-ja.com

自己署名証明書でWebソケットを保護する

安全なWebsocketを使用して成功率を高めたい。暗号化は必要ありません。

自己署名証明書で安全なWebsocket(wss://example.com)を使用しているときに警告が表示されると思いますか? Chrome 10で試してみましたが、警告が表示されず、証明書の受け入れを求められません。正常に機能します。

これはchromeまたは予想される動作のバグですか?将来、自己署名証明書を使用できますか?

ありがとう

29
pablo

うん、それはChromeの現在の振る舞いですが、今後もポリシーであり続けるとは思わないでしょう。Firefox4(about:configでWebSocketsを有効にすると)証明書に関する警告。証明書を承認するには、ブラウザにWebSockets URLを入力し(wssをhttpsに置き換え)、そこで承認する必要がある場合があります(自己署名証明書に関するWebSockets接続からの警告が表示されない場合があるため)あなたがそれを承認する機会)。

すべてのブラウザは、自己署名証明書の承認を許可する警告ダイアログを表示する正しい動作に収束することを期待しています。

20
kanaka

V19以降、自己署名証明書はChromeによって拒否されます( http://crbug.com/53836 )。自己署名証明書を使用するwss URLに接続しようとすると、要求はサイレントに中止されます。
自己署名証明書の使用を許可するには、Chromeを--ignore-certificate-errorsフラグで開始します。例:

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

私の知る限り、Firefoxにwssの自己署名証明書を許可させる方法はありません。したがって、Firefoxでのテストにはws://を使用するだけです。 Webアプリをhttpsでテストしている場合、(安全でない)ws:// URLへの接続を許可するように設定を切り替える必要があります。

  1. about:configにアクセスします
  2. network.websocket.allowInsecureFromHTTPStrueに設定します
14
Rob W

私はこれに従うことでそれを得ました:

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で自己署名証明書を受け入れます。これで、websocketはブラウザーで動作するようになります。

chrome devtoolsコンソールを開き、次のように入力します。

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

....またはhttpsServerに使用したHost:portに関係なく、ここで重要なのはwss://プロトコルを使用していることです

Node Express Webサーバーで、コンソールにログ記録されたメッセージが表示されるはずです。 node ./server.jsでサーバーを起動します

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

12
chovy