php храповик websocket SSL подключение?


У меня есть файл сервера чата ratchet

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

Есть идеи?

Author: vietnguyen09, 2013-06-07

7 answers

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

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

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

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

Используйте этот URL-адрес в вызове JavasScript, когда вам нужно подключение WSS:

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

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

 30
Author: webcoder, 2015-02-08 11:45:00

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

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

[websockets]
accept = 8443
connect = 8888

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

 8
Author: mattexx, 2013-06-07 21:27:56

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

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

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

 7
Author: Songo, 2013-11-26 21:20:14

Если вы используете 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 открытым для всего мира.

 3
Author: RaisinBranCrunch, 2017-03-25 05:41:07

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

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

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

wss://127.0.0.1/wss/
 2
Author: rukavina, 2014-12-18 18:59:32

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

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

Вам также необходимо включить поддержку websockets в IIS:enter image description here

Создайте папку (например, 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 "на ваш сервис websocket (я использую Ratched для PHP на WIN).

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

    mysock = new WebSocket('wss://127.0.0.1/myproxyfolder');
...
 2
Author: W.g., 2017-10-24 10:16:36

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

Последний ответ, на который ответил хейджи, гласит следующее:

Я добавил этот комментарий только для новичков, таких как я, которым нужна быстрая инструкция по внедрению SSL: С помощью документов ReactPHP вам нужно только создать сервер безопасности, упомянутый таким образом:
$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

 2
Author: Jordi, 2017-11-10 17:13:07