2014-06-30 44 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'; 
相关问题