棘轮套筒 ws 到 wss

Ratchet socket ws to wss

我有两个 Docker 容器。一个是 https 上的应用 运行,另一个是 Ratchet 库上的网络套接字 运行。

当我在 Mac 上时,从 https 连接到 ws 没有问题,我认为这是因为 Docker 是 运行 在 127.0.0.1 上所以我想有一些特殊的规则允许它。

切换到 Win 机器出现问题是因为 Docker 在 192.168.99.100 上,现在连接 httpsws 不再有效,因为浏览器需要 httpswss 连接。仅仅将端点切换到 wss:// 而不是 ws:// 显然不能开箱即用,因为连接握手自然会超时。

我的套接字容器不是 运行 nginx 也不是 apache,它是一个简单的 Ratchet 服务器,它最终只是暴露我告诉它的端口在外面。

是否有一些关于如何切换到 wss 的好资源,因为我可以找到 none.

这是我试过的:

$server = IoServer::factory(new HttpServer($wsServer), $config['port'], '0.0.0.0', [
    'local_cert'        => __DIR__ . '/../config/cert.pem',
    'allow_self_signed' => true,
    'verify_peer'       => false,
    'ciphers'           => 'TLSv1.2'
]);

这段代码没有出错,但也没有启用 wss 端点,因为同样的事情正在发生。我怎样才能继续并使这项工作?此外,我在某处读到不允许使用 wss 自签名证书。我可以在套接字容器上使用签名证书并在自签名证书上使用应用程序容器,还是它们都需要使用同一个证书?

编辑:

由于 Ratchet 不久前删除了 SSL,我将代码添加到 IoServer::factory():

    public static function factory(MessageComponentInterface $component, $port = 80, $address = '0.0.0.0', array $sslContext = null) {
        $loop   = LoopFactory::create();
        $socket = new Reactor($address . ':' . $port, $loop);

        if (is_array($sslContext)) {
            $socket = new SecureReactor($socket, $loop, $sslContext);
        }

        return new static($component, $socket, $loop);
    }

但即使没有它,我也尝试了另一种方式:

$server = new IoServer(new HttpServer($wsServer), new SecureServer($webSock, $loop, array(
        'local_cert'        => __DIR__ . '/../config/cert.pem',
        'allow_self_signed' => true,
        'verify_peer'       => false,
    )
));

我最终按原样启动 Ratchet(正常 ws)并在应用程序端执行 nginx 代理传递:

   location /ws {
        resolver 127.0.0.11 valid=30s;
        set $backend "http://container_name:port";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_pass $backend;
     }

解析器部分确保当您终止容器时 nginx 不会出错。