php cliquet websocket de connexion SSL?

j'ai une clé à cliquet de chat serveur de fichier

use RatchetServerIoServer;
use RatchetWebSocketWsServer;
use MyAppChatChat;
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 il fonctionne très 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'essaie 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 connexion SSL

une idée?

30
demandé sur vietnguyen09 2013-06-07 12:42:01

7 réponses

si vous utilisez Apache Web server (2.4 ou plus), activez ces modules dans httpd.fichier conf :

  1. mod_proxy.donc
  2. mod_proxy_wstunnel.donc

Ajouter ce paramètre à votre httpd.fichier conf

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

utilisez cette URL dans votre appel JavaSscript lorsque vous voulez une connexion WSS:

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

redémarrez le serveur web Apache et assurez-vous que votre logiciel Ratchet worker (web socket connection) est ouvert. avant d'appliquer les paramètres (port de nom d'hôte telnet).

30
répondu webcoder 2015-02-08 11:45:00

le problème est que React (sur lequel est construit Ratchet) ne supporte pas les connexions SSL directes. Voir cette problème.

il y a une solution simple. Utilisez stunnel avec une config comme ceci:

[websockets]
accept = 8443
connect = 8888

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

8
répondu mattexx 2013-06-07 21:27:56

j'ai trouvé cette réponse sur Cliquet du groupe google par Chris Boden:

La meilleure solution serait d'utiliser Nginx comme serveur web. Ont Nginx écouter sur le port 80 pour les connexions entrantes et le faire gérer votre SSL. Nginx redirigera les connexions entrantes vers PHP-FPM pour votre site régulièrement et s'il détecte une connexion WebSocket connexion de l'avoir proxy pour votre course à Cliquet application sur un port de votre choix. Votre javascript peut alors se connecter via wss://mondomaine.org

C'est une alternative à l'utilisation de stunnel si votre application va être servie en utilisant nginx.

7
répondu Songo 2013-11-26 21:20:14

si vous utilisez Nginx, écrivez simplement ceci dans le bloc de votre 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/(.*) / break;
    proxy_redirect off;

    # timeout extension, possibly keep this short if using a ping strategy
    proxy_read_timeout 99999s;
}

upgrade wss://yoursite.com/services/myservice appel à une socket sur le port 1234. N'oubliez pas de ne pas laisser le port 1234 ouvert au monde.

3
répondu RaisinBranCrunch 2017-03-25 05:41:07

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

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

recharger apache et ensuite c'est Importer pour mettre wss dans le côté client pour inclure / wss/

wss://127.0.0.1/wss/
2
répondu rukavina 2014-12-18 18:59:32

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

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 aussi activer le support websockets dans IIS:enter image description here

créer un dossier (par ex. myproxyfolder) pour la réécriture D'URL, sur ce dossier créer web.fichier de configuration de 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 le changement "http://127.0.0.1:8080 " à votre service websocket (J'utilise Ratched pour PHP sur WIN).

côté client dans javascript, utilisez des websockets sécurisés wss: / / protocol, comme:

    mysock = new WebSocket('wss://127.0.0.1/myproxyfolder');
...
2
répondu W.g. 2017-10-24 10:16:36
https://github.com/ratchetphp/Ratchet/issues/489

La dernière réponse, a 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 comment implémenter SSL: Par L'intermédiaire des Docs ReactPHP vous avez seulement besoin de construire le serveur sécurisé mentionné dans tel 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]);

et puis injectez dans le IoServer comme mentionné par cboden ci-dessus

il semble donc qu'il y ait maintenant un moyen d'implémenter un serveur websocket sécurisé avec Ratchet sans avoir besoin d'un proxy HTTPS.

https://github.com/reactphp/socket#secureserver

2
répondu Jordi 2017-11-10 17:13:07