目录

  • 1 前言
  • 2 概览
  • 3 密钥和证书生成
    • 3.1 创建CA密钥对(根证私钥)
    • 3.2 创建CA证书请求(根证书请求文件)
    • 3.3 创建Mosquitto Broker相关密钥
    • 3.4 创建CA证书请求书
    • 3.5 验证并签署证书申请
  • 4 MQTT.fx本地安全通信实验
  • 5 直接通过脚本产生私钥和证书
  • 6 总结
  • 7 链接

1 前言

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

2 概览

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

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

  • Mosquitto version 1.5.4
  • 密钥和证书生成: OpenSSL 1.1.0 (2017年11月2日)
  • MQTT客户端: MQTT.fx 1.7.1

如何安装软件和工具请参考基于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证书。

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

  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

使用TLS和Mosquitto Broker实现安全通信之密钥和证书生成相关推荐

  1. 部署 mosquitto broker 服务器过程笔记

    前言 本篇记录在 ubuntu18-x64 虚拟机上通过安装的方式部署 mosquitto broker 全过程,做备忘用.同时供有需求的小伙伴参考. 环境说明: (1). 虚拟机 VMware-15 ...

  2. TLS/HTTPS 证书生成与验证

    https://www.cnblogs.com/kyrios/p/tls-and-certificates.html 最近在研究基于ssl的传输加密,涉及到了key和证书相关的话题,走了不少弯路,现在 ...

  3. TLS原理及证书生成

    1.生成RSA密钥 > openssl genrsa -des3 -out mykey.pem 2048 或者: > openssl genrsa -out mykey.pem 2048 ...

  4. SSL/TLS加密证书生成(一)

    client为Nxlog或者rsyslog的server和client证书生成 生成证书应该是在server端生成的,server和client的证书都是在server端生成,生成的命令如下: 1.生 ...

  5. c++ mqtt客户端_MQTT安全性设计详解

    1 前言 MQTT(MQ Telemetry Transport, MQ 遥测传输).它是一种发布/订阅.极其简单和轻量级的消息传递协议,旨在用于受限设备和低带宽,高延迟或不可靠的网络.设计原则是使网 ...

  6. CentOS7.3下二进制安装Kubernetes1.9集群 开启TLS

    Kubernetes的相关原理性的东西之前有叙述过,网上也有很多,这里主要是写的自己在使用二进制的方式搭建Kubernetes1.9的一些方法,对学习的东西做一个自我的总结. Kubernetes有许 ...

  7. 【云驻共创】华为云IoTDA服务下的设备管理流程实操

    文章目录 一.当今社会发展趋势 1.社会背景 2.什么是物联网(IoT) 3.什么是华为云(IoTDA) 二.为什么需要设备发放 1.传统模式-存在问题 2.设备发放模式-问题改进 三.设备接入服务的 ...

  8. ISTIO文档解读学习(三)

    Istio安全 整体概述 将单一应用程序分解为微服务可提供各种好处,包括更好的灵活性.可伸缩性以及服务复用的能力.但是,微服务也有特殊的安全需求:1)为了抵御中间人攻击,需要流量加密.2)为了提供灵活 ...

  9. 初试Pulsar---私有云离线安装部署Pulsar

    前一段时间了解了Pulsar这个开源项目,感觉是一个替换kafka的好东西!它具体的特性各位自行搜索吧! 为了自己项目尝试使用Pulsar,我决定进行部署实验.但是,目前网上看到的都是在公网上公有云部 ...

最新文章

  1. uva673 Parentheses Balance
  2. daterangepicker 使用方法总结
  3. Java 生产者和消费者问题
  4. 大型分布式存储方案MinIO介绍,看完你就懂了!
  5. iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发
  6. CRM系统主要业务流程思维导图
  7. Linux开机启动的步骤
  8. 综合云平台 - 架构 - 01
  9. 性能优化-简谈JVM
  10. 计算机组成原理 实验六 存储器容量扩展
  11. 研究生如何参加以及准备学术会议详细攻略-9000字
  12. 计算机网络:20 网络应用需求
  13. 有1234四个数字java_用java程序编写,1234这四个数进行排列组合,
  14. 首席新媒体黎想告诉你,不花钱做互联网推广!这些方式了解一下
  15. 事件研究法与其应用(2)---Excel实操步骤
  16. pacemaker+corosync+pg13
  17. uniapp 基础知识学习
  18. django-q快速上手定时任务
  19. stm32mp1开发板入门pangu
  20. 编程天才获冠军!14岁被清华预录取,战胜麻省理工学霸......

热门文章

  1. 运用hibernate接口实现增删改查
  2. Thomson.Reuters.EndNote.X6.v16.0.0.6348.Cracked-EAT
  3. 五格数理用字(笔画+五行)
  4. pwn - 格式化字符串攻击
  5. 职言 | 校招面试有感,一个面试官的几点建议
  6. 做大创项目的一点点感悟
  7. 用八叉树优化RayCasting
  8. LV2股票逐笔成交接口量化
  9. python用input输入字典_输入字典python_python输入字典_python用input输入字典 - 云+社区 - 腾讯云...
  10. Pyhotn3,爬取B站up主的信息!