2014-02-08 9 views
5

Ich versuche, eine Server-zu-Server-Verbindung mit socket.io über SSL-Verbindung einzurichten. Das ist mein exmaple:Setup Server-Server SSL-Kommunikation mit socket.io in node.js

/** 
* Server 
*/ 


var app = require('express')(); 
var config = require('./config'); 
var https = require('https'); 
var http = require('http'); 
var fs = require('fs'); 
var server = https.createServer({key: fs.readFileSync(config.ssl.key), cert: fs.readFileSync(config.ssl.cert), passphrase: config.ssl.passphrase}, app); 
//var server = http.createServer(app); 
var io = require('socket.io').listen(server); 

server.listen(config.port); 

app.get('/', function (req, res) { 
    res.send('Server'); 
    //res.sendfile(__dirname + '/index.html'); 
}); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 



/** 
* Client 
*/ 


var io = require('socket.io-client'); 
//var socket = io.connect('http://localhost', {port: 8088}); 
var socket = io.connect('https://localhost', {secure: true, port: 8088}); 
    socket.on('connect', function(){ 
    socket.on('event', function(data){}); 
    socket.on('disconnect', function(){}); 
    }); 

Der Code funktioniert gut, wenn ohne SSL lief. Ich vermute, es könnte sein, dass mein selbstsigniertes Zertifikat nicht akzeptiert wird, aber ich weiß nicht, wie ich den Client dazu bringen kann, es zu akzeptieren.

Bitte zeigen Sie mir wie: 1. Akzeptieren Sie selbstsignierte SSL-Zertifikat. oder 2. Helfen Sie mir, diese Arbeit anders zu machen.

Vielen Dank im Voraus.

+0

Nach etwas mehr Graben, fand ich, dass hinzufügen: require ('https'). GlobalAgent.options.rejectUnauthorized = false; vor "var socket" im Client behebt das Problem –

Antwort

9

Nach weiterem Suchen, Hinzufügen dieser im Client macht es Arbeit.

erfordern ('https') globalAgent.options.rejectUnauthorized = false;

/** 
* Client 
*/ 


var io = require('socket.io-client'); 
//var socket = io.connect('http://localhost', {port: 8088}); 

require('https').globalAgent.options.rejectUnauthorized = false; 

var socket = io.connect('https://localhost', {secure: true, port: 8088}); 
    socket.on('connect', function(){ 
    socket.on('event', function(data){}); 
    socket.on('disconnect', function(){}); 
    }); 
+2

Für neue Versionen von node.js müssen Sie auch hinzufügen 'process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;' –

+0

funktionieren wie ein Charme – Quanlong

15

Ich habe die Dinge ein wenig anders auf dem Client zu tun, um dieses zu erhalten, zu arbeiten, indem sie manuell socket.io sagen, auch zu verwenden, dass Agenten (und die secure: true wird angedeutet durch https:). Hier ist es:

// Client 
var io = require('socket.io-client'); 
var https = require('https'); 
https.globalAgent.options.rejectUnauthorized = false; 
var socket = io.connect('https://localhost:3210/', { agent: https.globalAgent }); 
socket.on('connect', function(){ console.log('connected'); }); 

Dies ist mit socket.io v1.0.2.

Alternativ habe ich habe Erfolg mit dem auch folgenden, wie hier hingewiesen: Socket.io + SSL + self-signed CA certificate gives error when connecting

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 
var io = require('socket.io-client'); 
var socket = io.connect('https://localhost:3210/'); 
socket.on('connect', function(){ console.log('connected'); }); 
+0

Arbeitete perfekt! Ich benutze keine selbstsignierten Zertifikate, aber ich möchte in der Lage sein, meine Zertifizierungsprobleme zu ignorieren, wenn ich lokale Unit-Tests mit meiner Entwicklungsumgebung durchführe. Das hat den Trick gemacht! Danke – SB2017

+0

Nach einem ganzen Tag suchen und versuchen, arbeitete Ihre erste Lösung für mich. Der zweite mit hat nicht funktioniert. Vielen Dank! –

5

Die bisherigen Antworten, die es für mich nicht tun. require('https').globalAgent ist immer undefined.

Wurde gesucht und der Parameter rejectUnauthorized in der Dokumentation gefunden (https://nodejs.org/api/tls.html). Nicht sicher, ob es zu SocketIO verwendet, aber es scheint irgendwie mit selbst signierten Zertifikaten zu arbeiten:

var socket = io.connect('//yourhost:8000', {secure: true, rejectUnauthorized: false})

secure: true optional sein könnte, aber Ich mag es sowieso erzwingen.