第11课:如何配置

第11课:如何配置 MQTT 的单双向 SSL 的认证

MQTT(Message Queue Telemetry Transport,遥测传输协议)主要提供订阅/发布模式,更为简约、轻量,易于使用,针对受限环境(带宽低、网络延迟高、网络通信不稳定),属于物联网(Internet of Thing)的一个传输协议,其设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:

  • 特别适合于网络代价昂贵,带宽低、不可靠的环境。
  • 能在处理器和内存资源有限的嵌入式设备中运行。
  • 使用发布/订阅消息模式,提供一对多的消息发布,从而解除应用程序耦合。
  • 使用 TCP/IP 提供网络连接。
  • 提供 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

对消息中间件,估计大家不得不关心的就是消息的可靠性,也就是消息的发布服务质量,可喜的是,MQTT 支持三种消息发布服务质量(QoS):

  • “至多一次”(QoS==0),消息发布完全依赖底层 TCP/IP 网络,会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
  • “至少一次”(QoS==1),确保消息到达,但消息重复可能会发生。
  • “只有一次”(QoS==2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。

因为本章的重点是如何配置 MQTT 的单双向 SSL 认证,如果你对 MQTT 协议本身感兴趣的话,请参考我在 GitChat 上另外一个热门的 Chat 专题《网络抓包学 MQTT 物联网协议》,里面有详细的介绍。

前期准备工作

目前有很多的 MQTT 消息中间件服务器,如下都是 MQTT 协议的服务器端的实现。

  • IBM Websphere
  • MQ Telemetry IBM
  • MessageSight
  • Mosquitto Eclipse Paho
  • emqttd Xively
  • m2m.io
  • webMethods
  • Nirvana Messaging
  • RabbitMQ
  • Apache ActiveMQ
  • Apache Apollo
  • Moquette
  • HiveMQ
  • Mosca Litmus Automation Loop
  • JoramMQ
  • ThingMQ
  • VerneMQ

因为 Mosquitto 是当前用户最多的一款产品,所以本文将选择以 Mosquitto 为 MQTT 的服务器来和大家分享如何配置 MQTT 的单双向 SSL 的认证,可以到此网站地址下载。 其几乎支持市面上所有的操作系统,而且更为神奇的是,其还提供了 JavaScript 版的 Mosquitto 服务器,简直要逆天的节奏,这篇文章就以安装在 Windows 操作系统上的 Mosquitto 为例子,和大家分享一下如何配置 MQTT 的单双向 SSL 的认证。

单向 SSL 认证的配置方式

我们知道,MQTT Mosquitto 支持单向和双向 SSL 认证,首先咱们来看一下认证的配置文件应该如何配置。所谓的单向 SSL 证书,指的是,MQTT 的客户端访问 MQTT 的服务器端的时候,如果用到了 SSL 加密通信,在建立 SSL 加密通信前,客户端需要通过证书来验证服务端是否是可信任的,所以客户端会把服务器端传过来的证书和自身的已经的在某种途径下得到的服务器端 CA 证书或者服务器证书进行比较,如果匹配成功,则继续运行建立可信任的安全的 SSL 连接,在单向 SSL 通信的过程中,服务器端不会要求客户端传输证书,也不会验证客户端是否是可信任的。

我们知道启动 MQTT Mosquitto 的时候,可以通过下面的命令来指定启动的方式。

mosquitto [-c config file] [ -d | --daemon ] [-p port number] [-v]

其中:

  • -c 后面跟的是启动 mosquitto 可以调整的参数,比如是否开启基本认证,端口是什么,SSL 单向和双向的认证配置等等。
  • -d 表示 MQTT mosquitto 将在后台运行。
  • -p 代表当前的 mosquitto 服务实例启动以后,其监听端口号,这个配置的覆盖[-c config file] 指定的配置文件中的端口。
  • -v 代码调试模式(verbose)可以输出更多的信息。

下面来生成我们所需要的 CA 的证书和 MQTT 服务器的证书。

(1)CA 证书的位置,还是使用我在《第04课:使用 XCA 管理和生成 SSL 证书》一文中的 CA,其放在 c:\mqtt\ssl\51TalkDocter_Root_CA.crt

enter image description here

(2) 创建服务器端的私钥

打开 XCA,在 Private Keys 页面新建一个私钥,输入如下信息。

enter image description here

单击“确定”按钮后,成功生成一个服务器的私钥。

enter image description here

选中 mqtt-server- 可以这个私钥,并单击右侧的 “Export(导出)”按钮,选择导出一个私钥。

enter image description here

私钥的导出路径和名称为:C:\mqtt\ssl\mqtt-server-key.pem。

(3)生成服务器端的 SSL 证书请求并交给私有 CA(51TalkDocter Root CA)签署。

需要注意的是,生成的服务器证书的 common name(通用名字)最好和部署 MQTT 服务器的计算机的名字一样,假设安装 Mosquitto 服务器的计算名为:mqtt-ssl-server。

生成证书请求的方法有很多,本文统一用在《第04课:使用 XCA 管理和生成 SSL 证书》课程中的方法一样,在 XCA 中生成 MQTT 服务器的证书请求,需要注意的是,在生成证书请求的时候,其私钥必须选择上面步骤 2 中生成的私钥 mqtt-server-key。其主要填入的参数如下:

enter image description here

另外,在创建证书请求的时候,Source(来源)页面最下面的模板,请选择 [Default]HTTPS_Server

enter image description here

单击 OK 按钮后,证书请求创建成功。

enter image description here

创建成功后,选择 mqtt-ssl-server 证书请求,并点击右键,在弹出的菜单中选择 Sign(签署),签署的时候选择上面的私有 CA:(51TalkDocter Root CA),模板还是选择[Default]HTTPS_Server,具体配置如下图所示意。

enter image description here

之后单击 OK 按钮,私有 CA 成功签署证书请求。

enter image description here

(4) 导出服务器证书

导出证书的方式很简单,在证书页面,选择已经被签署过的 mqtt-ssl-server 证书,并单击右边的“导出(Export)”按钮。

enter image description here

在弹出的“导出”对话框中输入导出证书的路径和格式。

enter image description here

到此,MQTT 单向认证配置的证书都准备完毕,如下图。

enter image description here

则其单向的 SSL 的 mosquitto 服务器端的配置文件(Configuration)的配置方式如下,假设下面的配置存储在一个名为 D:\mosquitto\singlewayssl.conf 的文本文件中。

cafile C:\mqtt\ssl\51TalkDocter_Root_CA.crt  
certfile C:\mqtt\ssl\mqtt-ssl-server.crt
keyfile C:\mqtt\ssl\mqtt-server-key.pem
tls_version tlsv1.2   

则可以通过下面的方式启动 mosquitto 服务器端的单向的 SSL 服务。

mosquitto -c c:\mqtt\ssl\singlewayssl.conf -p 1884 -v

命令启动后,其输出格式如下:

enter image description here

由此可见,单向 SSL 配置成功。

双向 SSL 认证的配置方式

在上一节中我们可以看到,其实单向的 MQTT 的 SSL 通信的配置和流程和 https web 服务器的配置以及流程类似,需要一个 CA,已经由 CA 签署的服务器 SSL 证书和服务器证书对应的私钥。

在这一节中咱们来看一下双向的 SSL 认证的配置文件应该如何配置? 那么什么是双向的 SSL 认证呢?所谓双向的 SSL 认证,打个通俗的比方就是,在进行 SSL 加密通信前,通信的双方(在咱们的例子中是 mosquitto 服务器端和 MQTT 客户端(消息的发送或者接收端))需要相互验证各自的证书是否合法。比如,是否是一个合法的 CA 颁发的等等。

双向的 SSL 认证的配置方式和单向的配置方式类似,只不过是其配置文件里面多加了两个参数。

cafile C:\mqtt\ssl\51TalkDocter_Root_CA.crt  
certfile C:\mqtt\ssl\mqtt-ssl-server.crt
keyfile C:\mqtt\ssl\mqtt-server-key.pem
tls_version tlsv1.2 
require_certificate true  
use_identity_as_username true  

其中require_certificate的值为“true”的时候,表示客户端必须为 SSL 的双向认证提供一个可信任的 SSL 证书,而且这个 SSL 证书必须有服务器端的 CA 证书签署的。

另外,还有一个参数 use_identity_as_username,如果require_certificate为true,那么可以将use_identity_as_username设置为 true,这样就能使用客户端证书中的 CN 值作为用户名。如果是这样的话,MQTT 的配置文件中的password_file选项也可以不用了。

假设文件这个双向 SSL 配置的文件名称为 D:\mosquitto\twowayssl.conf,启动的命令如下:

 mosquitto -c c:\mqtt\ssl\twowayssl.conf -p 1885 -v

启动后的截图信息如下,MQTT 的 SSL 双向认证配置成功!

enter image description here

总结

本章和大家一起分享了当前流行的物联网协议 MQTT 的基本特性以及 MQTT 协议适用的场景。与此同时,还列举出了当前实现 MQTT 通信协议相关的产品,并以 Mosquitto MQTT 服务为例子,和大家分享了如何让 Mosquitto MQTT 服务器支持单向和双向的 SSL 认证。如果大家有任何的疑问,欢迎在读者圈里面留言。

上一篇
下一篇
目录