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

Есть идеи?

Если вы используете веб-сервер 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 (соединение с веб-сокетом) открыт перед применением настроек (порт имени хоста telnet).

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

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

 [websockets] accept = 8443 connect = 8888 

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

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

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

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

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

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

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

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

 wss://127.0.0.1/wss/ 

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

URL rewrite: https://www.iis.net/downloads/microsoft/url-rewrite и ARR 3.0: https://www.iis.net/downloads/microsoft/application-request-routing

Вам также необходимо включить поддержку web-камер в 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 » на вашу службу websocket (я использую Ratched для PHP на WIN).

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

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

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

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

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