web-dev-qa-db-fra.com

php ratchet websocket SSL se connecter?

J'ai un fichier de serveur de chat à cliquet

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

J'utilise Websocket pour me connecter avec ws et cela fonctionne 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.
}

Je veux une connexion sécurisée, donc j'essaye de me connecter avec SSL mais ça ne marche pas.

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

Ma question est comment connecter websocket avec une connexion SSL

Une idée?

34
vietnguyen09

Si vous utilisez le serveur Web Apache (2.4 ou supérieur), activez ces modules dans le fichier httpd.conf:

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

Ajoutez ce paramètre à votre fichier httpd.conf

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

Utilisez cette URL dans votre appel JavaSscript lorsque vous souhaitez une connexion WSS:

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

Redémarrez le serveur Web Apache et assurez-vous que votre agent Ratchet (connexion socket Web) est ouvert avant d'appliquer les paramètres (port du nom d'hôte telnet).

38
webcoder

Le problème est que React (sur lequel Ratchet est construit) ne prend pas en charge les connexions SSL directes. Voir ceci problème .

Il existe une solution de contournement simple. Utilisez stunnel avec une configuration comme:

[websockets]
accept = 8443
connect = 8888

Stunnel gérera le trafic SSL sur le port 8443 et les portera sur votre serveur websocket.

10
mattexx

J'ai trouvé cette réponse sur groupe google de Ratchet par Chris Boden :

La meilleure solution serait d'utiliser Nginx comme serveur Web. Demandez à Nginx d'écouter sur le port 80 les connexions entrantes et de gérer votre SSL. Nginx transmettra les connexions entrantes à PHP-FPM pour votre site Web habituel et s'il détecte qu'une connexion est une connexion WebSocket, faites-la proxy à votre application Ratchet en cours d'exécution sur un port de votre choix. Votre javascript pourrait alors se connecter via wss: //mydomain.org

C'est une manière alternative d'utiliser stunnel si votre application va être servie en utilisant nginx .

9
Songo

Il y a quelques jours, je cherchais la réponse à cette question et je l'ai trouvée dans les problèmes de Github Ratchet: https://github.com/ratchetphp/Ratchet/issues/489

La dernière réponse, répondu par heidji , dit ceci:

J'ai seulement ajouté ce commentaire pour les débutants comme moi qui ont besoin d'une instruction rapide pour implémenter SSL: via les documents ReactPHP, il vous suffit de construire le SecureServer mentionné de cette manière:
$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]);
puis injectez dans l'IoServer comme mentionné par cboden ci-dessus

Il semble donc qu'il existe maintenant un moyen d'implémenter un serveur Websocket sécurisé avec Ratchet sans avoir besoin d'un proxy HTTPS.

Voici la documentation de la classe SecureServer: https://github.com/reactphp/socket#secureserver

6
Jordi

Si vous utilisez Nginx, écrivez simplement ceci dans votre bloc de serveur 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;
}

Cela mettra à niveau tout wss://yoursite.com/services/myservice appeler une socket exécutée sur le port 1234. Assurez-vous simplement de ne pas laisser le port 1234 ouvert au monde.

5
RaisinBranCrunch

Apache a également fonctionné pour moi, il suffit d'ajouter dans le domaine conf:

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

Rechargez Apache, puis importez pour définir wss côté client pour inclure / wss / emplacement

wss://127.0.0.1/wss/
4
rukavina

Si vous utilisez Windows IIS, assurez-vous que vous l'avez configuré pour HTTPS (j'utilise un certificat auto-signé), puis installez le proxy inverse:

Réécriture d'URL: https://www.iis.net/downloads/Microsoft/url-rewrite et ARR 3.0: https://www.iis.net/downloads/Microsoft/application -request-routing

Vous devez également activer la prise en charge des sockets Web dans IIS: enter image description here

créer un dossier (par exemple myproxyfolder) pour la réécriture d'URL, sur ce dossier, créez un fichier web.config avec le contenu:

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

et remplacez " http://127.0.0.1:808 " par votre service websocket (j'utilise Ratched pour PHP sur WIN).

Du côté client en javascript, utilisez le protocole sécurisé websockets wss: //, comme:

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

Cela fonctionne pour moi pour Ubuntu 18.04.

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

Activation des modules proxy en exécutant la commande suivante dans le terminal.

Sudo a2enmod proxy proxy_balancer proxy_wstunnel proxy_http

Ajout de ces lignes dans mon fichier de configuration Apache virtualhost (/etc/Apache2/sites-available/000-default-le-ssl.conf)

ProxyRequests Off

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

Service Apache redémarré. Et le websocket a commencé à fonctionner dans https.

1