【问题标题】:socket.io with ssl not working带有 ssl 的 socket.io 不工作
【发布时间】:2017-11-12 22:23:28
【问题描述】:

我有一个使用 socket.io 模块的 websocket 服务器的简单 node.js 代码,但我无法让它工作。服务器运行时没有错误,但尝试从浏览器连接时出现“SOCKET ERROR: {"isTrusted":true}" 错误(我没有使用自签名证书,而是经过测试并受浏览器信任的赛门铁克证书) .
这是我的代码:

var fs = require( 'fs' ) ;
var app = require('express')();
var https  = require('https');
var server = https.createServer({    
    key: fs.readFileSync('cert.key'),
    cert: fs.readFileSync('cert.cer'),
},app);
server.listen(50100);
var io = require('socket.io').listen(server,{pingTimeout: 7000, pingInterval: 10000});
io.sockets.on('connection',function (socket) {
    console.log('new connection'); 
});

在客户端上,我使用标准 java 脚本“var WS = new WebSocket(wsUri);”,而 wsUri 为“wss://siteaddress:50100”。
我用“ws”节点模块尝试了代码,它似乎工作正常,但“ws”模块没有我需要的所有方法(除非我遗漏了什么——我需要能够将消息发送到选定的套接字或所有套接字一起)并通过套接字连接从客户端发送一些信息)。
我已经尝试了node.js, socket.io with SSL 中的所有建议,但没有一个对我有用。
尝试通过 DEBUG=* node myapp 进行调试 - 这是我在日志中得到的内容:

express:application set "x-powered-by" to true +0ms
express:application set "etag" to 'weak' +7ms
express:application set "etag fn" to [Function: wetag] +2ms
express:application set "env" to 'development' +1ms
express:application set "query parser" to 'extended' +0ms
express:application set "query parser fn" to [Function: parseExtendedQueryString] +1ms
express:application set "subdomain offset" to 2 +0ms
express:application set "trust proxy" to false +1ms
express:application set "trust proxy fn" to [Function: trustNone] +1ms
express:application booting in development mode +2ms
express:application set "view" to [Function: View] +1ms
express:application set "views" to '/opt/bitnami/apache2/wm/node/views' +0ms
express:application set "jsonp callback name" to 'callback' +1ms
socket.io:server initializing namespace / +145ms
socket.io-parser encoding packet {"type":0,"nsp":"/"} +1ms
socket.io-parser encoded {"type":0,"nsp":"/"} as 0 +1ms
socket.io:server creating engine.io instance with opts {"pingTimeout":7000,"pingInterval":10000,"path":"/socket.io","initialPacket":["0"]} +0ms
socket.io:server attaching client serving req handler +10ms

当客户端尝试连接到 websocket 时,日志中没有任何内容。
谁能指出我正确的方向?
谢谢。

【问题讨论】:

  • 你给出的错误是什么?
  • 我在 Node 中没有收到任何错误,只是客户端浏览器在尝试连接到套接字时出现错误 - “SOCKET ERROR: {"isTrusted":true}"
  • 如果不使用 http 而不是 https 进行安全连接,您是否会遇到同样的错误?
  • 如果我尝试在不使用 SSL 的情况下执行此操作,则会收到“SecurityError:该操作不安全”。在客户端上,但在服务器上仍然没有。
  • 等一下,我会发送我的示例代码,也许它会有所帮助

标签: node.js ssl socket.io


【解决方案1】:

服务器端:

`var express = require('express');
var app = express();
var server = app.listen(8080);
var io = require('socket.io').listen(server);`

客户端:

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>

var mySocket = io.connect('localhost:8080', {transports: 
 ['websocket'], reconnection: false,secure:false}); 

mySocket.on('connect', function () {
    mySocket.sendBuffer=[]
    console.log('Connected!');
});  

如果您的浏览器登录 connected 表示连接已建立

【讨论】:

  • 在您的代码中,我收到“与 'ws://mysite:8080/socket.io/?EIO=3&transport=websocket' 的 WebSocket 连接失败:在收到握手响应之前连接已关闭”。我注意到“安全”设置为 false - 如果我想使用 SSL,它不应该是真的(我尝试过同样的结果)。而且我相信自从最后几个版本以来,Firefox 不允许不安全的 websocket 连接。谢谢
【解决方案2】:

尝试添加相应端口的传输和来源

var io = require('socket.io').listen(server ....)之后

添加这个:

io.set('transports', ['websocket']); io.set('origins', 'YOUR_ORIGIN:*');

检查您的规则是否在 apache 或 nginx 上正确设置,以便您拥有 wss。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2016-06-06
    • 2017-07-27
    • 2017-07-23
    • 1970-01-01
    • 2015-04-01
    • 2014-09-21
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多