【问题标题】:Using Ratchet WebSockets in a Secure Environment is not working在安全环境中使用 Ratchet WebSockets 不起作用
【发布时间】:2022-12-15 05:58:02
【问题描述】:

我在基于 Windows 的服务器项目中使用 Ratchet WebSocket,该项目完全在不安全的环境中工作。也就是说,当我将浏览器导航到 http://www.example.com 并使用端口 8686 上的 ws:// 连接到 websocket 服务器时,一切都运行得非常好。

服务器不通过 IIS 运行 - 而是通过命令提示符下的 php.exe 执行,如下所示。

php wsocket-server.php [...parameters...]

但是,如果运行 Ratchet 服务器并尝试使用 wss://https://www.example.com 连接,浏览器将不会连接到 websocket 服务器,尽管服务器启动正常并且站点不安全并通过 ws:// 连接

现在,我意识到我需要使用一些额外的代码来包含我的 SSL 文档。这是我的相关代码:

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;

$websocket_server = new WsServer();

if ($site_secure){
   //RUN WSS (SECURE) SERVER
    $options = [
        'local_cert'        => 'c:\inetpub\ssl\2c6fa1928847451c.crt',
        'local_pk'          => 'c:\inetpub\ssl\2c6fa1928847451c.key',
        'allow_self_signed' => true,
        'verify_peer'       => false
    ];
    
    $loop = React\EventLoop\Factory::create();
    $websocket_server->enableKeepAlive($loop);
    $app = new HttpServer($websocket_server);

    $insecure_websockets = new \React\Socket\Server('0.0.0.0:'.$port, $loop);
    $secure_websockets = new \React\Socket\SecureServer($insecure_websockets , $loop, $options);
    $secure_websockets_server = new \Ratchet\Server\IoServer($app, $secure_websockets, $loop);

    $secure_websockets_server->run();
}else{    
   //RUN WS (INSECURE) SERVER
    $http_server = new HttpServer($websocket_server);
    $server = IoServer::factory($http_server, $port);
    $websocket->log ("Initializing ".(($site_secure) ? "Secure " : "Insecure ")."Server ($port)");
    $server->run();
}

我试过的

  • 我已确保正确的端口在 Windows 防火墙中全部打开。
  • 我已经确保没有其他东西在使用netstat 监听端口
  • 我尝试过在最低限度上使用 nginx。如果可能的话,我宁愿不使用这种方法,而且它在启动时遇到了一些初始问题,所以我现在没有 100% 地投入到它中。理想情况下,我想使用 Ratchet 的原生能力。
  • 我在这里和其他地方搜索过其他类似的帖子,例如this
  • 我尝试了很多不同的端口,甚至是我在不安全连接中使用的相同的 8686

我希望有人可以帮助我解决一个让我发疯 2 周的问题。在这一点上,我觉得我只是在尝试一些事情来尝试它们,我可能会在圈子里编码自己。

先感谢您。

【问题讨论】:

    标签: ssl websocket ratchet


    【解决方案1】:

    一个浏览器是绝不将要连接到任何事物在端口 465 上运行。尤其不是 WebSocket。

    建立 WebSocket 连接是specified in terms of the Fetch standard。因此,这个端口的具体排除是found within the latter

    一个端口是一个坏端口如果它列在下表的第一列中。

    Port Typical service
    465 submission

    现在,为什么有些端口被列入黑名单?这是一种针对跨协议脚本攻击的保护措施,正如曾经证明的那样(警告:NSFW 链接)against Firefoxagainst Safari。端口 465 已经(并且有时仍然)用于基于(纯)TLS 的 SMTP,因此在这种情况下,XPS 攻击可能会诱使浏览器代表用户发送邮件。阻止这些端口是为了防止它。当然,当服务在非标准端口上运行时,所有的赌注都会落空。

    要使服务在浏览器中可用,您需要做的就是更改端口号。

    【讨论】:

    • 我非常感谢您的意见。我尝试了多种端口。甚至端口 8686(如不安全连接)。我相信这个问题与我的代码有关,或者可能与 SSL 证书有关(即使 https 工作正常)。
    • 只是为了进一步澄清,我只是再次运行测试以确保,只需将 ws:// 更改为 wss://(并将端口保留为 8686)就会导致它停止工作。如果我将其保留为 ws://,我会在 firefox 中收到安全错误,告诉我无法从安全页面建立非安全连接。
    • 还有很多其他事情要做:用 ncatwscat 替换客户端或服务器,看看它是如何工作的,检查浏览器发出的错误消息,重构服务器代码(虽然有点重复,但这不是立即可见的)…
    • 非常感谢!不幸的是,wscat 产生了相同的结果。它在ws:// 上连接良好,只是使用wss:// 无限期挂起。端口无关紧要。没有出现错误。
    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    相关资源
    最近更新 更多