前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >14-STM32+MN316(NB-IOT)基本控制篇(自建MQTT服务器)-移植mbedtls实现STM32+MN316以SSL单向认证方式连接MQTT服务器(不验证服务器证书)

14-STM32+MN316(NB-IOT)基本控制篇(自建MQTT服务器)-移植mbedtls实现STM32+MN316以SSL单向认证方式连接MQTT服务器(不验证服务器证书)

作者头像
杨奉武
发布2022-04-29 16:09:39
1.8K0
发布2022-04-29 16:09:39
举报
文章被收录于专栏:知识分享

说明

在网络通信中,如果不加上SSL,那么信息就以明文的方式暴露在网络通信中

这节移植上mbedtls库,让设备以SSL方式连接MQTT服务器.

首先简单说明一下SSL, 实际上呢整个的就是TCP和服务器通信,

只不过TCP连接上服务器之后先和服务器协商好加密方式和加密密码,

当然协商什么的mbedtls库自己就完成了, 然后咱调用其接口发送和接收数据就可以了;

其实通信是下面的样子:

发送的数据 ----> 经过mbedtls库加密 ---> 通过模组使用TCP发送给服务器

服务器下发的TCP数据 --->  经过mbedtls库解密 ---> 获得真实数据

测试

1.打开本节代码

2.默认连接本人的服务器测试(服务器端口为8883)

4.观察日志打印口(日志都是加密的数据,就大体说一下)

程序说明

1,为便于使用mbedtls的SSL功能,我封装了下

2.先说几个自己需要实现的函数,mbedtls底层会调用这些函数

随机数函数和返回时间戳函数(不验证证书时间的话用不到)

网络接收处理函数(mbedtls底层会自动调用这个函数)

SSL的底层获取数据的方式是指明需要多少个数据,然后咱再返回多少个数据.

所以我把数据接收以后存储到了环形队列, 然后SSL要多少我就给多少.

网络发送函数(mbedtls底层会自动调用这个函数)

3.使用SSL发送数据函数和从SSL里面取数据函数

其实这两个函数咱可以直接用,不过我为了方便调用就套了一层函数;

完成了ssl协商以后, 咱发送的数据需要调用mbedtls提供的函数, 

内部会把咱的数据加密以后再通过TCP发送出去; 

同理TCP接收的数据咱也需要使用mbedtls提供的函数里面获取数据;

4. SSL初始化

最后两个底下画红线的函数就是咱上面写的tcp发送数据函数和tcp接收数据函数

5.等待SSL握手完成函数

这个函数在咱TCP连接成功以后需要轮训调用, 这个函数内部自动实现的SSL, 只要完成了SSL, 便会返回0

现在看具体使用的

提示: MQTT部分就不多说了, 只说明一下SSL部分,

和前面的不带SSL的程序相比,发送和接收数据中间是使用的mbedtls内部的函数.

0,控制模块连接TCP服务器

1.连接TCP以后,初始化下SSL, 然后等待SSL协商成功

2.成功以后发送连接MQTT协议

3.从SSL里面获取数据

4.当然那个MQTT底层发送数据的地方也改为使用SSL发送

结语

其实实际上还是TCP通信,只不过中间经过了mbedtls函数;

明文数据只是经过了加密;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
    • 在网络通信中,如果不加上SSL,那么信息就以明文的方式暴露在网络通信中
      • 这节移植上mbedtls库,让设备以SSL方式连接MQTT服务器.
        • 首先简单说明一下SSL, 实际上呢整个的就是TCP和服务器通信,
          • 只不过TCP连接上服务器之后先和服务器协商好加密方式和加密密码,
            • 当然协商什么的mbedtls库自己就完成了, 然后咱调用其接口发送和接收数据就可以了;
              • 其实通信是下面的样子:
              • 发送的数据 ----> 经过mbedtls库加密 ---> 通过模组使用TCP发送给服务器
              • 服务器下发的TCP数据 --->  经过mbedtls库解密 ---> 获得真实数据
          • 测试
            • 1.打开本节代码
              • 2.默认连接本人的服务器测试(服务器端口为8883)
                • 4.观察日志打印口(日志都是加密的数据,就大体说一下)
                • 程序说明
                  • 1,为便于使用mbedtls的SSL功能,我封装了下
                    • 2.先说几个自己需要实现的函数,mbedtls底层会调用这些函数
                      • 随机数函数和返回时间戳函数(不验证证书时间的话用不到)
                      • 网络接收处理函数(mbedtls底层会自动调用这个函数)
                      • 网络发送函数(mbedtls底层会自动调用这个函数)
                    • 3.使用SSL发送数据函数和从SSL里面取数据函数
                      • 其实这两个函数咱可以直接用,不过我为了方便调用就套了一层函数;
                      • 完成了ssl协商以后, 咱发送的数据需要调用mbedtls提供的函数, 
                      • 内部会把咱的数据加密以后再通过TCP发送出去; 
                      • 同理TCP接收的数据咱也需要使用mbedtls提供的函数里面获取数据;
                    • 4. SSL初始化
                      • 最后两个底下画红线的函数就是咱上面写的tcp发送数据函数和tcp接收数据函数
                    • 5.等待SSL握手完成函数
                      • 这个函数在咱TCP连接成功以后需要轮训调用, 这个函数内部自动实现的SSL, 只要完成了SSL, 便会返回0
                  • 现在看具体使用的
                    • 提示: MQTT部分就不多说了, 只说明一下SSL部分,
                      • 和前面的不带SSL的程序相比,发送和接收数据中间是使用的mbedtls内部的函数.
                        • 0,控制模块连接TCP服务器
                          • 1.连接TCP以后,初始化下SSL, 然后等待SSL协商成功
                            • 2.成功以后发送连接MQTT协议
                              • 3.从SSL里面获取数据
                                • 4.当然那个MQTT底层发送数据的地方也改为使用SSL发送
                                • 结语
                                  • 其实实际上还是TCP通信,只不过中间经过了mbedtls函数;
                                    • 明文数据只是经过了加密;
                                    相关产品与服务
                                    SSL 证书
                                    腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档