У меня есть два 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,
)
));