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

作者:ptonlix
来源:CSDN
原文:https://blog.csdn.net/ptonlix/article/details/79866925

本人是转载的。

前言

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

简单介绍MQTT

MQTT遥测传输(MQ Telemetry Transport,MQTT)是一个轻量级的基于代理的发布/订阅式消息传输协议,它的设计目标是开放、简单、轻量和易于实现。这些特征使它适用于各种受限环境,比如,但不限于:
网络代价昂贵,低带宽或不可靠。
在嵌入设备中运行,处理器和内存资源有限。
该协议的特性包括:
使用发布/订阅消息模式,提供一对多的消息分发,解除应用程序耦合。
消息传输对有效载荷内容不可知。
使用TCP/IP提供基础网络连接。
有3个消息发布服务质量级别:
“至多一次”,消息发布完全依赖于底层TCP/IP网络。消息有可能丢失或重复。这一级别可应用于如下情景,如环境传感器数据,丢失一次读记录无所谓,因为很快下一次读记录就会产生。
“至少一次”,确保消息到达,但消息重复有可能发生。
“只有一次”,确保消息到达且只到达一次。这一级别可用于如计费系统等场景,在计费系统中,消息丢失或重复可能会导致生成错误的费用。
轻量传输,开销很小(固定头部的长度只有2字节),协议交换最小化,以降低网络流量。
提供一种机制,当客户端异常中断时,利用 Last Will 和 Testament 特性来通知有关各方。

该协议规范主要分为3个主要部分:

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

简单介绍TLS

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

编程角度去简单理解TLS:

image.png

LS是在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的!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容