普通网友 2025-11-23 13:55 采纳率: 98.9%
浏览 9
已采纳

WVP-ZLM推流鉴权失败如何排查?

问题:WVP-ZLM推流鉴权失败常见原因之一是GB28181设备注册信息与ZLMediaKit配置不匹配。例如,设备编号(DeviceID)、IP端口、认证密码等参数在WVP平台与ZLM中设置不一致,导致推流时无法通过RTMP鉴权。此外,ZLMediaKit未开启RTMP推流鉴权功能或回调URL配置错误,也会造成鉴权拒绝。需检查WVP的设备管理配置、ZLM的config.ini中rtmp鉴权开关及http_hook配置,并确认WVP是否正确启用了推流鉴权回调接口,确保各服务间网络互通且时间同步。
  • 写回答

1条回答 默认 最新

  • 蔡恩泽 2025-11-23 14:01
    关注

    WVP-ZLM推流鉴权失败的深度分析与系统性排查方案

    1. 问题背景与核心机制解析

    在基于GB/T28181协议构建的视频监控平台中,WVP(Web Video Platform)作为信令管理中枢,常与ZLMediaKit媒体服务器协同完成设备注册、推流转发与RTMP拉流等功能。当GB28181设备向ZLM发起RTMP推流时,若出现“鉴权失败”,其根本原因往往涉及多层级配置不一致或服务间通信异常。

    典型表现为:设备成功注册至WVP平台,但推流请求被ZLM拒绝,日志显示“auth failed”或“hook timeout”。该问题并非单一组件故障,而是跨系统参数匹配、功能开关、网络可达性及时间同步等综合因素所致。

    2. 常见技术问题分类

    • 设备标识不一致:WVP中录入的DeviceID与ZLM期望的Stream ID命名规则不符
    • 认证密钥错配:WVP生成的推流URL含密码token,而ZLM未正确解析或密钥不匹配
    • 端口映射错误:设备推流目标IP:Port与ZLM实际监听地址不一致
    • RTMP鉴权未启用:ZLM的config.inienable_rtmp_auth=0
    • HTTP Hook回调失效:ZLM无法访问WVP提供的/api/rtmp/auth接口
    • 时间不同步:设备、WVP、ZLM之间时间偏差超过token有效期容忍范围
    • 防火墙阻断:30000~50000端口段(默认RTP接收端口)被拦截
    • DNS解析失败:回调URL使用域名且解析异常
    • HTTPS证书问题:启用SSL后WVP证书不受ZLM信任
    • 并发连接超限:ZLM设置max_connections导致新推流被拒

    3. 鉴权流程与数据流向分析

    ZLMediaKit在收到RTMP推流请求(如rtmp://zlm:1935/live/device_001?pwd=abc123)时,执行以下步骤:

    1. 解析URL中的app/stream路径和参数
    2. 判断是否开启RTMP鉴权(enable_rtmp_auth=1
    3. 构造HTTP POST请求发送至http_hook.auth_address
    4. 携带JSON数据包括stream_id, ip, params, vhost等字段
    5. 等待WVP返回200 OK并解析响应体{“code”:0}表示通过
    6. 若超时或返回非0码,则断开推流连接
    7. 通过后将流注册到MediaServer内部会话表
    8. 通知WVP via WebSocket或MQTT更新流状态
    9. 开始接收H.264/AAC音视频包
    10. 记录日志并触发后续转码或分发逻辑

    4. 核心配置检查清单

    检查项位置正确示例常见错误
    enable_rtmp_authZLM config.inienable_rtmp_auth=1=0 或注释掉
    http_hook.auth_addressZLM config.inihttp://wvp:8080/api/rtmp/authIP错误、端口不对、路径缺失
    设备DeviceIDWVP设备管理34020000001320000001少一位或格式错误
    推流URL密码WVP生成URL?pwd=${md5(deviceId+secret)}静态密码未加密
    WVP回调监听WVP application.ymlzlm.hook-ip=本机内网IP使用localhost或127.0.0.1
    NTP同步所有节点chrony或ntpd运行中时间差>5分钟
    防火墙策略主机iptables/firewalld开放1935,8080,30000-50000仅开放部分端口
    Docker网络模式容器部署host模式或bridge+publishbridge未映射关键端口
    HTTPS支持ZLM http_hookhttps://wvp:8443/api/...证书未导入ZLM CA store
    数据库一致性WVP MySQLdevice表与channel表关联正确手动插入导致外键断裂

    5. ZLMediaKit关键配置片段

    [http]
    # 启用HTTP Hook模块
    enable_http_hook=1
    
    [rtmp]
    # 必须开启RTMP推流鉴权
    enable_rtmp_auth=1
    
    [hook]
    # 回调地址需指向WVP公网或内网可访问IP
    auth_address=http://192.168.10.100:8080/api/rtmp/auth
    timeout_sec=5
    retry_cnt=2
    
    [general]
    # 保证ZLM获取真实客户端IP
    monitor_ip=0.0.0.0
    

    6. 排查流程图

    graph TD A[推流失败] --> B{ZLM日志是否有'auth failed'?} B -- 是 --> C[检查enable_rtmp_auth=1] B -- 否 --> D[检查设备是否在线] C --> E[验证http_hook.auth_address可达性] E --> F[使用curl模拟POST请求] F --> G{WVP返回code=0?} G -- 是 --> H[检查时间同步] G -- 否 --> I[调试WVP鉴权逻辑] H --> J[确认NTP服务正常] I --> K[查看WVP日志异常堆栈] J --> L[抓包分析TCP三次握手] K --> L L --> M[最终定位根源]

    7. 实战调试命令集

    # 测试ZLM能否访问WVP回调接口
    curl -X POST http://wvp-server:8080/api/rtmp/auth \
         -H "Content-Type: application/json" \
         -d '{
               "app":"live",
               "stream":"device_001",
               "ip":"192.168.1.50",
               "params":{"pwd":"e10adc3949ba59abbe56e057f20f883e"},
               "vhost":"__defaultVhost__"
             }'
    
    # 抓取ZLM启动时的Hook注册行为
    tcpdump -i any port 8080 and host wvp-server -nn -s0 -w hook.pcap
    
    # 查看Docker容器间网络连通性
    docker exec -it zlm-container ping wvp-container
    
    # 检查系统时间偏差
    ntpdate -q pool.ntp.org
    
    # 跟踪ZLM内部事件日志
    tail -f /var/log/ZLMediaKit.log | grep -E "on_publish|auth"
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月24日
  • 创建了问题 11月23日