emqx启用双向ssl/tls安全认证后,mqttx仍然连接不上

(1) 通过这个连接创建了EMQX 启用双向 SSL/TLS 安全连接 | EMQ 服务端证书和客户端证书

(2) 所以证书的附件我以上传
newcert.zip (9.8 KB)

(3) 步骤2中的证书没有生成客户端的ca文件证书,我用的是生成服务端的ca.pem这个证书放到mqttx中

(4) 通过mqttx的ssl/tls连接仍然无法连接,如下图所以:

(5) 连接任然报错错误信息如下:

按照教程,你只填ca证书,下面两个留空

根据这里的提示打开debug,看看日志里有没有错误提示:
“ MQTT 连接测试(OpenSSL)”

edit: 使用更清晰的 png 格式截图
hi 请贴下你的 EMQX 监听器配置
另外需要验证下监听器配置的证书是否正确,我按照 blog 中的步骤签署了证书,能够正常连接 (ip.addr = 127.0.0.1)
证书对应关系如下:

连接正常:

openssl.conf 配置文件内容如下:

生成ca.crt 这个证书是下面这个配置吗

上图的ip.1,DNS.1 地址都是127.0.0.1, 我不是本地搭建,能写成物理机的外网访问地址吗

是的,要根据你实际部署的地址来配置。
生产环境建议买个域名并使用 DNS ,这样在 ip 变化的时候不用再频繁更换证书。

我现在用的emqx5.5版本, 看下emqx.conf的配置对吗,如下图:

单看文件名没什么问题(如果你在配置过程中没有进行过文件重命名)

关键在与,你在 EMQX 中配置的 ca.pem, emqx.pem, emqx.key 这几个文件,是否正确?证书签发过程是否正确?

mqttx(client)使用填进去的 ca.pem 验证服务端的证书 emqx.pem
EMQX(Server)使用监听器配置中的 ca.pem 验证客户端的证书 client.pem

这要求:
client.pem 由服务端侧配置的 ca.pem 签发
emqx.pem 由客户端侧配置的 ca.pem 签发

docker安装的emqx 中有如下几个证书:


能直接用吗?

他们的组合是什么样的

不可以,这几个证书是示例证书

需要使用你自签名的 ca 证书,以及该自签名 ca 证书签发的服务端证书。

你可以用这个命令来看以下证书的详细信息

openssl x509 -in [FILE_NAME] -noout -text

我把生成的证书放入这个文件夹中,docker应用重启就出现失败,需要重新安装镜像,
那我生成的文件只能放入docker 容器中新创建一个文件夹吗

两个方法

  • 可以通过 dashboard 更改 ssl 监听器使用的证书
  • 挂载 data 目录使 docker container 能够持久化,证书也放入 data 目录中

参考文档链接:

https://www.emqx.io/docs/zh/v5.6/deploy/install-docker.html#docker-部署注意事项

https://www.emqx.io/docs/zh/v5.6/network/emqx-mqtt-tls.html

我现在发现一个问题,不知道是不是emqx的bug,还是我的配置问题

单向ssl/tls认证:

(1) 控制面板上传三个证书, 不开启验证客户端证书这个按钮,mqttx上传一个CA证书, mqttx连接emqx能通过

(2) 控制面板上传三个证书, 开启验证客户端证书这个按钮,mqttx上传一个CA证书, mqttx连接emqx能通过

双向ssl/tls认证:

(1) 控制面板上传三个证书, 不开启验证客户端证书这个按钮,mqttx上传一个CA证书, mqttx连接emqx能通过

(2) 控制面板上传三个证书, 开启验证客户端证书这个按钮,mqttx上传一个CA证书, mqttx连接emqx能通过

(3) 控制面板上传三个证书, 不开启验证客户端证书这个按钮,mqttx上传3个证书, mqttx连接emqx能通过

(4) 控制面板上传三个证书, 开启验证客户端证书这个按钮,mqttx上传三个证书, mqttx连接emqx能通过

下面如图的按钮管用吗?

@xujun6868168 你上面描述的mqttx连接都是连的ssl端口吗?

@yusf ,请看下那个按钮的问题。

都是连接的8883端口,

问题1: 如果开启了ssl/tls双向认证,emqx面板不开启验证客户端证书,mqttx上传一个CA证书就能连接是这个逻辑吗

问题2: 如果开启了ssl/tls双向认证,emqx面板开启验证客户端证书,mqttx需要上传三个证书才能连接是这个逻辑吗

开启「验证客户端证书」开关后,EMQX 会在客户端连接使用证书时进行验证。
但如果客户端没有证书,会根据开关「没有证书则 SSL 失败」的状态,有不同的行为。

  • 验证客户端证书=true, 没有证书则SSL失败=true
    • 客户端使用证书连接,并且证书验证成功,则 TLS 握手成功。继续连接流程
    • 客户端无证书,TLS 握手失败。客户端不能连接。
  • 验证客户端证书=true, 没有证书则SSL失败=false
    • 客户端使用证书连接,并且证书验证成功,则 TLS 握手成功。继续连接流程
    • 客户端无证书,TLS 握手成功。继续连接流程
  • 验证客户端证书=false,此时 有证书则SSL失败 选项只能为 false
    • 此时无论客户端是否使用证书进行连接。都将握手成功。

感谢