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配置,新增以下参数:
重启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"
方案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
相关产品推荐
相关产品推荐

