MQTT_Project

设计目的

终端采用开放物联网MQTT-tls协议,实现安全认证和传输、订阅和发布。

  • 实现设备以MQTT-tls协议和MQTT代理服务器broker通讯
  • 测试软件以MQTT-tls协议和MQTT代理服务器broker通讯
  • 设备和测试软件通过发布订阅topic和自定的通讯协议互相通讯

    设计思路

  • PC端使用Paho C Client Library库 + OpenSSL库 编译,使用对应接口函数完成服务端测试软件设计。
  • 底层嵌入式单片机端使用WolfSSL库 + WolfMQTT库实现。或考虑Paho的Embedded库+单独的WolfSSL库?

设计流程

PC端设计

  • PC端需要安装Paho MQTT C client library库,由于SSL不包含在库里,所以需要单独编译OpenSSL并添加进工程。注意在https://www.openssl.org/source/官方网站下载1.0.2o.tar.gz文件,否则ms/中没有do_nasm.bat文件。
  • 下载OpenSSL源码,Perl,NASM,运行时提示dmake未安装,ppm install dmake安装中。
    打开VS2013 X64本机工具命令提示
    运行D:\Microsoft Visual Studio 12.0\VC\bin\amd64\vcvars64.bat
    切到openssl目录下
    运行perl Configure VC-WIN64A
    运行ms\do_nasm
    运行ms\do_win64a
    运行nmake -f ms\nt.mak
    执行、测试:nmake -f ms\nt.mak test
    检查上一步编译是否成功,如果成功则最后显示“passed all tests”字样

    1
    nmake  -f  ms\nt.mak install

    成功则会在打印的输出信息里显示了目录路径里生成bin、include、lib、ssl四个文件夹
    参考链接https://geekori.com/details.php?que_id=17199

  • 直接将生成的 libeay32.lib和ssleay32.lib以及WS2_32.lib复制到工程目录下,右键paho-mqtt3as项目->生成.
    提示unresolved external symbol SSL_xxxx
    怀疑是用了64位openssl库导致,回到2重新编译perl Configure VC-WIN32A 提示与机器不符
    直接openssl官网下载编译好的安装包,找到lib文件夹下对应文件-复制粘贴
  • 期间在vs2013的link中发现OpenSSLDir的引用,把系统环境变量增加变量OpenSSLDir,变量值是安装目录
  • 重启vs2013,重新编译paho-mqtt3as和paho-mqtt3cs项目,生成lib成功。

SSL/TLS证书生成

用于生成自用的自签名证书和密钥库以及信任库。

  • 生成

    1
    keytool -genkey -alias mqtt -keyalg RSA -validity 365 -keystore mqtt.keystore

    别名MQTT的证书、RSA算法、有效期365天,存储为mqtt.keystore格式 库密码mashuang 钥匙密码991110

  • 查看

    1
    keytool -list -v -keystore mqtt.keystore -keypass mashuang
  • 导出

    1
    keytool -export -alias mqtt -keystore mqtt.keystore -file mqtt.crt -storepass mashuang

    存储在当前目录下.crt和.cer格式证书

  • 查看证书
    1
    keytool -printcert -file mqtt.crt

测试MQTT-TLS功能

查看证书信息

在broker目录下F:\MQTT\apache-apollo-1.7.1\bin\broker\etc输入命令

1
keytool -list -v -keystore keystore -keypass password

返回显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: broker
创建日期: 2018-4-8
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=broker
发布者: CN=broker
序列号: 4b2d2d30
有效期为 Sun Apr 08 09:11:34 GMT+08:00 2018 至 Wed Apr 05 09:11:34 GMT+08:00 2028
证书指纹:
> MD5:
> SHA1:
> SHA256:
签名算法名称: SHA256withRSA
主体公共密钥算法: 4096 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000:
0010:
]
]



*******************************************
*******************************************



Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

表明这个keystore文件有一个alias别名为broker的证书,有效期到2028年4月5日。采用RSA加密方法加密。
使用提示的命令直接生成jks格式的文件

1
keytool -importkeystore -srckeystore keystore -destkeystore keystore.jks -deststoretype jks

要生成密钥库,请在命令行提示符处输入以下命令:

1
keytool -genkey -alias broker -keyalg RSA -keypass password -storepass password -keystore keystore.jks

其中,password 是访问密钥库所需的密码。

要导出服务器证书,请在命令行提示符处输入以下命令:

1
keytool -export -alias broker -file server.cer -storepass password -keystore keystore.jks

其中,password 是您创建密钥库时指定的密码。

要创建信任库,请在命令行提示符处输入以下命令:

1
keytool -import -alias broker -v -trustcacerts -file server.cer -keypass password -storepass password -keystore cacerts.jks

其中,password 是您创建密钥库时指定的密码。
据此,共生成了3个文件:

  • keystore->keystore.jks
  • keystore.jks->server.cer
  • server.cer->cacerts.jks
建立TLS连接

使用MQTT-spy软件,该软件提供java编译版本,可以在安装java的机器上使用。
Server
连接成功后分别发布和订阅同一主题,测试成功。
Server
在apollo的127.0.0.1:61613的web界面查看已连接的客户端。
Server

结束

至此,整个MQTT-TLS的测试流程介绍完毕,下面该利用编译好的各类库编写代码实现应用层的功能了。