nœud.js, socket.io avec SSL

j'essaie d'avoir socket.io tournant avec mon certificat SSL cependant, il ne se connectera pas.

j'ai basé mon code sur l'exemple de chat:

var https = require('https');
var fs = require('fs');
/**
 * Bootstrap app.
 */
var sys = require('sys')
require.paths.unshift(__dirname + '/../../lib/');

/**
* Module dependencies.
*/

var express = require('express')
  , stylus = require('stylus')
  , nib = require('nib')
  , sio = require('socket.io');

/**
 * App.
 */
var privateKey = fs.readFileSync('../key').toString();
var certificate = fs.readFileSync('../crt').toString();
var ca = fs.readFileSync('../intermediate.crt').toString();

var app = express.createServer({key:privateKey,cert:certificate,ca:ca });


/**
 * App configuration.
 */

...

/**
 * App routes.
 */

app.get('/', function (req, res) {
  res.render('index', { layout: false });
});

/**
 * App listen.
 */

app.listen(443, function () {
  var addr = app.address();
  console.log('   app listening on http://' + addr.address + ':' + addr.port);
});

/**
 * Socket.IO server (single process only)
 */

var io = sio.listen(app,{key:privateKey,cert:certificate,ca:ca});
...

si je supprime le code SSL, il fonctionne très bien, cependant avec lui je reçois une requête à http://domain.com/socket.io/1/?t=1309967919512

notez que ce n'est pas le fait d'essayer https, qui cause son échec.

je teste sur chrome, car il est le navigateur cible pour cette application.

Je m'excuse si c'est une question simple, je suis un noeud/socket.je suis nouvelle.

Merci!

136
demandé sur Zeeshan Hassan Memon 2011-07-06 20:00:30

6 réponses

utilisez une URL sécurisée pour votre connexion initiale, i.e. au lieu de" http:// "utilisez"https://". Si le transport WebSocket est choisi, alors Socket.IO devrait automatiquement utiliser "wss: / /" (SSL) pour la connexion WebSocket aussi.

mise à Jour :

vous pouvez également essayer de créer la connexion en utilisant l'option "secure":

var socket = io.connect('https://localhost', {secure: true});
160
répondu kanaka 2011-07-06 20:36:24

C'est ainsi que j'ai pu le configurer avec express:

var fs = require( 'fs' );
var app = require('express')();
var https        = require('https');
var server = https.createServer({
    key: fs.readFileSync('./test_key.key'),
    cert: fs.readFileSync('./test_cert.crt'),
    ca: fs.readFileSync('./test_ca.crt'),
    requestCert: false,
    rejectUnauthorized: false
},app);
server.listen(8080);

var io = require('socket.io').listen(server);

io.sockets.on('connection',function (socket) {
    ...
});

app.get("/", function(request, response){
    ...
})



j'espère que cela fera gagner du temps à quelqu'un.

mise à Jour : pour ceux qui utilisent permet de chiffrer l'utilisation de cette

var server = https.createServer({ 
                key: fs.readFileSync('privkey.pem'),
                cert: fs.readFileSync('fullchain.pem') 
             },app);
32
répondu emonik 2016-12-27 15:19:06

sur la même note, si votre serveur supporte à la fois http et https vous pouvez vous connecter en utilisant:

var socket = io.connect('//localhost');

à détecter automatiquement le navigateur régime et vous connecter en utilisant l'adresse http/https en conséquence. en https, le transport sera sécurisé par défaut, comme connexion en utilisant

var socket = io.connect('https://localhost');

utilisera des sockets Web sécurisés - wss:// (le {secure: true} est redondant).

pour plus informations sur la façon de servir à la fois http et https en utilisant facilement le même serveur de noeud consultez cette réponse .

27
répondu Kuf 2017-05-23 11:46:54

si votre fichier certifié serveur n'est pas fiable, (par exemple, vous pouvez générer le keystore par vous-même avec keytool commande en java), vous devriez ajouter l'option supplémentaire rejettunauthorized

var socket = io.connect('https://localhost', {rejectUnauthorized: false});
6
répondu clevertension 2016-08-23 06:04:27

vérifiez ceci.configuration..

app = module.exports = express();
var httpsOptions = { key: fs.readFileSync('certificates/server.key'), cert: fs.readFileSync('certificates/final.crt') };        
var secureServer = require('https').createServer(httpsOptions, app);
io = module.exports = require('socket.io').listen(secureServer,{pingTimeout: 7000, pingInterval: 10000});
io.set("transports", ["xhr-polling","websocket","polling", "htmlfile"]);
secureServer.listen(3000);
4
répondu Jay Jariwala 2016-10-25 13:00:19

Côté Serveur:

import http from 'http';
import https from 'https';
import SocketIO, { Socket } from 'socket.io';
import fs from 'fs';
import path from 'path';

import { logger } from '../../utils';

const port: number = 3001;

const server: https.Server = https.createServer(
  {
    cert: fs.readFileSync(path.resolve(__dirname, '../../../ssl/cert.pem')),
    key: fs.readFileSync(path.resolve(__dirname, '../../../ssl/key.pem'))
  },
  (req: http.IncomingMessage, res: http.ServerResponse) => {
    logger.info(`request.url: ${req.url}`);

    let filePath = '.' + req.url;
    if (filePath === './') {
      filePath = path.resolve(__dirname, './index.html');
    }

    const extname = String(path.extname(filePath)).toLowerCase();
    const mimeTypes = {
      '.html': 'text/html',
      '.js': 'text/javascript',
      '.json': 'application/json'
    };

    const contentType = mimeTypes[extname] || 'application/octet-stream';

    fs.readFile(filePath, (error: NodeJS.ErrnoException, content: Buffer) => {
      if (error) {
        res.writeHead(500);
        return res.end(error.message);
      }
      res.writeHead(200, { 'Content-Type': contentType });
      res.end(content, 'utf-8');
    });
  }
);

const io: SocketIO.Server = SocketIO(server);

io.on('connection', (socket: Socket) => {
  socket.emit('news', { hello: 'world' });
  socket.on('updateTemplate', data => {
    logger.info(data);
    socket.emit('updateTemplate', { random: data });
  });
});

server.listen(port, () => {
  logger.info(`Https server is listening on https://localhost:${port}`);
});

côté Client:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Websocket Secure Connection</title>
</head>

<body>
  <div>
    <button id='btn'>Send Message</button>
    <ul id='messages'></ul>
  </div>
  <script src='../../../node_modules/socket.io-client/dist/socket.io.js'></script>
  <script>
    window.onload = function onload() {
      const socket = io('https://localhost:3001');
      socket.on('news', function (data) {
        console.log(data);
      });

      socket.on('updateTemplate', function onUpdateTemplate(data) {
        console.log(data)
        createMessage(JSON.stringify(data));
      });
      const $btn = document.getElementById('btn');
      const $messages = document.getElementById('messages');

      function sendMessage() {
        socket.emit('updateTemplate', Math.random());
      }

      function createMessage(msg) {
        const $li = document.createElement('li');
        $li.textContent = msg;
        $messages.appendChild($li);
      }

      $btn.addEventListener('click', sendMessage);
    }
  </script>
</body>

</html>
0
répondu novaline 2018-09-05 06:50:51