2014-06-30 53 views
1

我設置一個套接字服務器,就像這樣:如何從節點socket.io客戶端**使用HTTPS連接節點socket.io服務器**

/* node-server.js */ 
var port = 3333; 
var fs = require('fs'); 
var options = { 
    key: fs.readFileSync('ssl/server.key'), 
    cert: fs.readFileSync('ssl/server.crt') 
}; 
var server = require('https').Server(options); 
var io = require('socket.io')(server); 
console.log('Socket server listening on port ' + port + '.'); 
server.listen(port); 
io.sockets.on('connection', function(socket) { 
    console.log("Client " + socket.id + " connected."); 
}); 

和連接節點客戶端它:

/* node-client.js */ 
var url = 'https://localhost:3333'; 
console.log('Connecting to ' + url); 
var io = require('socket.io-client'); 
var socket = io.connect(url, { reconnection: false }); 
socket.on('connect_error', function(error){ console.log('Error connecting to ' + url, error);}); 
socket.on('connect', function() { 
    console.log('Connected to ' + url); 
}); 

然而,嘗試連接時,我得到一個錯誤{ [Error: xhr poll error] description: 503 }

這個錯誤消失了,如果我刪除了「HTTPS」組件,一切都正常。 Here's a diff showing exactly what I mean.

不過,我不認爲HTTPS的問題,因爲這裏是另一個客戶端(這一項在瀏覽器,而不是節點),它可以連接只是罰款:

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript" 
     src="https://localhost:3333/socket.io/socket.io.js"></script> 
</head> 
<body onload="io.connect('https://localhost:3333');"> 
</body> 
</html> 

我怎樣才能得到一個Node socket.io-client通過HTTPS連接到一個節點socket.io-server?

+0

這是很好的注意,這個問題和答案處理*自簽名*證書只要。 – RozzA

回答

0

的解決方案是這一行添加到客戶端:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

我發現,如果我手動進行HTTPS請求套接字服務器:

var https = require('https'); 
var options = { host: 'localhost', 
    port: '3333', 
    path: '/socket.io/?EIO=3&transport=polling&t=1404103832354-0&b64=1', 
    method: 'GET', 
    headers: 
    { 'User-Agent': 'node-XMLHttpRequest', 
    Accept: '*/*', 
    Host: 'localhost:3333' }, 
    agent: false 
}; 
https.globalAgent.options.rejectUnauthorized = false; 
https.request(options, function() { 
    console.log(arguments); 
    throw 'done'; 
}); 

...然後請求將失敗,並出現以下錯誤:DEPTH_ZERO_SELF_SIGNED_CERT

Socket.io似乎無法爲此請求請求。

谷歌搜索錯誤後,我發現this page

在該頁面上,有人提出了上述解決方案,該解決方案可行。

基本上,我認爲它允許可能是「不安全」的自簽名證書。

2

Node.js,TLSHTTPS將在接受它們之前驗證證書。因此,使用具有節點自簽名證書,則需要設置爲false執行請求時rejectUnauthorized選項,或使用:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 
相關問題