Déploiement d'un websocket avec ratchet SSL
Résoluluckydu43 Messages postés 3973 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 18 décembre 2024 - 26 août 2024 à 14:27
- Le client et le serveur ne sont pas compatibles avec une version de protocole ou une méthode de chiffrement ssl commune.
- Serveur diff message ✓ - Forum Mobile
- Impossible d'atteindre le serveur dhcp - Forum Réseau
- Le serveur de récupération n'a pas pu être contacté - Forum MacOS
- Dernière version ccleaner gratuit français - Télécharger - Nettoyage
- Protocole http - Guide
8 réponses
Modifié le 13 août 2024 à 18:40
Bonjour,
L'idée du VPS est bonne, voici quelques pistes pour tout câbler ensemble :
Déjà, il faut que tu aies un lien SSH vers ton VPS. Tout ce qui suit est à faire dans Putty par exemple.
On va installer les dépendances nécessaires à Ratchet et NGinX.
sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install php php-cli php-sockets php-mbstring nginx -y
Envoie les fichiers (par FTP avec Filezilla par exemple) de ton chat Ratchet local dans le dossier /var/www/chat de ton VPS
Ouvre le fichier /etc/nginx/sites-available/default avec nano ou vim depuis ta console SSH et ajoute :
server { listen 80; server_name IP_OU_DOMAINE_DU_VPS; location / { proxy_pass http://localhost:8080 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
Cela fait faire tourner le chat Ratchet par NGinX sur le port 8080 en local.
Si tu as un certificat SSL (Let's Encrypt par ex), mets plutôt ça :
server { listen 443 ssl; server_name IP_OU_DOMAINE_DU_VPS; ssl_certificate /etc/letsencrypt/live/DOMAINE_DU_VPS/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/DOMAINE_DU_VPS/privkey.pem; location / { proxy_pass http://localhost:8080 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
Toujours depuis la console SSH, on va créer un service pour rendre ça maintenable facilement avec les commandes systemctl (j'ai mis vim mais ça peut être nano) :
sudo vim /etc/systemd/system/ratchet.service
Mettre le code suivant et enregistrer :
[Unit] Description=Ratchet WebSocket Server After=network.target [Service] ExecStart=/usr/bin/php /var/www/chat/bin/server.php WorkingDirectory=/var/www/chat/ Restart=always User=www-data Group=www-data StandardOutput=null StandardError=journal RestartSec=3 [Install] WantedBy=multi-user.target
Ensuite on active tout ça :
sudo systemctl daemon-reload sudo systemctl enable ratchet sudo systemctl start ratchet sudo systemctl restart nginx
Avec ça, il suffira simplement des systemctl status, restart, start et stop sur ratchet et nginx.
Pour gérer les logs même en ayant quitté la console :
nohup php bin/server.php > /var/log/ratchet.log 2>&1 &
La partie VPS est finie, il faut maintenant le câbler au site web. Modifie l’URL du WebSocket dans ton code JavaScript :
var ws = new WebSocket("ws://IP_OU_DOMAINE_DU_VPS:8080");
Si tu as configuré NGinX avec un certificat SSL, c'est :
var ws = new WebSocket("wss://IP_OU_DOMAINE_DU_VPS:443");
Tu n'as plus qu'à ouvrir F12 sur ton site web pour vérifier que la connexion WebSocket est bien établie avec le VPS.
Tu peux aussi dans le même temps regarder les logs de ton chat sur le VPS (cette commande est géniale, tu vois en temps réel l'arrivée des logs) :
tail -f /var/log/ratchet.log
Tiens au jus !
Modifié le 23 août 2024 à 12:49
Il est possible d'utiliser le même certificat pour le site ET pour le VPS à quelques conditions :
- avoir la main sur le certificat, notamment pour ce qui est de la gestion de son expiration
- que le certificat soit un certificat SAN ou Wildcard.
Si tu n'as pas ces informations, reste en HTTP pour le moment sur ton VPS.
J'assumais que _tout_ ce que j'avais mentionné était fait : apporte plus de précisions sur ce que tu as fait, pas fait, où les commandes on été tapées pour quel résultat, quelles commandes donnent quels logs, renvoie l'intégralité des logs demandés (status notamment) : je ne peux pas consacrer plus de 10 min à un topic ! Ma réponse est forcément plus longue qu'avec tous ces éléments connus.
- Reprend la conf /etc/nginx/nginx.conf au message #4, elle vaut pour un usage HTTP seul
- Concernant le fichier /etc/nginx/sites-available/ratchet, voici une conf adaptée à du HTTP seul :
-
server { listen 80; server_name IP_OU_DOMAINE_DU_VPS; root /var/www/chat; index index.html; location / { try_files $uri $uri/ =404; } location /chat { proxy_pass http://127.0.0.1:8080 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
- Redémarre nginx et ratchet, vérifie les status
- Si ratchet n'est pas reconnu en service, tu n'as pas créé le service (reprends message #1), il faut démarrer en manuel :
-
php /var/www/chat/server.php
- Vérifie si ça écoute sur le port 8080 (les 2 commandes se valent) :
-
sudo netstat -tuln | grep 8080 sudo ss -tuln | grep 8080
- Pour savoir si un firewall est actif (le service varie suivant l'OS du VPS) :
-
sudo systemctl status ufw sudo systemctl status firewalld sudo systemctl status iptables
- Dès qu'il est connu, remplace "status" par "stop" pour le désactiver
- Vérifie la configuration webSock de ton chat ratchet .php (dans /var/www/chat) :
-
$webSock = new React\Socket\Server('127.0.0.1:8080', $loop);
- essaie la commande wscat ainsi (des fois que localhost soit résolu sur ::1 et pas 127.0.0.1) :
-
wscat -c ws://127.0.0.1:8080
23 août 2024 à 14:37
Je me suis dis la même mais moi je voulais vraiment tout ce qui connexion au db rester cote site ce possible ça non ? et pour le câlin ce sensé être un emojie :*
23 août 2024 à 18:39
Okay ! Merci pour le câlin alors :-D Mets des like sur les réponses qui te conviennent et sélectionne la réponse qui répond le mieux à ta question, c'est ça qui me fait le plus plaisir sur le forum :-)
Le chat ratchet semble avoir besoin d'une connexion BDD en tout cas, relis le code et vois où ça appelle. En fonction, partage la ligne en retirant les informations sensibles, on te dira quels drivers php installer et comment
23 août 2024 à 20:34
le code du bin/server.php
namespace MyApp; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; require dirname(__DIR__) . '/vendor/autoload.php'; class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; echo "serveur starter"; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "nouvelle conn"; } public function onMessage(ConnectionInterface $from, $msg) { $numRecv = count($this->clients) - 1; echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n" , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's'); $data = json_decode($msg, true); if($data['command'] == 'private') { // ici j'appel le bd en require et je fait une insert normal dans le bd en local sa fonctionne aucun soucis } } } $app = new \Ratchet\Http\HttpServer( new \Ratchet\WebSocket\WsServer( new \MyApp\Chat() ) ); $loop = \React\EventLoop\Factory::create(); $secure_websockets = new \React\Socket\Server('0.0.0.0:8081', $loop); // ici 8080 return already used port $secure_websockets = new \React\Socket\SecureServer($secure_websockets, $loop, [ 'local_cert' => '/chemin/xxx.crt', 'local_pk' => '/chemin/xxx.key', 'verify_peer' => false ]); $secure_websockets_server = new \Ratchet\Server\IoServer($app, $secure_websockets, $loop); $secure_websockets_server->run();
quand je fait php bin/server.php sa mouline un peut et sa met ça Erreur!: SQLSTATE[HY000] [2002] Connection timed out
22 août 2024 à 22:07
Merci, du retour
je tombe sur une erreur au niveau du console "Websocket conne.. to wss.. failed"
quand je tape le server_name dans le navigateur je tombe sur un 502 Bad Gateway, je sais plus quoi faire.
encore merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionModifié le 23 août 2024 à 11:06
"Websocket conne.. to wss.. failed", tu as utilisé une configuration HTTPS ?
Je pars donc du principe que tu as un certificat situé dans :
/etc/nginx/ssl/your_certificate.crt; /etc/nginx/ssl/your_certificate.key;
Il faut voir ce que disent les logs du VPS.
Ouvre un terminal SSH rien que pour ça et lance un
sudo tail -f /var/log/nginx/error.log
A chaque connexion depuis le navigateur ou via le site Web, tu verras ce qui gratte ton proxy NGinX.
Ouvre une autre console SSH et fais les vérifications de base de la configuration.
Déjà, comme tout serveur Apache ou assimilé, on ne touche pas directement à /etc/nginx/nginx.conf. Au mieux on change des paramètres de taille POST par exemple. La configuration des ports d'écoute et des VirtualHost se fait depuis un fichier dédié à la configuration de ton site.
Si tu as touché à /etc/nginx/nginx.conf, remets-le d'origine (avec vim, nano ou depuis le FTP) :
user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections 1024; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Logs access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # Gzip compression gzip on; gzip_disable "msie6"; # Include the virtual host configurations include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Si ça n'a pas été fait, fais un :
touch /etc/nginx/sites-available/ratchet
Mets dans ce fichier tout ceci :
server { listen 80; server_name IP_OU_DOMAINE_DU_VPS; # Rediriger tout le trafic HTTP vers HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name IP_OU_DOMAINE_DU_VPS; # SSL configuration ssl_certificate /etc/nginx/ssl/your_certificate.crt; ssl_certificate_key /etc/nginx/ssl/your_certificate.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; # Répertoire du chat Ratchet root /var/www/chat; index index.html; # Redirection 404 si tentative d'accès à la racine location / { try_files $uri $uri/ =404; } # WebSocket reverse proxy configuration location /chat { proxy_pass http://127.0.0.1:8080 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Logs access_log /var/log/nginx/ratchet_access.log; error_log /var/log/nginx/ratchet_error.log; }
Une fois ce fichier créé, il faut "l'activer". NGinX ne voit que les fichiers dans sites-enabled, on ne va pas le copier mais créer un lien symbolique (c'est ce qui est couramment fait) :
sudo ln -s /etc/nginx/sites-available/ratchet /etc/nginx/sites-enabled/
A chaque modification des paramètres NGinX, n'oublie pas de le redémarrer, je t'ai mis les commandes plus haut. Restart également ratchet dans le doute.
Une fois les 2 redémarrés, vérifie leur statut avec :
systemctl status nginx systemctl status ratchet
Vérifie si tu as bien un processus en écoute sur le port 8080 :
sudo netstat -tulnp | grep 8080
Pour tester plus loin, il y a un outil sympa : wscat.
Il y a une version en ligne.
Pour installer wscat, il suffit d'un :
sudo npm install -g wscat
Si tu l'installes sur ton VPS pour tester ton webSocket en local avant de tester l'accès externe, lance :
wscat -c ws://localhost:8080
Pour tester depuis l'extérieur, installe wscat sur le terminal concerné puis lance :
wscat -c wss://IP_OU_DOMAINE_DU_VPS/chat
Tiens au jus !
Modifié le 23 août 2024 à 11:47
wscat -c ws://localhost:8080
error: connect ECONNREFUSED ::1:8080
les logs
2024/08/03 09:25:28 [emerg] 13958#13958: bind() to 0.0.0.0:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: bind() to [::]:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: bind() to 0.0.0.0:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: bind() to [::]:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: bind() to 0.0.0.0:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: bind() to [::]:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: bind() to 0.0.0.0:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: bind() to [::]:80 failed (98: Address already in use) 2024/08/03 09:25:28 [emerg] 13958#13958: still could not bind() 2024/08/04 11:47:22 [error] 14177#14177: *189 client intended to send too large body: 10485761 bytes, client: 195.170.172.128, server: _, request: "POST / HTTP/1.1", host: "51.79.50.43"
j'ai pas installer un certificat, je voulu utiliser celle du site qui est en ligne ?
je doit l'installer ? je sais même pas comment
23 août 2024 à 13:49
Vous mériter un câlin ????
J'ai finalement installer un certificate, et je peux me connecter en wss aver un
var conn = new WebSocket('wss://nom_de_domaine.fr/');
conn.onopen = function(e) {
console.log("ce good");
};
la console return un ce good en https donc ce cote la ce bon mais
quand je fait un php /var/www/chat/bin/server.php j'ai ça
Erreur!: could not find driver<br/>myfgfg_vps@.....:/var/www/chat/bin$
23 août 2024 à 14:20
C'est pas "complet" mais je vois l'idée.
Vous mériter un câlin ???? : c'est une façon intéressante de lire o__O
L'erreur vient du VPS, si le chat tape sur une BDD il vaut installer le driver PHP pour cette BDD. Si non, il y a du code à changer.
Modifié le 26 août 2024 à 13:03
Merci pour le bin/server.php (message #12).
- 8080 used
En premier lieu, le "8080 return already used port" est trivial avec les bonnes commandes.
Pour lister les processus sur le port 8080 (une des 3) :
sudo lsof -i :8080 sudo netstat -tulnp | grep :8080 sudo ss -tulnp | grep :8080
Identifie le PID (1 à 5 chiffres) du processus en LISTEN et force son arrêt avec :
sudo kill -9 PID
Vérifie avec la première commande.
Ceci fait ton chat Ratchet pourra à nouveau tourner sur le port 8080.
- Taper la BDD.
Tout est à faire sur le serveur hébergeant le site web et la BDD (si j'ai bien compris, c'est le cas)
C'est moins trivial parce que ça peut venir de différentes causes : firewall, configuration mySQL, droits de l'user MySQL. En bonus, forcer mySQL à utiliser SSL.
- firewall
Il faut ajouter une règle pour autoriser l'entrée sur le port 3306.
# ufw sudo systemctl status ufw sudo ufw allow 3306/tcp #iptables sudo systemctl status iptables sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # firewalld sudo firewall-cmd --state sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
- Configuration MySQL
Dans /etc/mysql/my.cnf ou /etc/my.cnf, changer
bind-address = 127.0.0.1
en
bind-address = 0.0.0.0
Ca permet d'écouter sur toutes les interfaces réseau. Si tu mets une interface spécifique, tu perds le localhost.
Redémarre mysql après ça
sudo systemctl restart mysql
- Droits de l'user
Connecte toi ainsi pour éviter de logger le mdp dans l'history du shell :
sudo mysql -u USER_ADMIN -p [Entrée] MDP [Entrée]
Une fois ici, liste les droits et rôles déjà présents pour te donner une idée de la conf.
-- Lister les users SELECT User, Host FROM mysql.user; -- Lister les droits d'un user SHOW GRANTS FOR 'username'@'host';
Tu peux supprimer un user et le recréer à ta sauce.
Ce qu'il faut savoir c'est qu'un user BDD pour un site doit avoir des droits limités, il est différent de l'user root par exemple. Aussi, on différencie un user venant de localhost d'un user venant de l'extérieur, pour ton site tu auras donc à minima 2 users.
-- Pour supprimer un utilisateur (ça ne touche pas la table ou la base, juste l'user) : DROP USER 'nom_utilisateur'@'hôte'; -- Vérifie avec : SELECT user, host FROM mysql.user; -- Pour créer un user non root : CREATE USER 'site_web_user'@'localhost' IDENTIFIED BY 'secure_password1'; CREATE USER 'chat_ratchet_user'@'%' IDENTIFIED BY 'secure_password2'; -- Pour lui affecter ses droits ((filtre encore plus les droits selon tes besoins) : GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, LOCK TABLES ON `nom_de_la_base`.* TO 'site_web_user'@'localhost' REQUIRE SSL; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, LOCK TABLES ON `nom_de_la_base`.* TO 'chat_ratchet_user'@'%' REQUIRE SSL;
Le REQUIRE SSL est pour plus bas, retire le pour le moment.
Finis par
FLUSH PRIVILEGES;
- Bonus : Configuration SSL
Dans le my.cnf identifié plus haut, mettre
ssl-ca = /chemin/vers/ca-cert.pem ssl-cert = /chemin/vers/server-cert.pem ssl-key = /chemin/vers/server-key.pem
Redémarre mysql.
retour sur le VPS
Pour ce qui est un exemple de l'utilisation de SSL avec MySQL dans ton chat :
Ligne 34 :
$mysqli = new \mysqli('host', 'user', 'password', 'database', 3306); $mysqli->ssl_set('/chemin/client-key.pem', '/chemin/client-cert.pem', '/chemin/ca-cert.pem', NULL, NULL); $mysqli->real_connect(); if ($mysqli->connect_error) { echo "Échec de la connexion MySQL : " . $mysqli->connect_error; return; } $stmt = $mysqli->prepare("INSERT INTO table_name (column1, column2) VALUES (?, ?)"); $stmt->bind_param('ss', $data['field1'], $data['field2']); $stmt->execute(); $stmt->close(); $mysqli->close();
retour sur le serveur du site web et de la bdd
Vérifie la connexion SSL avec MySQL avec :
sudo mysql -u USER_ADMIN -p [Entrée] MDP [Entrée]
SHOW STATUS LIKE 'Ssl_cipher';
Modifié le 26 août 2024 à 15:00
Il convient après chaque systemctl restart (ou start) de faire un status pour vérifier la bonne exécution du service.
Aussi, dans le cas où le .php sur le VPS n'arrive pas à taper la BDD pour cause de pilote, il faut les installer via SSH sur le VPS.
D'abord connaitre la version de PHP
php -v
Ensuite on installe les drivers mySQL :
sudo apt update #Selon la version de PHP sudo apt install php7.4-mysql sudo apt install php8.0-mysql sudo apt install php8.1-mysql # on redémarre tout sudo systemctl restart nginx sudo systemctl restart ratchet
Une fois redémarré, tu peux vérifier rapidement si l'extension mysql est présente dans php en créant un script info.php dans /var/www/html/chat (à supprimer après) :
<?php phpinfo(); ?>
php ./info.php
22 août 2024 à 09:52
@franksh StatutMembre des news ?