概述
这是我第一次使用 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.local
到127.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
});