ssl/tls的双向认证发布到dev环境认证不通过(C#版本)

(1) 客户端和服务器使用tls/ssl的自签名双向认证,后端的emqx配置如下图:

(2) 客户端代码使用的是C#的MQTTnet组件,主要代码如下图:

(3) 通过情况:
代码还是步骤2中的代码,emqx后端配置改成如下图配置后


后,dev环境的ssl/tls连接能通过

问题一: emqx部署到 ip:140.231.234.55 这台服务器使用步骤1的emqx配置, 本地ide跑代码调试能通过,部署dev环境,dev环境和ip:140.231.234.55 是同一台服务器(目前通过日志观察的dev环境的证书路径都是正确的) 只是在mqtt连接emqx的过程中出现(启动mqtt失败,异常信息为:Authentication failed, see inner exception) 这个错误,一直通过不了这个。

麻烦解答一下啊

没看明白,一台机器有两个环境?你的网络设置是怎么区分的?检查一下dev环境的网络端口情况

这台服务器部署应用服务,又部署emqx服务 也就是说emqx和dev环境部署在同一台服务器,端口都是通的, 现在是在dev环境ssl/tls的双向连接一直连不通

本地ide能连到这台服务器的EMQX上?那你的应用服务器里面的ssl配置你需要看看。

1.应用服务器中emqx的配置如下图:

  1. C#中MQTTnet.Client 加载证书的核心代码如下图:

  1. 客户端代码加载的证书格式是下图的三个:

4.mqttx 通过上面的证书也能连接通过。

问题原因:本地代码调试双向认证(如上图代码和发布的服务器代码一致) 能建立连接,代码发布到服务器,建立连接失败,异常错误为:The decryption operation failed, see inner exception

问题1: 看看我核心代码是不是要开启一些配置我没有开启导致dev环境没有验证失败

问题2: 看看是不是客户端证书的后缀没有和核心代码适配导致dev环境没有验证失败

问题3: 看看emqx控制面板是不是还需要开启什么配置没有开启导致dev环境没有验证失败

根据你的描述,你的emqx外部访问的时候没有问题,本地访问的时候有问题。你的dev连emqx的时候填的是localhost还是外网的ip?

使用的外网ip

问题1:和上传的证书文件的权限有关系吗

问题2: openssl.cnf 中ip和dns要换成 127.0.0.1吗,目前生成的用的是外网ip

先确保权限没问题,Dev环境可以正常访问证书。

先别改成127。你把这dev环境放在另外一套服务器上呢?

上面的我都验证了,也不行

你参照一下这个文档看看

问题1: 上面的连接满足单向认证,客户端证书client.key,client.pem 就不需要,只需一个ca.pem,目前这种情况我们现在也没问题。

问题2: 如果是双向认证,客户端证书client.key,client.pem 就需要,上面的连接中的代码不满足

看这个

上面最终的解决方案就是这个:How to Use MQTT in C# with MQTTnet | EMQ

自签名的哪个双向认证好像只能在windows平台搞,在linux上不行

那没办法了,.net不支持。。。