Гнездо с храповым механизмом ws to wss - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть два Docker контейнера. Один - приложение, работающее по протоколу https, другой - веб-сокет, работающий в библиотеке Ratchet

Когда я нахожусь на Ма c У меня нет проблем с подключением от https к ws, и я предполагаю, что это потому, что Docker работает на 127.0.0.1, поэтому я предполагаю, что есть некоторые специальные правила, которые позволяют это.

При переключении на Win-машину проблема возникает из-за того, что Docker включен 192.168.99.100 и теперь подключение https к ws больше не работает, поскольку браузер ожидает подключения https к wss. Простое переключение конечной точки на wss:// вместо ws://, очевидно, не работает из коробки, так как время установления соединения истекает.

Мой контейнер сокетов не работает nginx или apache, это простой сервер Ratchet, который в конечном итоге просто выставляет порт, который я сказал ему снаружи.

Есть ли хорошие ресурсы о том, как переключиться на wss, потому что я не смог найти ни одного.

Вот что я пробовал:

$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 через некоторое время go, Я добавил код к 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,
    )
));

1 Ответ

0 голосов
/ 28 апреля 2020

Я закончил тем, что запустил 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 не будет ошибки когда убьешь контейнер.

...