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?
7 réponses
si vous utilisez Apache Web server (2.4 ou plus), activez ces modules dans httpd.fichier conf :
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).
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.
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.
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.
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/
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:
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');
...
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