WebSocket via SSL avec proxy inverse Apache

Du côté du client, j’essaie d’établir la connexion wss:

var ws = new WebSocket("wss://wsserver.com/test")

et il retourne une erreur:

WebSocket connection to 'wss://wsserver.com/test' failed: Error during WebSocket handshake: Unexpected response code: 400

Les en-têtes complets sont:

En-têtes de demande

 GET wss://wsserver.com/test HTTP/1.1 Host: wsserver.com Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: https://website.net Sec-WebSocket-Version: 13 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: en-US,en;q=0.8 Sec-WebSocket-Key: Tj9AJ5TKglNf5LoHsQTpvQ== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

En-têtes de réponse

 Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:https://website.net Connection:close Content-Length:18 Content-Type:text/plain; charset=utf-8 Date:Fri, 21 Apr 2017 21:03:45 GMT Server:Apache/2.4.18 (Ubuntu) Vary:Origin X-Content-Type-Options:nosniff 

Le serveur fonctionne sur le port 8888 derrière un proxy inverse Apache. Ceci est la configuration Apache:

  ServerName website.com ProxyPreserveHost On ProxyRequests Off ProxyPass "/" "wss://localhost:8888/" 

mod_proxy et mod_proxy_wstunnel sont installés.

Y a-t-il quelque chose qui manque ici? Il semble que la demande passe par mais aucune connexion n’est établie.

J’ai fini par résoudre ce problème en utilisant cette configuration pour l’hôte virtuel, qui filtre les requêtes à l’aide des en-têtes HTTP:

  ServerName website.com RewriteEngine On # When Upgrade:websocket header is present, redirect to ws # Using NC flag (case-insensitive) as some browsers will pass Websocket RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule ^/ws/(.*) wss://localhost:8888/ws/$1 [P,L] # All other requests go to http ProxyPass "/" "http://localhost:8888/" 

Je laisse ceci comme référence au cas où cela aiderait les autres