2014-02-08 141 views
5

我試圖通過ssl連接使用socket.io設置服務器到服務器鏈接。這是我的實例:在node.js中使用socket.io設置服務器 - 服務器SSL通信

/** 
* 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(){}); 
    }); 

當沒有SSL運行時,代碼工作正常。我懷疑這可能是我的自簽名證書未被接受,但我不知道如何讓客戶接受它。

請告訴我如何: 1.接受自簽名SSL證書。 或 2.幫助我以其他方式完成這項工作。

在此先感謝。

+0

經過一番挖掘,我發現加入:require('https')。globalAgent.options.rejectUnauthorized = false;在客戶端的「var socket」修復問題之前 –

回答

9

經過一些搜索,在客戶端加入,這使得它的工作:

要求( '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

對於新版本的node.js,您還必須添加'process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;' –

+0

像魅力一樣工作 – Quanlong

15

我不得不做不同的事情一點在客戶端得到這個工作,通過手動告訴socket.io使用該代理以及(與secure: truehttps:暗示)。這裏是:

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

這是使用socket.io v1.0.2。

另外,我已經與以下以及成功,指出到這裏: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

工作完美!我不使用自簽名證書,但是我希望在對我的開發箱進行本地單元測試時能夠忽略我的認證問題。這個竅門!謝謝 – SB2017

+0

經過一整天的搜索和嘗試,你的第一個解決方案爲我工作。第二個沒有工作。謝謝! –

5

以前的答案並沒有爲我做。 require('https').globalAgent總是undefined

做了一些搜索,發現文檔中的rejectUnauthorized參數(https://nodejs.org/api/tls.html)。不知道如果它涉及到SocketIO,但它在某種程度上似乎與自簽名證書的工作:

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

secure: true可能是可選的,但我想無論如何強制執行。