php ssl websocket ratchet

php ratchet websocket SSL connect?



(7)

Apache también funcionó para mí, simplemente agrega el dominio conf:

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

Recargue apache y luego importe para configurar wss en el lado del cliente para incluir / wss / ubicación

wss://127.0.0.1/wss/

Tengo un archivo de servidor de chat de trinquete

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();

Yo uso Websocket para conectarme con ws y funciona bien

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. }

Quiero una conexión segura, así que intento conectarme con SSL pero no funciona.

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. }

Mi pregunta es cómo conectar websocket con conexión SSL

¿Alguna idea?


El problema es que Reaccionar (sobre el que está construido Ratchet) no admite conexiones SSL directas. Mira este issue .

Hay una solución simple. Use stunnel con una configuración como:

[websockets] accept = 8443 connect = 8888

Stunnel manejará el tráfico SSL en el puerto 8443 y los transferirá a su servidor websocket.


Encontré esta respuesta en el grupo de Google de Ratchet por Chris Boden :

La mejor solución sería usar Nginx como su servidor web. Haga que Nginx escuche en el puerto 80 las conexiones entrantes y haga que maneje su SSL. Nginx reenviará las conexiones entrantes a PHP-FPM para su sitio web habitual y, si detecta que una conexión es una conexión WebSocket, puede enviarla a la aplicación Ratchet en un puerto de su elección. Su javascript podría conectarse a través de wss: //mydomain.org

Esta es una forma alternativa de usar stunnel si su aplicación va a ser servida usando nginx .


Hace unos días estaba buscando la respuesta a esta pregunta y encontré esto en los números de Github Ratchet: https://github.com/ratchetphp/Ratchet/issues/489

La última respuesta, respondida por heidji , dice esto:

Solo agregué este comentario para principiantes como yo que necesitan una instrucción rápida sobre cómo implementar SSL: a través de los documentos de ReactPHP solo necesita construir el SecureServer mencionado de esa manera:
$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]);
y luego inyectar en el IoServer como lo menciona cboden arriba

Entonces parece que ahora hay una forma de implementar un servidor de websocket seguro con Ratchet sin necesidad de un proxy HTTPS.

Aquí tiene la documentación de la clase SecureServer: https://github.com/reactphp/socket#secureserver


Si está usando Nginx, solo escríbalo en su bloque de servidor 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; }

Esto actualizará cualquier wss://yoursite.com/services/myservice llamada a un socket que se ejecute en el puerto 1234. Solo asegúrese de recordar que no debe dejar el puerto 1234 abierto al mundo.


Si está utilizando Windows IIS, asegúrese de haberlo configurado para HTTPS (estoy usando un certificado autofirmado), luego instale el proxy inverso:

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

También necesita habilitar el soporte de websockets en IIS:

crear una carpeta (por ejemplo, myproxyfolder) para la reescritura de URL, en esta carpeta crear el archivo web.config con contenido:

<?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>

y cambie " http://127.0.0.1:8080 " a su servicio de websocket (estoy usando Ratched para PHP en WIN).

En el lado del cliente en javascript, use el protocolo websockets wss: // seguro, como:

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


Si está utilizando el servidor web Apache (2.4 o superior), habilite estos módulos en el archivo httpd.conf:

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

Agregue esta configuración a su archivo httpd.conf

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

Use esta URL en su llamada JavaSscript cuando desee una conexión WSS:

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

Reinicie el servidor web Apache y asegúrese de que su trabajador de Ratchet (conexión de socket web) esté abierto antes de aplicar la configuración (puerto de nombre de host telnet).