web-dev-qa-db-ja.com

phpラチェットwebsocket SSL接続?

ラチェットチャットサーバーファイルがあります

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

Websocketを使用してwsと接続し、正常に動作します

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

安全な接続が必要なため、SSLで接続しようとしましたが、うまくいきません。

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

私の質問はwebsocketをSSL接続で接続する方法

何か案が?

34
vietnguyen09

Apache Webサーバー(2.4以上)を使用している場合、httpd.confファイルでこれらのモジュールを有効にします。

  1. mod_proxy.so
  2. mod_proxy_wstunnel.so

この設定をhttpd.confファイルに追加します

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

WSS接続が必要な場合は、JavaSscript呼び出しで次のURLを使用します。

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

Apache Webサーバーを再起動し、ラチェットワーカー(Webソケット接続)が開いていることを確認してから、設定(telnetホスト名ポート)を適用してください。

38
webcoder

問題は、React(Ratchetが構築されている)は直接SSL接続をサポートしていないことです。これを参照してください issue

簡単な回避策があります。次のような構成で stunnel を使用します。

[websockets]
accept = 8443
connect = 8888

Stunnelは、ポート8443でSSLトラフィックを処理し、Websocketサーバーにポートします。

10
mattexx

ラチェットのグーグルグループ by クリスボーデン

最適な解決策は、NginxをWebサーバーとして使用することです。 Nginxが着信接続をポート80でリッスンし、SSLを処理するようにします。 Nginxは通常のWebサイトの着信接続をPHP-FPMに転送します。接続がWebSocket接続であると検出した場合は、選択したポートで実行中のラチェットアプリケーションにプロキシします。あなたのjavascriptはwss://mydomain.org経由で接続できます

これは、アプリケーションが nginx を使用して提供される場合、 stunnel を使用する代替方法です。

9
Songo

数日前、私はこの質問の答えを探していましたが、Github Ratchetの問題でこれを見つけました: https://github.com/ratchetphp/Ratchet/issues/489

heidji で答えられた最後の答えはこう言います:

このコメントは、SSLを実装する方法を簡単に説明する必要がある初心者の場合にのみ追加します。
$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]);
そして上記のcbodenが述べたようにIoServerに注入します

したがって、HTTPSプロキシを必要とせずに、Ratchetで安全なWebSocketサーバーを実装する方法があるようです。

SecureServerクラスのドキュメントは次のとおりです。 https://github.com/reactphp/socket#secureserver

6
Jordi

Nginxを使用している場合は、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;
}

これにより、wss://yoursite.com/services/myserviceポート1234で実行されているソケットを呼び出します。ポート1234を世界中に公開したままにしないでください。

5

Apacheも私のために働いて、ドメインconfに追加するだけです:

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

Apacheをリロードしてからインポートし、クライアント側でwssを設定して/ wss / location

wss://127.0.0.1/wss/
4
rukavina

Windows IISを使用している場合、HTTPS用に構成されていることを確認し(自己署名証明書を使用しています)、リバースプロキシをインストールします。

URL書き換え: https://www.iis.net/downloads/Microsoft/url-rewrite およびARR 3.0: https://www.iis.net/downloads/Microsoft/application -request-routing

また、IISでwebsocketサポートを有効にする必要があります: enter image description here

uRL書き換え用のフォルダー(myproxyfolderなど)を作成し、このフォルダーでコンテンツを含むweb.configファイルを作成します。

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

そして、「 http://127.0.0.1:808 」をWebSocketサービスに変更します(PHP WINでRatchedを使用しています)。

JavaScriptのクライアント側で、次のように安全なwebsockets wss://プロトコルを使用します。

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

それはubuntu 18.04のために私のために働いています。

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

ターミナルで次のコマンドを実行して、プロキシモジュールを有効にしました。

Sudo a2enmodプロキシproxy_balancer proxy_wstunnel proxy_http

Apache仮想ホスト設定ファイル(/etc/Apache2/sites-available/000-default-le-ssl.conf)にこれらの行を追加しました

ProxyRequestsオフ

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

Apacheサービスを再起動しました。そして、websocketはhttpsで動作し始めました。