环境信息
- EMQ X 版本:v4.3.5
- 操作系统及版本1:Windows10, docker部署,不方便看日志后又使用如下centos系统
- 操作系统及版本2:CentOS Linux release 7.9.2009 (Core)
- 备注:在以上两个操作系统下操作,问题现象一样
mqtt客户端测试工具
- MQTTX v1.6.0
JWT生成软件环境信息
- JWT-token生成服务器:java11,spring boot
- 使用Java库:io.jsonwebtoken.Jwts
- JWT生成算法:SignatureAlgorithm.RS256
Java生成JWT token的代码在下方截图所示
问题描述
测试流程如下:
- 前端登录我们的web服务器【Java spring boot】,web服务器生成jwt token【RS256算法】给前端。
- 在MQTTX 工具中新建一个mqtt连接,随意填上client id,username
- 我手动从页面拷贝token到MQTTX 工具中的password输入框,准备使用这个token来连接emqx mqtt服务器
- 此时 Connect出现错误,有截图
- 为了排除环境部署等低级错误,使用HS256 JWT加密算法做对比测试,mqtt连接正常,HS256 token字符串的生成是在emqx的dashboard->Plugins->emqx_auth_jwt右侧manage中生成的
备注:dashboard中emqx_auth_jwt插件的管理界面无法生成RS256的token
配置文件及日志
emqx_auth_jwt.conf内容如下:
##--------------------------------------------------------------------
## JWT Auth Plugin
##--------------------------------------------------------------------
## HMAC Hash Secret.
##
## Value: String
#auth.jwt.secret = emqxsecret
## RSA or ECDSA public key file.
##
## Value: File
auth.jwt.pubkey = /etc/emqx/certs/rsa.pub
## The JWKs server address
##
## see: http://self-issued.info/docs/draft-ietf-jose-json-web-key.html
##
#auth.jwt.jwks = https://127.0.0.1:8080/jwks
## The JWKs refresh interval
##
## Value: Duration
#auth.jwt.jwks.refresh_interval = 5m
## From where the JWT string can be got
##
## Value: username | password
## Default: password
auth.jwt.from = password
## Enable to verify claims fields
##
## Value: on | off
auth.jwt.verify_claims = off
## The checklist of claims to validate
##
## Configuration format: auth.jwt.verify_claims.$name = $expected
## - $name: the name of the field in the JWT payload to be verified
## - $expected: the expected value
##
## The available placeholders for $expected:
## - %u: username
## - %c: clientid
##
## For example, to verify that the username in the JWT payload is the same
## as the client (MQTT protocol) username
#auth.jwt.verify_claims.username = %u
- 生成jwt token的具体Java代码如下图:
- MQTTX 工具界面如下图:
- RS256 的token连接错误日志如下图