一只海星的主页

ARM海思MQTT开发系列(三)MQTT服务器加密TLS支持与测试

背景

上一节我们调通MQTT基本功能,真正要用了,总不能裸奔吧
所以,搞tls支持~

加密介绍

关于加密解密SSL/TLS,对称非对称、公钥私钥、签名验签你想知道的加密全在这里

Configure SSL/TLS support for Mosquitto

这里参考官方文档就好了

生成ca证书和密钥:

日期自选,单位天
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.crt

服务器

  • 生成服务器私钥:
    openssl genrsa -des3 -out server.key 2048
  • 去掉密码
    openssl genrsa -out server.key 2048
  • 生成CA需要的证书前面请求
    openssl req -out server.csr -key server.key -new

注意

当提示您输入CN(通用名称)时,请输入您的服务器(或代理)主机名或域名。
如果你服务器用了域名,就填服务器的域名,ca生成和client生成CN请直接回车
– CA认证或自签名
公司给钱去CA认证的话,提交server.csr过去就好了
或者
用第一步自己生成的CA,自签名
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650

客户端

和服务器同样的步骤,生成密码->CA认证/自签名
openssl genrsa -des3 -out client.key 2048
openssl genrsa -out client.key 2048
openssl req -out client.csr -key client.key -new
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days

修改mosquitto.conf参数文件

修改/ect/mosquitto/mosquitto.conf配置文件

port 8883
cafile /root/mosquitto_tls/ca.crt
certfile /root/mosquitto_tls/server.crt
keyfile /root/mosquitto_tls/server.key

启动服务器tls支持

mosquitto -c /ect/mosquitto/mosquitto.conf

测试

mosquitto_sub -h <你的域名> -p 8883 -t "mqtt_tls" --cafile /root/mosquitto_tls/ca.crt --cert /root/mosquitto_tls/client.crt --key /root/mosquitto_tls/client.key 
mosquitto_pub -h <你的域名> -p 8883 -t "mqtt_tls" --cafile /root/mosquitto_tls/ca.crt --cert /root/mosquitto_tls/client.crt --key /root/mosquitto_tls/client.key -m "hello"

错误参考

Error: A TLS error occurred.

我就是在生成密钥的时候所有地方的CN都填了我的域名。

下面总结几种常见的错误:
使用自签名证书时,CA证书 和 server证书 的 Comon Name 使用了相同的内容;这样会导致 OpenSSL 校验证书时失败,将 CA证书 和 server证书的 Comon Name 改成不同的内容即可;

使用自签名证书时,server证书 的 Comon Name 与域名不相符,默认情况下客户端会连接错误,这时在连接时加入 –insecure 参数即可;

使用自签名证书时,如果CA是单个文件,将 –cafile 参数错写成 –capath;服务端开启双向认证 require_certificate true , 连接时没有传入客户端的证书和密钥;

服务端与客户端的 TLS 版本不一致,服务端配置参数为 tls_version ,客户端配置参数为 –tls-version;

参考

mosquitto-tls man page
mosquitto.conf man page
mosquitto 开启 TLS 问题总结

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注