如何使用C实现MQTT+TLS客户端程序(1)--使用mosquitto搭建MQTT服务器

前言

这是一个使用C语言实现的MQTT/TLS的客户端程序,主要应用在各类嵌入式产品。如果想使用在Android设备上,读者可以参考Paho mqtt。

简单介绍MQTT

MQTT遥测传输(MQ Telemetry Transport,MQTT)是一个轻量级的基于代理的发布/订阅式消息传输协议,它的设计目标是开放、简单、轻量和易于实现。这些特征使它适用于各种受限环境,比如,但不限于:
网络代价昂贵,低带宽或不可靠。
在嵌入设备中运行,处理器和内存资源有限。
该协议的特性包括:
使用发布/订阅消息模式,提供一对多的消息分发,解除应用程序耦合。
消息传输对有效载荷内容不可知。
使用TCP/IP提供基础网络连接。
有3个消息发布服务质量级别:

o“至多一次”,消息发布完全依赖于底层TCP/IP网络。消息有可能丢失或重复。这一级别可应用于如下情景,如环境传感器数据,丢失一次读记录无所谓,因为很快下一次读记录就会产生。
o“至少一次”,确保消息到达,但消息重复有可能发生。
o“只有一次”,确保消息到达且只到达一次。这一级别可用于如计费系统等场景,在计费系统中,消息丢失或重复可能会导致生成错误的费用。
轻量传输,开销很小(固定头部的长度只有2字节),协议交换最小化,以降低网络流量。
提供一种机制,当客户端异常中断时,利用 Last Will 和 Testament 特性来通知有关各方。

该协议规范主要分为3个主要部分:
对所有类型的数据包都通用的消息格式
每种特定数据包的具体细节
数据包如何在服务器和客户端之间传输
*上面的介绍,都很常见,不想深究的话,只需要了解,MQTT可以根据不同的主题,去订阅和发布消息。

简单介绍TLS

这里我推荐一个个网站,我个人认为介绍TLS比较通俗易懂:
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

编程角度去简单理解TLS:

Created with Raphaël 2.1.2初始化TLShandshake成功加密通讯yesno

TLS是在TCP/IP协议中位于应用层和TCP层中间, 例如:

MQTT / HTTP
———
TLS
———
TCP
———
IP
———
数据链路层
———
物理层

搭建MQTT服务器

在实现MQTT客户端之前,我们需要有一个服务器去验证我们的客户端,所以我们先搭建一个MQTT服务器。
我的环境是在ubuntu kylin 64位机器上,我使用的是mosquitto来搭建MQTT服务器。

sudo apt-get install mosquitto

对于Ubuntu系统来说,直接运行该命令就可以安装了,可能其他系统不行,那就需要百度mosquitto源码来安装,过程也很简单网上很多教程。
安装成功后,接下来我们需要配置mosquitto.conf文件,这是mosquitto的启动时需要加载的文件。

cd /etc/mosquitto
sudo vi mosquitto.conf

1.配置用户名密码

这里需要配置三个字段

**allow_anonymous允许匿名

password_file密码文件

acl_file访问控制列表**

生成用户名密码

mosquitto_passwd -c /etc/mosquitto/passwd pub_client

-c :是新打开文件
之后键入密码

mosquitto_passwd  /etc/mosquitto/passwd sub_client

之后键入密码

生成acl_file文件

sudo vi /etc/mosquitto/acl
输入内容
user pub_client
topic write mtopic/#

user sub_client
topic read mtopic/#            

这个文件是添加MQTT Topic和用户的关系

2.使用openssl 生成服务器证书和客户端证书

我们的客户端采用TLS双向验证,如有需要可以进行相应的修改变成单向验证。

安装openssl

sudo apt-get install openssl

创建CA证书

1.在/home/ptonlix/work”目录下创建openssl目录:

mkdir -p /home/ptonlix/work/openssl

2.将原openssl目录下的ssl/misc/CA.sh拷贝到自己创建的测试目录下:

cp /usr/lib/ssl/misc/CA.sh /home/ptonlix/work/openssl

3.创建主证书:

./CA.sh -newca

按照提示完成需要填写的信息,若生成成功会在当前目录下的demoCA目录下生成证书文件,demoCA/private/cakey.pem为ca证书私钥,demoCA/cacert.pem为ca根证书。

生成服务器证书

1.生成服务器私钥:

openssl genrsa -des3 -out server.key 1024

2.生成csr文件:

openssl req -new -key server.key -out server.csr

3.签名并生成证书:

openssl ca -in server.csr -out server.crt

生成客户端证书

1.生成客户端私钥:

openssl genrsa -des3 -out client.key 1024

2生成csr文件:

openssl req -new -key client.key -out client.csr

3签名并生成证书:

openssl ca -in client.csr -out client.crt

完成mosquitto.conf文件

现在已经生成了上述几个文件了,现在根据上述文件的路径来配置相应的配置文件的字段,下面贴上我的例子,仅供参考:

这里写图片描述

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl
#log_dest file /var/log/mosquitto/mosquitto.log
cafile /home/ptonlix/work/ca_certificates/cacert.pem
certfile /home/ptonlix/work/certs/server.crt
keyfile /home/ptonlix/work/certs/server.key
require_certificate true
port 8883
#include_dir /etc/mosquitto/conf.d

如果需要上述字段的详细解释,大家可以百度,可以参考mosquitto自带的例子,路径如下:

/usr/share/doc/mosquitto/examples/mosquitto.conf

运行mosquitto服务器

mosquitto -c mosquitto.conf

这里写图片描述
输入你生成CA证书时的密码,即可运行mqtt服务器,带TLS的!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章