【问题标题】:Laravel beyondcode websockets - doesn't work if verify_peer is trueLaravel Beyondcode websockets - 如果 verify_peer 为真则不起作用
【发布时间】:2021-09-01 19:15:51
【问题描述】:

我正在使用包beyondcode/laravel-websockets。

我的问题是当我设置'verify_peer' => true 时,websocket 不起作用,但是当值为false 时它正在工作。这里有没有人设法使它工作?

对于生产网站,我想将verify_peer 设置为true 以防止中间人攻击。

我有一个网站,比如说aceraven777.com,它已经安装了SSL(在cPanel 中它启用了autoSSL)。

在 websockets 配置中,我为证书和私钥输入了相同的路径(cPanel 生成的路径)。

chrome抛出错误:

WebSocket connection to 'wss://aceraven777.com:6001/app/asdfswerqwsafasfd?protocol=7&client=js&version=4.3.1&flash=false' failed: 
createWebSocket @ pusher.min.js:8

这是firefox中的错误:

Firefox can’t establish a connection to the server at wss://aceraven777.com:6001/app/asdfswerqwsafasfd?protocol=7&client=js&version=4.3.1&flash=false. pusher.min.js:8:6335

以下是我使用的设置:

配置/websockets.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),

    'verify_peer' => true,
],

config/broadcasting.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' => env('PUSHER_APP_HOST'),
        'port' => env('PUSHER_APP_PORT'),
        
        'useTLS' => true,
        'scheme' => 'https',
        
        'curl_options' => [
            CURLOPT_SSL_VERIFYHOST => 1,
            CURLOPT_SSL_VERIFYPEER => 1,
        ],
    ],

    // Configuration for laravel mix JS
    'mix' => [
        'host' => env('MIX_PUSHER_APP_HOST'),
        'key' => env('MIX_PUSHER_APP_KEY'),
        'cluster' => env('MIX_PUSHER_APP_CLUSTER'),
        'port' => env('MIX_PUSHER_APP_PORT'),
    ],
],

【问题讨论】:

  • @Haridarshan,我的显示另一个错误:WebSocket connection to 'wss://localhost:6001/app/asdfswerqwsafasfd?protocol=7&client=js&version=4.3.1&flash=false' failed。
  • 能否分享完整的错误响应。
  • 另外,您在 Chrome 或 Firefox 中也遇到此错误?
  • @Haridarshan 我编辑了我的问题,这些是 Chrome 和 firefox 中的完整错误响应。

标签: php laravel websocket


【解决方案1】:

在我看来,您没有连接到正确的端口。

PusherJs 使用默认的网络端口 80 和 443,如下所述:https://pusher.com/docs/channels/library_auth_reference/pusher-websockets-protocol

更改 .env 文件中的端口

【讨论】:

  • 我使用了正确的端口,如果您完全阅读了我的问题详细信息,如果我将verify_peer 设置为false,它就可以工作。如果我将它设置为true,它就不起作用
  • @aceraven777 好的,这些文件 local_cert 和 local_pk 可读吗?这些文件的权限是什么?您可以检查这是否是 php artisian websocket:serve 的问题
【解决方案2】:

您可能需要在本地文件系统上指定一个证书颁发机构文件。

这是生产服务器上 95% 的错误的根源。

另外 4% 是由自签名证书引起的,我怀疑你在生产环境中拥有。

您需要修改您的config/websockets.php

'ssl' => [
    // ... 

    'capath' => env('LARAVEL_WEBSOCKETS_SSL_CA', null),
],

CA 路径通常是类似于/etc/ssl/certs/ 的目录。

如果这不起作用,请尝试允许自签名证书:

'ssl' => [
    // ... 

    'allow_self_signed' => true,
],

有关更多信息,您应该查看PHP specification for SSL verify peer。

【讨论】:

  • 是cafile 不同于local_cert 和local_pk?
  • 本地证书是CA文件,但是你确定它是正确的吗?
  • 是的,我确定。我联系了支持团队并确认 ca 文件、私钥位于正确的路径中。我无法让它发挥作用,这非常令人沮丧。我想我必须将 verify_peer 设置为 false
  • @aceraven777 我错了,在 SSL 配置中 CA 证书被指定为 'capath' => env('LARAVEL_WEBSOCKETS_SSL_CA', null),。
  • 我们使用cafile 或capath 都没有关系,对吧?根据 PHP 文档,cafile 是 CA 文件本身的完整路径,capath 是 CA 文件所在的目录。只要您将其指向正确的文件/目录,它应该可以正常工作吗?我尝试了cafile 和capath,都没有工作:(
【解决方案3】:

这篇文章在不久前帮助我实现了 websockets,尤其是使用 SSL 证书: https://christoph-rumpel.com/2020/11/laravel-real-time-notifications

您还拥有 git 存储库,告诉您如何使用和不使用 SSL 实现。

【讨论】:

  • 如果你设置了'verify_peer' => true,你还记得你的config/websockets.php吗?这就是我现在的问题,如果我将其设置为 false 它可以工作。
猜你喜欢
  • 2019-09-06
  • 2021-10-09
  • 1970-01-01
  • 2020-12-11
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多