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-соединения
Есть идеи?
7 answers
Если вы используете веб-сервер 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 worker (подключение к веб-сокету) открыт, прежде чем применять настройки (имя хоста telnet порт).
Проблема в том, что React (на котором построен храповик) не поддерживает прямые SSL-соединения. Смотрите этот выпуск .
Существует простой обходной путь. Используйте потрясающее зрелище с конфигурацией, подобной:
[websockets]
accept = 8443
connect = 8888
Stunnel будет обрабатывать SSL-трафик на порту 8443 и переносить его на ваш сервер websocket.
Я нашел этот ответ в группе Google Рэтчета от Криса Бодена:
Лучшим решением было бы использовать Nginx в качестве вашего веб-сервера. Есть Nginx прослушайте порт 80 для входящих подключений и попросите его обработать ваши SSL. Nginx будет перенаправлять входящие соединения на PHP-FPM для вашего обычного веб-сайта, и если он обнаружит, что соединение является подключением к WebSocket, используйте прокси-сервер для вашего запущенного приложения Ratchet на выбранном вами порту . Ваш javascript может затем подключитесь через wss://мой домен.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/ местоположение
wss://127.0.0.1/wss/
Если вы используете 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:
Создайте папку (например, 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');
...
Несколько дней назад я искал ответ на этот вопрос и нашел это в вопросах храповика на 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