(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的配置如下图:
- C#中MQTTnet.Client 加载证书的核心代码如下图:
- 客户端代码加载的证书格式是下图的三个:
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上不行