使用TLS和Mosquitto Broker实现安全通信之**和证书生成

时间:2024-03-14 14:13:25

1 前言

MQTT是一种轻量级且广泛使用的互联网协议。当今大多数物联网应用程序可能都使用Mosquitto作为服务器(或MQTT语言中的“代理”)。默认情况下,Mosquitto使用的协议没有加密。在“ 安全性和TLS(传输层安全性)简介 ”中,我介绍了加密的基础知识和需求。本文介绍如何使Mosquitto和客户端使用TLS协议。

使用TLS和Mosquitto Broker实现安全通信之**和证书生成

2 概览

本文将介绍如何使用TLS协议配置Mosquitto代理和MQTT客户端的基本原则和设置。TLS是SSL(安全套接字层)的后继产品,通常用作TLS / SSL的组合。要在代理和客户端之间使用TLS,必须生成和部署一组**和证书,以及代理和客户端上的配置设置。

在本文中,我使用以下一组软件和工具:

如何安装软件和工具请参考基于Paho Android Service 实现MQTT协议通信Android客户端

生成**和证书步骤:

  1. 创建CA**对
  2. 创建CA证书并使用步骤1中的私钥对其进行签名
  3. 创建代理**对
  4. 使用步骤3中的**(公钥?私钥?)创建CA证书签名请求
  5. 使用步骤2中的CA证书对步骤4中的请求进行签名

在代理服务器上,需要如下要求:

  • 来自CA(证书颁发机构)的证书
  • 服务器证书,由CA及其私钥签名
  • 用于解密传入消息的服务器私钥

3 **和证书生成

3.1 创建CA**对(根证私钥)

# genrsa:生成RSA私钥
# -des , -des3, -aes128, -aes192, -aes256:指定加密算法DES3密码生成**
# -out:指定输出文件名(.key)
# 2048:私钥的位数
# -passout pass:123456 : 设置私钥文件密码
$ openssl genrsa -des3 -out m2mqtt_ca.key 2048

输入的密码用于保护私钥。

# 根据RAS私钥生成对应公钥
# 如果设置了私钥文件密码,则需要输入密码
$ openssl rsa -in m2mqtt_ca.key -pubout -out m2mqtt_ca_pub.key

将传统格式的私钥转换成 PKCS#8 格式的(JAVA需要使用的私钥需要经过PKCS#8编码):

# -passin pass:123456 : 私钥文件密码
# -passout pass:123456:设置pk8格式私钥文件密码
# -v2 :指定des,des3和rc2其中之一加密算法,默认基于口令的加密算法加密
# -inform: 输入的证书请求格式
$ openssl pkcs8 -topk8 -inform PEM -in m2mqtt_ca.key -outform PEM -nocrypt -out m2mqtt_ca.pk8

3.2 创建CA证书请求(根证书请求文件)

接下来,使用2.1中的**为CA创建证书:

# req:证书请求和证书实用程序。
# -new:生成新证书,它会提示用户输入几个输入字段。
# -x509:创建自签名证书。
# -days:指定证书有效的天数。
# -key:具有用于签名的私钥的**文件
# -out:指定证书的文件名(.crt)

$ openssl req -new -x509 -days 3650 -key m2mqtt_ca.key -out m2mqtt_ca.crt

在Windows上我可以使用证书查看器来检查生成的m2mqtt_ca.crt证书。

使用TLS和Mosquitto Broker实现安全通信之**和证书生成

3.3 创建Mosquitto Broker相关**

接下来,同样地为服务器创建一个私钥(m2mqtt_srv.key):

$ openssl genrsa -out m2mqtt_srv.key 2048

⚠️没有加-des3选项,加了必须为**文件设置密码,在mosquitto中使用时不是方便。

3.4 创建CA证书请求书

需要对该**进行认证,因此我们为其创建证书请求,并且证书需要由CA签署:

$ openssl req -new -out m2mqtt_srv.csr -key m2mqtt_srv.key

3.5 验证并签署证书申请

最后一步是通过CA签署服务器请求以获取代理证书:

# x509:证书显示和签名实用命令
# -req:证书请求是输入
# -in:证书的输入文件
# -CA:指定要签名的文件
# -CAkey:用于对证书进行签名的CA私钥
# -Cacreateserial:如果***文件不存在,则会创建该***文件
# -out:输出文件名
# -days:证书有效期多长
$ openssl x509 -req -in m2mqtt_srv.csr -CA m2mqtt_ca.crt -CAkey m2mqtt_ca.key -CAcreateserial -out m2mqtt_srv.crt -days 3650

综上,创建如下文件:

m2mqtt_ca.crt  : CA 证书
m2mqtt_ca.key  : CA私钥(可基于产生公钥)
m2mqtt_ca.srl  : CA***文件
m2mqtt_srv.crt : 服务器证书
m2mqtt_srv.csr : 证书签名请求,可不再需要
m2mqtt_srv.key : 服务器私钥(可基于产生公钥)

最后配置mosquitto配置文件内容mosquitto.conf:

...
# m2mqtt_ca.crt提供给客户端
cafile xxx/xxx/m2mqtt_ca.crt
certfile xxx/xxx/m2mqtt_srv.crt
keyfile xxx/xxx/m2mqtt_srv.key
...

重新启动mosquitto:

$ mosquitto -c mosquitto.conf -v

4 MQTT.fx本地安全通信实验

  1. 通过生成私钥和证书,配置好mosquitto.conf
  2. 启动mosquitto
  3. 安装配置好MQTT.fx

使用TLS和Mosquitto Broker实现安全通信之**和证书生成

  1. 保存,连接,通过MQTT.fx自己订阅和发布即可测试安全通信了。

5 直接通过脚本产生私钥和证书

$ wget https://github.com/owntracks/tools/raw/master/TLS/generate-CA.sh
$ bash ./generate-CA.sh
# 产生六个文件 :
Think.localdomain.crt       # certfile 
Think.localdomain.key       # keyfile
Think.localdomain.csr
ca.key
ca.crt                      # cafile 
ca.srl

6 总结

建立与Mosquitto代理的安全TLS连接需要**和证书文件。使用正确的设置创建所有这些文件并不是最容易的事情,但是可以通过安全的方式与MQTT代理进行通信。

7 链接

  1. 原文: https://mcuoneclipse.com/2017/04/14/enable-secure-communication-with-tls-and-the-mosquitto-broker/
  2. OpenSSL中文手册之命令行详解 : https://blog.csdn.net/liao20081228/article/details/77159039
  3. https://www.programcreek.com/java-api-examples/?code=thingsboard/thingsboard/thingsboard-master/tools/src/main/java/org/thingsboard/client/tools/MqttSslClient.java#
  4. https://www.programcreek.com/java-api-examples/?code=osswangxining/iotgateway/iotgateway-master/src/main/java/org/iotp/gateway/extensions/mqtt/client/MqttBrokerMonitor.java#
  5. https://www.programcreek.com/java-api-examples/?class=org.eclipse.paho.client.mqttv3.MqttConnectOptions&method=setSocketFactory
  6. https://www.eclipse.org/paho/files/javadoc/org/eclipse/paho/client/mqttv3/MqttConnectOptions.html