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

物联网场景下基于JWT的MQTT认证:HAProxy能否提取验证JWT令牌?

是的,HAProxy完全具备提取MQTT over WebSocket连接中password字段的JWT令牌并完成验证的能力,下面是具体实现方案和关键要点:

核心原理

MQTT over WebSocket的连接分两步:先完成WebSocket握手,之后客户端发送MQTT CONNECT报文,你放在password字段的JWT就包含在这个报文中。HAProxy可以通过TCP层的报文检查,捕获CONNECT报文中的password字段内容,再对接JWT验证逻辑,提前拦截无效连接。

具体配置步骤(基于HAProxy 2.2+,内置JWT验证功能)

  1. 配置TCP检查与报文捕获
    在frontend中设置等待时长,确保HAProxy能接收到完整的MQTT CONNECT报文,再通过规则提取password字段:

    frontend mqtt_ws_frontend
        bind *:8080
        mode tcp
        # 等待5秒接收完整的MQTT CONNECT报文,可根据网络情况调整
        tcp-request inspect-delay 5s
        # 捕获MQTT CONNECT报文中的password字段(需根据MQTT协议格式调整偏移参数)
        # 示例:从payload第10位开始捕获,最大长度2048(适配JWT长度)
        tcp-request content capture req.payload(10,0) len 2048
        # 将捕获到的JWT存入HAProxy变量
        tcp-request content set-var(txn.jwt_token) req.capture(0)
    
  2. 对接JWT验证逻辑
    可以直接用HAProxy内置的JWT验证能力,或者通过Lua脚本实现更灵活的校验:

    # 调用Lua脚本验证JWT
        tcp-request content lua.jwt_verify txn.jwt_token
        # 验证失败则直接拒绝连接
        tcp-request content reject if { var(txn.jwt_valid) -m bool false }
    
  3. Lua脚本实现JWT验证(可选)
    编写Lua脚本解析JWT、验证签名与有效期,将结果返回给HAProxy:

    core.register_action("jwt_verify", { "tcp-req-content" }, function(txn, jwt_token)
        local jwt = require("jwt")
        -- 替换为你的JWT签名密钥
        local secret = "your-jwt-secret-key"
        local valid, err = jwt.verify(jwt_token, secret)
        if valid then
            txn:set_var("txn.jwt_valid", true)
        else
            txn:set_var("txn.jwt_valid", false)
            txn:alert("Invalid JWT: " .. err)
        end
    end)
    

关键注意事项

  • 版本要求:HAProxy 2.2及以上版本内置JWT验证模块,低版本需依赖Lua脚本实现JWT解析。
  • 报文格式匹配:需对照MQTT 3.1/3.1.1/5.0协议规范,调整req.payload的偏移参数,确保准确捕获password字段的JWT内容。
  • 超时调整:tcp-request inspect-delay的时长要适配客户端的网络速度,避免合法连接因等待超时被拦截。
  • 密钥安全:JWT签名密钥建议通过HAProxy的环境变量或配置文件加密存储,避免明文暴露。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:05:12