2013-03-16 17 views
17

Mam aplikację node.js, która używa socket.IO. Działa dobrze na http, ale przy próbie połączenia z gniazdem przez https - nic się nie dzieje.
Oto niektóre części kodu:Socket.IO nie może się połączyć przez https

var fs = require('fs'); 

var ioHttp = require('socket.io').listen(8899, { 
    'flash policy port': -1 
}); 

initSocket(ioHttp); 

var ioHttps = require('socket.io').listen(8895, { 
    key: fs.readFileSync('/path/to/file/file.key'), 
    cert: fs.readFileSync('/path/to/file/file.crt'), 
    ca: [ 
     fs.readFileSync('/path/to/file/sub.class1.server.ca.pem'), 
     fs.readFileSync('/path/to/file/ca.pem') 
    ], 
    'flash policy port': -1 
}); 

initSocket(ioHttps); 

a funkcja initSocket:

function initSocket(io) { 
    io.enable('browser client minification'); 
    io.enable('browser client etag'); 
    io.enable('browser client gzip'); 

    io.set('transports', [ 
     'websocket', 
     'htmlfile', 
     'flashsocket', 
     'jsonp-polling' 
    ]); 

    io.sockets.on('connection', function (client) { 
     //the connnection is handled here 
    }); 
} 

Klient połączyć tak:

var secureConnection = false; 
var port = 8899; 
if (window.location.protocol === 'https:') { 
    port = 8895; 
    secureConnection = true; 
} 

var socket = io.connect('domain.org', {port: port, secure: secureConnection}); 

Jak powiedziałem wszystko działa poprawnie na http, ale połączenie w https daje mi "Połączenie zostało przerwane". Co ja robię źle?

Odpowiedz

40

Nie można zainicjować serwera socket.io, takiego jak https. Musisz uruchomić oddzielny serwer https, a następnie dołączyć do niego serwer socket.io.

var https = require('https'),  
    fs = require('fs');   

var options = { 
    key: fs.readFileSync('ssl/server.key'), 
    cert: fs.readFileSync('ssl/server.crt'), 
    ca:  fs.readFileSync('ssl/ca.crt') 
}; 
var app = https.createServer(options); 
io = require('socket.io').listen(app);  //socket.io server listens to https connections 
app.listen(8895, "0.0.0.0"); 
+1

Czy możesz samodzielnie podpisać lub czy socket.io zachowuje się jak zwykły HTTP w przeglądarkach, w których sprawdza certyfikaty i ostrzega? – Titan

+0

Hej, gdzie dostaniesz server.key, server.crt i ca.crt? czy to jest self-made? czy będzie działać na produkcji, jeśli zrobi się samodzielnie? –

+1

@GreenGiant Wyszukaj requestCert i odrzućNieautoryzowane opcje wewnętrzne w [dokumentacji] (http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener) – user568109

Powiązane problemy