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

VerneMQ TLS认证场景下如何不吊销共享证书即可拦截特定客户端连接

针对VerneMQ不吊销证书拦截指定客户端连接的解决方案

你可以通过以下几种方式实现需求,无需将目标共享证书加入CRL吊销列表:

方案1:使用Lua认证插件基于证书指纹拦截(推荐)

该方案对现有架构改动最小,规则灵活可随时调整:

  • 第一步先提取待拦截共享证书的唯一指纹,执行命令:
    openssl x509 -in 你的共享证书文件名.crt -sha256 -fingerprint -noout
    记录输出的SHA256指纹值(格式为XX:XX:XX:...)
  • 第二步编写Lua拦截脚本block_cert.lua,示例逻辑如下:
    -- 配置要拦截的证书指纹黑名单
    local blocked_fingerprints = {
        ["替换为你刚才提取的SHA256指纹"] = true
    }
    
    function auth_on_register(peer_addr, peer_port, client_id, username, password, clean_session, keepalive)
        -- 获取当前连接客户端的证书SHA256指纹
        local client_fingerprint = auth_plugin.get_peer_cert_fingerprint("sha256")
        -- 匹配到黑名单则直接拒绝连接
        if client_fingerprint and blocked_fingerprints[client_fingerprint] then
            return {error = "not_authorized"}
        end
        -- 其余请求正常放行
        return ok
    end
    
  • 第三步修改VerneMQ配置,新增以下参数:
    # 关闭匿名访问,确保认证规则生效(你现有配置中该值为on,必须修改)
    DOCKER_VERNEMQ_ALLOW_ANONYMOUS = "off"
    # 启用Lua插件
    DOCKER_VERNEMQ_PLUGINS__VMQ_LUA = "on"
    # 配置Lua脚本挂载路径,需提前把block_cert.lua挂载到容器对应路径
    DOCKER_VERNEMQ_VMQ_LUA__PATH = "/vernemq/lua/block_cert.lua"
    
    重启VerneMQ服务后规则即可生效。

方案2:基于证书身份字段拦截

如果不想提取指纹,也可以通过证书DN字段做过滤:

  • 先打开你配置中注释掉的参数:DOCKER_VERNEMQ_LISTENER__SSL__USE_IDENTITY_AS_USERNAME = "on",开启后客户端证书的DN会自动作为MQTT连接的用户名传入认证逻辑
  • 你可以用VerneMQ内置的vmq_passwd工具,把待拦截的证书DN加入拒绝列表,或者直接在Lua插件中对username字段做匹配拦截即可。

方案3:前置代理层拦截

如果不想修改VerneMQ本身的配置,可以在服务前面加一层Nginx反向代理,在Nginx的TLS配置中添加证书指纹匹配规则,匹配到目标证书的请求直接在接入层断开,再把正常请求转发给后端VerneMQ即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:36:08