Laravel-Websockets SSL连接失败问题求助及排查细节
排查Laravel-Websockets在IIS 10下wss连接失败问题
一、证书格式与有效性排查
Laravel-Websockets要求使用包含证书+私钥的PEM格式文件,你用PFX转换来的PKCS7格式PEM大概率只包含证书,缺少私钥,这是核心问题之一:
- 检查现有PEM文件内容,执行命令:
查看是否有openssl pkcs7 -print_certs -in your-cert.pem-----BEGIN PRIVATE KEY-----块,没有的话需要重新转换:- 从PFX提取私钥:
输入PFX的保护密码完成提取openssl pkcs12 -in your-cert.pfx -nocerts -out private.key - 从PFX提取证书:
openssl pkcs12 -in your-cert.pfx -clcerts -nokeys -out cert.crt - 合并证书与私钥为标准PEM:
cat cert.crt private.key > combined.pem
- 从PFX提取私钥:
- 更新
.env中的证书路径为合并后的combined.pem,确保文件权限让IIS进程能读取。 - 验证证书域名匹配:确保证书的
CN或SAN字段包含WebSocket服务器的域名,否则客户端会因域名不匹配拒绝连接。
二、跨域配置检查
客户端与WebSocket服务器域名不同,需同时配置Laravel-Websockets和IIS的跨域规则:
- Laravel-Websockets配置:
修改config/websockets.php的apps数组,添加允许的客户端域名:'apps' => [ [ 'id' => env('PUSHER_APP_ID'), 'name' => env('APP_NAME'), 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'allowed_origins' => ['https://your-client-domain.com'], // 替换为实际客户端域名,临时测试可用['*'] ], ], - IIS CORS配置:
在站点的IIS管理器中添加CORS规则,允许客户端域名的OPTIONS、GET方法,同时放行Upgrade、Connection、Sec-WebSocket-Key等WebSocket相关请求头。
三、IIS WebSocket模块与反向代理配置
- 确认IIS已安装WebSocket Protocol功能(服务器管理器→角色→Web服务器→添加功能)。
- 若使用IIS反向代理(ARR)转发WebSocket请求,需保留关键请求头:
在站点的web.config中添加规则:<system.webServer> <rewrite> <rules> <rule name="Forward WebSocket" stopProcessing="true"> <match url="^ws/(.*)" /> <action type="Rewrite" url="wss://localhost:6001/{R:1}" /> </rule> </rules> <outboundRules> <rule name="Preserve Upgrade Header"> <match serverVariable="RESPONSE_Upgrade" pattern=".*" /> <action type="Rewrite" value="{HTTP_Upgrade}" /> </rule> <rule name="Preserve Connection Header"> <match serverVariable="RESPONSE_Connection" pattern=".*" /> <action type="Rewrite" value="Upgrade" /> </rule> </outboundRules> </rewrite> </system.webServer> - 检查防火墙:确保WebSocket使用的端口(默认6001)已开放,且IIS站点的SSL绑定端口(如443)能正常接收wss请求。
四、Laravel-Echo前端配置验证
确保前端配置与服务器完全匹配:
import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'pusher', key: process.env.MIX_PUSHER_APP_KEY, wsHost: 'your-websocket-domain.com', // 替换为WebSocket服务器域名 wsPort: 6001, wssPort: 6001, forceTLS: true, disableStats: true, // 禁用统计接口避免干扰 enabledTransports: ['wss'], });
五、日志与调试
- 查看Laravel日志(
storage/logs/laravel.log),检查是否有证书加载失败、跨域拒绝的错误信息。 - 浏览器开发者工具→Network标签:查看WebSocket请求的
Request Headers是否包含Upgrade: websocket和Connection: Upgrade,若响应中无Sec-WebSocket-Accept头,说明请求在IIS或Laravel-Websockets层被拦截。
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

