Laravel (11.9)
Reverb (1.0)
If you’re encountering errors while using Laravel Reverb with HTTPS and a self-signed certificate, here’s a solution that might help. After struggling with this issue for a couple of hours, I found a fix that worked. Here’s what you need to do:
1. Update Your .env File
Ensure that REVERB_SCHEME is set to https:
REVERB_SCHEME=https
SSL_CERTIFICATE=path/to/file.crt
SSL_CERTIFICATE_KEY=path/to/file.key
2. Configure Nginx
Here’s an example of an Nginx configuration for Reverb:
# Route traffic to Reverb (broadcasting)
location @ws {
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://0.0.0.0:8080;
}
3. Update config/reverb.php
Ensure you point to your local certificate and key, and set verify_peer to false if you are using a self-signed certificate:
'options' => [
'tls' => [
'local_cert' => env('SSL_CERTIFICATE'),
'local_pk' => env('SSL_CERTIFICATE_KEY'),
'verify_peer' => env('APP_ENV') !== 'local',
],
],
4. Update config/broadcasting.php
Similarly, configure Guzzle client options to disable verification for local environments:
'client_options' => [
// Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
'verify' => env('APP_ENV') !== 'local',
],
5. Expose port 8080
If you’re using Docker, ensure that port 8080 is publicly exposed.
This setup should help you resolve issues related to using Laravel Reverb with HTTPS and a self-signed certificate 🙂
RECAP:
Initially, I encountered issues with the Nginx configuration. The default configuration from the Laravel documentation was incorrect because the location / directive was already in use. Instead, I needed to use @ws.
Subsequently, I struggled to access port 8080 because I had forgotten to expose it.
Even after exposing the port, the websocket worked over HTTP but failed over HTTPS, despite setting REVERB_SCHEME to https.
Finally, I noticed errors in the console and app logs, which led me to discover incorrect verify_peer settings.