You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel-Websockets SSL连接失败问题求助及排查细节

排查Laravel-Websockets在IIS 10下wss连接失败问题

一、证书格式与有效性排查

Laravel-Websockets要求使用包含证书+私钥的PEM格式文件,你用PFX转换来的PKCS7格式PEM大概率只包含证书,缺少私钥,这是核心问题之一:

  1. 检查现有PEM文件内容,执行命令:
    openssl pkcs7 -print_certs -in your-cert.pem
    
    查看是否有-----BEGIN PRIVATE KEY-----块,没有的话需要重新转换:
    • 从PFX提取私钥:
      openssl pkcs12 -in your-cert.pfx -nocerts -out private.key
      
      输入PFX的保护密码完成提取
    • 从PFX提取证书:
      openssl pkcs12 -in your-cert.pfx -clcerts -nokeys -out cert.crt
      
    • 合并证书与私钥为标准PEM:
      cat cert.crt private.key > combined.pem
      
  2. 更新.env中的证书路径为合并后的combined.pem,确保文件权限让IIS进程能读取。
  3. 验证证书域名匹配:确保证书的CN或SAN字段包含WebSocket服务器的域名,否则客户端会因域名不匹配拒绝连接。

二、跨域配置检查

客户端与WebSocket服务器域名不同,需同时配置Laravel-Websockets和IIS的跨域规则:

  1. 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'], // 替换为实际客户端域名,临时测试可用['*']
        ],
    ],
    
  2. IIS CORS配置:
    在站点的IIS管理器中添加CORS规则,允许客户端域名的OPTIONS、GET方法,同时放行Upgrade、Connection、Sec-WebSocket-Key等WebSocket相关请求头。

三、IIS WebSocket模块与反向代理配置

  1. 确认IIS已安装WebSocket Protocol功能(服务器管理器→角色→Web服务器→添加功能)。
  2. 若使用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>
    
  3. 检查防火墙:确保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'],
});

五、日志与调试

  1. 查看Laravel日志(storage/logs/laravel.log),检查是否有证书加载失败、跨域拒绝的错误信息。
  2. 浏览器开发者工具→Network标签:查看WebSocket请求的Request Headers是否包含Upgrade: websocket和Connection: Upgrade,若响应中无Sec-WebSocket-Accept头,说明请求在IIS或Laravel-Websockets层被拦截。

内容的提问来源于stack exchange,提问作者pileup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:22:22