it-swarm.com.de

PHP-Ratsche Websocket SSL-Verbindung?

Ich habe eine Ratschenserver-Datei

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

Ich verwende Websocket, um eine Verbindung mit ws herzustellen, und es funktioniert einwandfrei

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

Ich möchte eine sichere Verbindung, versuche also, eine Verbindung mit SSL herzustellen, aber das funktioniert nicht.

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

Meine Frage ist wie man websocket mit SSL-Verbindung anschließt

Irgendeine Idee?

34
vietnguyen09

Wenn Sie einen Apache-Webserver (2.4 oder höher) verwenden, aktivieren Sie diese Module in der Datei httpd.conf:

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

Fügen Sie diese Einstellung Ihrer httpd.conf-Datei hinzu

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

Verwenden Sie diese URL in Ihrem JavaSscript-Aufruf, wenn Sie eine WSS-Verbindung wünschen:

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

Starten Sie den Apache-Webserver neu und stellen Sie sicher, dass Ihr Ratchet-Worker (Web-Socket-Verbindung) geöffnet ist, bevor Sie die Einstellungen anwenden (Telnet-Hostnamen-Port).

38
webcoder

Das Problem ist, dass React (auf dem Ratchet basiert) keine direkten SSL-Verbindungen unterstützt. Siehe hierzu Problem .

Es gibt eine einfache Problemumgehung. Benutze stunnel mit einer Konfiguration wie:

[websockets]
accept = 8443
connect = 8888

Stunnel verarbeitet den SSL-Verkehr auf Port 8443 und überträgt ihn an Ihren Websocket-Server.

10
mattexx

Ich fand diese Antwort auf Ratchets Google-Gruppe von Chris Boden :

Die beste Lösung wäre, Nginx als Webserver zu verwenden. Lassen Sie Nginx auf Port 80 nach eingehenden Verbindungen suchen und Ihr SSL handhaben. Nginx leitet eingehende Verbindungen an PHP-FPM für Ihre reguläre Website weiter. Wenn eine Verbindung als WebSocket-Verbindung erkannt wird, leiten Sie sie an einem Port Ihrer Wahl als Proxy an Ihre laufende Ratchet-Anwendung weiter. Ihr Javascript könnte sich dann über wss: //meinedomain.org verbinden

Dies ist eine alternative Methode zur Verwendung von stunnel , wenn Ihre Anwendung mit nginx bereitgestellt werden soll.

9
Songo

Vor ein paar Tagen habe ich nach der Antwort auf diese Frage gesucht und diese in den Github Ratchet-Ausgaben gefunden: https://github.com/ratchetphp/Ratchet/issues/489

Die letzte Antwort, die mit heidji beantwortet wurde, lautet wie folgt:

Ich habe diesen Kommentar nur für Neulinge wie mich hinzugefügt, die eine kurze Anleitung zum Implementieren von SSL benötigen: Über die ReactPHP-Dokumente müssen Sie nur den SecureServer wie folgt erstellen:
$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]);
und dann in den IoServer injizieren, wie von cboden oben erwähnt

Nun scheint es also eine Möglichkeit zu geben, einen sicheren Websocket-Server mit Ratchet zu implementieren, ohne einen HTTPS-Proxy zu benötigen.

Hier haben Sie die SecureServer-Klassendokumentation: https://github.com/reactphp/socket#secureserver

6
Jordi

Wenn Sie Nginx verwenden, schreiben Sie dies einfach in Ihren SSL-Serverblock:

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

Dadurch wird jeder wss://yoursite.com/services/myservice - Aufruf an einen Socket auf Port 1234 aktualisiert. Denken Sie jedoch daran, Port 1234 nicht für die Welt offen zu lassen.

5

Apache funktionierte auch für mich, fügen Sie einfach in der Domäne conf hinzu:

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

Laden Sie Apache neu und setzen Sie wss auf der Clientseite auf / wss / location

wss://127.0.0.1/wss/
4
rukavina

Wenn Sie Windows IIS verwenden, stellen Sie sicher, dass Sie es für HTTPS konfiguriert haben (ich verwende ein selbstsigniertes Zertifikat), und installieren Sie dann den Reverse Proxy:

URL neu schreiben: https://www.iis.net/downloads/Microsoft/url-rewrite und ARR 3.0: https://www.iis.net/downloads/Microsoft/application) -request-routing

Sie müssen auch die Unterstützung für Websockets in IIS aktivieren: enter image description here

erstellen Sie einen Ordner (z. B. myproxyfolder) für das Umschreiben von URLs. Erstellen Sie in diesem Ordner die Datei web.config mit folgendem Inhalt:

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

und ändern Sie " http://127.0.0.1:808 " zu Ihrem Websocket-Dienst (ich verwende Ratched für PHP unter WIN).

Verwenden Sie clientseitig in Javascript sichere Websockets mit dem Protokoll wss: //, z. B .:

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

Es funktioniert für mich für Ubuntu 18.04.

var ws = new WebSocket ('wss: //domain.com/ws/');

Aktivieren Sie Proxy-Module, indem Sie den folgenden Befehl im Terminal ausführen.

Sudo a2enmod proxy proxy_balancer proxy_wstunnel proxy_http

Diese Zeilen wurden meiner Apache VirtualHost-Konfigurationsdatei hinzugefügt (/etc/Apache2/sites-available/000-default-le-ssl.conf).

ProxyRequests Off

ProxyPass "/ ws /" "ws: //domain.com: 5555 /"

Neustart des Apache-Dienstes. Und der Websocket fing an, in https zu arbeiten.