Подтвердить что ты не робот

Php трещотка websocket SSL connect?

У меня есть файл с храповым чат-сервером

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-соединением

Любая идея?

4b9b3361

Ответ 1

Если вы используете веб-сервер Apache (2.4 или выше), включите эти модули в файле httpd.conf:

Добавьте этот параметр в свой файл httpd.conf

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

Используйте этот URL-адрес в своем вызове JavaSscript, если хотите соединение WSS:

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

Перезагрузите веб-сервер Apache и убедитесь, что ваш работник Ratchet (соединение с веб-сокетом) открыт перед применением настроек (порт имени хоста telnet).

Ответ 2

Проблема заключается в том, что React (на котором построен Ratchet) не поддерживает прямые SSL-соединения. Смотрите issue.

Существует обходное решение. Используйте stunnel с конфигурацией вроде:

[websockets]
accept = 8443
connect = 8888

Stunnel будет обрабатывать трафик SSL на порту 8443 и переносить их на ваш сервер веб-сервера.

Ответ 3

Я нашел этот ответ на группе gochett Ratchet Крис Боден:

Лучшим решением будет использование Nginx в качестве вашего веб-сервера. Имейте Nginx прослушивать порт 80 для входящих подключений и обрабатывать его SSL. Nginx будет перенаправлять входящие соединения на PHP-FPM для вашего регулярный веб-сайт, и если он обнаруживает соединение, это WebSocket соединение имеет прокси-сервер к вашему запущенному приложению Ratchet на порту на ваш выбор. Тогда ваш javascript сможет подключиться через WSS://mydomain.org

Это альтернативный способ использования stunnel, если ваше приложение будет обслуживаться с помощью nginx.

Ответ 4

Если вы используете Nginx, просто напишите это в своем блоке сервера SSL:

location /services/myservice {
    # switch off logging
    access_log off;

    # redirect all HTTP traffic to localhost
    proxy_pass http://localhost:1234;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support (nginx 1.4)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    # Path rewriting
    rewrite /services/myservice/(.*) /$1 break;
    proxy_redirect off;

    # timeout extension, possibly keep this short if using a ping strategy
    proxy_read_timeout 99999s;
}

Это приведет к обновлению любого вызова wss://yoursite.com/services/myservice к сокету, запущенному на порту 1234. Просто убедитесь, что вы не забываете оставить порт 1234 открытым для всего мира.

Ответ 5

Несколько дней назад я искал ответ на этот вопрос, и я нашел это в проблемах Github Ratchet: https://github.com/ratchetphp/Ratchet/issues/489

Последний ответ, отвеченный heidji, говорит следующее:

Я только добавил этот комментарий для новичков, как я, которым нужна быстрая инструкция по внедрению SSL: Через документы ReactPHP вам нужно только построить SecureServer, упомянутый таким образом:
$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]);
а затем вводить в IoServer, как упоминалось cboden выше

Итак, теперь есть способ реализовать безопасный сервер websocket с Ratchet без использования прокси-сервера HTTPS.

Здесь у вас есть документация класса SecureServer: https://github.com/reactphp/socket#secureserver

Ответ 6

Apache также работал у меня, просто добавьте в домен conf:

ProxyPass /wss/ wss://127.0.0.1:8888/

Перезагрузите apache, а затем импортируйте, чтобы установить wss на стороне клиента, чтобы включить /wss/.

wss://127.0.0.1/wss/

Ответ 7

Если вы используете Windows IIS, убедитесь, что вы настроили его для HTTPS (я использую самоподписанный сертификат), а затем установите обратный прокси:

Переписать URL: https://www.iis.net/downloads/microsoft/url-rewrite и ARR 3.0: https://www.iis.net/downloads/microsoft/application-request-routing

Вам также необходимо включить поддержку веб-камер в IIS: введите описание изображения здесь

создайте папку (например, myproxyfolder) для перезаписи URL, в этой папке создайте файл web.config с контентом:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="WebSocketProxy" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://127.0.0.1:8080" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

и измените " http://127.0.0.1:8080" на вашу службу веб-рассылки (я использую Ratched для PHP на WIN).

На стороне клиента в javascript используйте защищенные websockets wss://протокол, например:

    mysock = new WebSocket('wss://127.0.0.1/myproxyfolder');
...

Ответ 8

Это работает для меня на Ubuntu 18.04.

var ws = new WebSocket ('wss://domain.com/ws/');

Включите прокси-модули, выполнив следующую команду в терминале.

прокси sudo a2enmod proxy_balancer proxy_wstunnel proxy_http

Добавил эти строки в мой конфигурационный файл виртуального хоста Apache (/etc/apache2/sites-available/000-default-le-ssl.conf)

ProxyRequests Off

ProxyPass "/ws/" "ws://domain.com: 5555/"

Перезапущенный сервис apache. И веб-сокет начал работать в https.