php 棘轮 websocket SSL connect?

2022-08-30 12:00:08

我有一个棘轮聊天服务器文件

use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use MyAppChat\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
    new WsServer(
        new Chat()
    )
  , 26666
);
$server->run();

我使用Websocket进行连接,它工作正常ws

if ("WebSocket" in window) {
    var ws = new WebSocket("ws://ratchet.mydomain.org:8888");
    ws.onopen = function() {
        // Web Socket is connected. You can send data by send() method.
        ws.send("message to send");
    };
    ws.onmessage = function (evt) { 
        var received_msg = evt.data;
    };
    ws.onclose = function() { 
        // websocket is closed. 
    };
} else {
  // the browser doesn't support WebSocket.
}

我想要安全连接,所以我尝试使用SSL连接,但无法正常工作。

if ("WebSocket" in window) {
    var ws = new WebSocket("wss://ratchet.mydomain.org:8888");
    ws.onopen = function() {
        // Web Socket is connected. You can send data by send() method.
        ws.send("message to send");
    };
    ws.onmessage = function (evt) { 
        var received_msg = evt.data;
    };
    ws.onclose = function() { 
        // websocket is closed. 
    };
} else {
  // the browser doesn't support WebSocket.
}

我的问题是如何将websocket与SSL连接

有什么想法吗?


答案 1

如果您使用的是Apache Web服务器(2.4或更高版本),请在httpd.conf文件中启用这些模块:

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

将此设置添加到 httpd.conf 文件中

ProxyPass /wss2/ ws://ratchet.mydomain.org:8888/

当您需要 WSS 连接时,请在 JavaScript 调用中使用此 URL:

var ws = new WebSocket("wss://ratchet.mydomain.org/wss2/NNN");

重新启动 Apache Web 服务器,并在应用设置(telnet 主机名端口)之前确保您的 Ratchet worker(Web 套接字连接)已打开。


答案 2

几天前,我正在寻找这个问题的答案,我在Github Ratchet问题中发现了这个问题:https://github.com/ratchetphp/Ratchet/issues/489

最后一个答案,由heidji回答,是这样的:

我只为像我这样需要快速说明如何实现SSL的新手添加了此评论:通过ReactPHP文档,您只需要以这种方式构建安全服务器:


然后注入IoServer,如上面的cboden所述$webSock = new React\Socket\Server('0.0.0.0:8443', $loop);$webSock = new React\Socket\SecureServer($webSock, $loop, ['local_cert' => '/etc/ssl/key.pem', 'allow_self_signed' => true, 'verify_peer' => false]);

因此,现在似乎有一种方法可以使用Ratchet实现安全的websocket服务器,而无需HTTPS代理。

在这里,您有安全服务器类文档:https://github.com/reactphp/socket#secureserver


推荐