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-соединением
Любая идея?
Ответы
Ответ 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.