2

概述

这是我第一次使用 websockets。我正在从事的项目是使用 Laravel 框架,所以我选择尝试Laravel Websockets(版本 1.3.0)。

我使用这个包建立了一个简单的概念验证项目,并且这样做能够成功启动并运行它。不过,此概念验证中的通信是不安全的 (ws://)。

现在,我正在尝试将 Laravel Websockets 包集成到一个使用 SSL 保护的生产应用程序中,在这种情况下,当我尝试从/laravel-websockets仪表板建立连接时,我的浏览器控制台会立即出现错误ERR_CONNECTION_RESET

网络选项卡显示正在安全地尝试通信 (wss://)。它还显示了正确的域名和端口。因此,我认为问题出在服务器端,但我仍然不知道问题出在哪里。

我在本地开发环境(Win 10/IIS/PHP7.4/Self-signed SSL Cert)以及沙盒环境(Win Server 2016/IIS/PHP7.4/Let's Encrypt SSL Cert)中遇到了相同的结果)

万一有什么不同,在我的本地开发环境中,我正在使用该HOSTS文件将流量重定向myapp.dev.local127.0.0.1

我的相关部分.env

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=XXX
PUSHER_APP_KEY=XXX
PUSHER_APP_SECRET=IHAVENEVERDONETHISBEFORE
PUSHER_APP_CLUSTER=mt1


LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT="C:/certificate.cer"
#LARAVEL_WEBSOCKETS_SSL_LOCAL_PK="C:/privateKey.key"
#LARAVEL_WEBSOCKETS_SSL_PASSPHRASE=1234

在查看 laravel-websockets 库的文档时,我发现我需要将config/websockets.php文件配置为指向我的证书文件,并且它们必须是 PEM 编码的。在网上快速搜索后,看起来.cer, .crt,.pem文件都符合这个要求。我已使用 MMC 管理单元将使用中的证书导出为 Base-64 编码的 X.509 (CER),并一直将我的环境变量指向它。

有什么建议我可以让它工作吗?

websockets.php

    /*
     * Define the optional SSL context for your WebSocket connections.
     * You can see all available options at: http://php.net/manual/en/context.ssl.php
     */
    'ssl' => [
        /*
         * Path to local certificate file on filesystem. It must be a PEM encoded file which
         * contains your certificate and private key. It can optionally contain the
         * certificate chain of issuers. The private key also may be contained
         * in a separate file specified by local_pk.
         */
        'local_cert' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT', null),

        /*
         * Path to local private key file on filesystem in case of separate files for
         * certificate (local_cert) and private key.
         */
        'local_pk' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_PK', null),

        /*
         * Passphrase for your local_cert file.
         */
        'passphrase' => env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null),

        'allow_self_signed' => true,

        'verify_peer' => false,
    ],

广播.php

        'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                'host' => '127.0.0.1',
                'port' => 6001,
                'scheme' => 'https',
                'curl_options' => [
                    CURLOPT_SSL_VERIFYHOST => 0,
                    CURLOPT_SSL_VERIFYPEER => 0,
                ]
            ],
        ],

引导程序.js

import Echo from 'laravel-echo'
console.log('Here')

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    forceTLS: true,
    wsHost: window.location.hostname,
    wsPort: 6001,
    wssPort: 6001,
    disableStats: true,
    enabledTransports: ['ws', 'wss'], // <-- only use ws and wss as valid transports
});
4

0 回答 0