web-dev-qa-db-fra.com

Websockets sécurisés avec certificat auto-signé

Je souhaite utiliser des Websockets sécurisés pour améliorer le taux de réussite. Je n'ai pas besoin du cryptage.

Suis-je supposé voir un avertissement lors de l'utilisation de Websockets sécurisés (wss: //example.com) avec un certificat auto-signé? Je l'ai essayé avec Chrome 10 et je ne vois pas d'avertissement et il ne me demande pas d'accepter le certificat. Cela fonctionne.

Est-ce un bogue dans chrome ou le comportement attendu? Pourrai-je utiliser des certificats auto-signés à l'avenir?

Merci

29
pablo

Oui, c'est le comportement actuel de Chrome mais je ne m'attendrais pas à ce que cela continue d'être la politique à l'avenir. Dans Firefox 4 (si vous activez WebSockets dans about: config), vous obtiendrez un avertissement concernant le certificat. Pour approuver le certificat, vous devrez peut-être également saisir l'URL WebSockets dans le navigateur (remplacer wss par https) et l'approuver en premier (car l'avertissement de la connexion WebSockets concernant le certificat auto-signé peut ne pas donner vous l'opportunité de l'approuver).

Je m'attendrais à ce que tous les navigateurs convergent vers le comportement correct qui consiste à afficher une boîte de dialogue d'avertissement qui permet au certificat auto-signé d'être approuvé.

20
kanaka

Les certificats auto-signés sont rejetés par Chrome depuis la v19 ( http://crbug.com/53836 ). Si vous essayez de vous connecter à une URL wss qui utilise un certificat auto-signé, puis la demande est abandonnée en silence.
Pour autoriser l'utilisation de certificats auto-signés, démarrez Chrome avec le --ignore-certificate-errors drapeau, e, g:

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

À ma connaissance, il n'y a aucun moyen pour que Firefox accepte votre certificat auto-signé pour wss. Donc, utilisez simplement ws:// pour les tests dans Firefox. Si vous testez votre application Web via https, vous devez basculer une préférence pour autoriser les connexions à (non sécurisé) ws:// URL:

  1. Visite about:config
  2. Ensemble network.websocket.allowInsecureFromHTTPS à true
14
Rob W

Je l'ai fait fonctionner en suivant ceci:

https://github.com/einaros/ws/blob/master/test/WebSocketServer.test.js#L514

Générez d'abord vos certificats auto-signés:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes

Créez ensuite votre httpsServer à partir d'une application express à l'aide du serveur https intégré du nœud:

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

Ensuite, configurez votre serveur websocket (ironiquement, cela utilisera le même port que le serveur http, je ne le savais pas, mais je suppose que les protocoles peuvent partager des ports? - cela m'avait pendant un certain temps).

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

Naviguez maintenant vers https://0.0.0.0:8443 serveur et acceptez le certificat auto-signé dans Chrome. Ensuite, les Websockets devraient maintenant fonctionner à l'intérieur du navigateur.

Ouvrez une console chrome devtools et tapez:

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

.... ou n'importe quel port Host: que vous avez utilisé pour httpsServer, la clé ici est que vous utilisez wss:// protocole

Sur votre serveur Web node express, vous devriez voir un message enregistré sur la console. Démarrez le serveur avec node ./server.js

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

12
chovy