用SSL保护EMQ连接(pem格式证书)

1 篇文章 0 订阅

SSL是一种加密协议,可通过计算机网络提供通信安全性。 不出所料,它也可以用于MQTT消息交换。
SSL具有许多安全优势,例如:
强认证性:创建一个SSL连接时,通信方可以检查其伙伴的身份并确定其是否可信任。 通常,在此阶段,可以使用X.509证书来确保证书持有者的身份。
隐私性:协议启动时,通信双方会生成唯一的会话密钥。 该会话密钥对通信过程进行了加密。 任何未授权用户都无法查看交换的信息。
完整性:不可能篡改SSL上的通信。
EMQ和EMQX支持SSL。 在本文中,将展示如何在EMQ上启用SSL。

SSL协议

SSL协议是SSL记录协议和SSL握手协议的组合。记录协议与任何其他数据携带协议非常相似,一条记录消息包括内容类型,版本,长度和消息有效负载,其中包含加密数据。 有时,一条记录消息还具有消息身份验证代码和/或填充。SSL连接启动时使用握手协议,它控制通信方式。 握手本身也承载在SSL记录(内容类型22)中。
一个典型的SSL握手协议:
在这里插入图片描述
握手的目的是创建通信通道,识别彼此的身份并协商密码规范。 握手以“ hello”消息开始,以“ finished”消息结束。

准备工作:在EMQ中使用SSL

通常,我们使用证书进行SSL通信。 因此在启动SSL之前,我们将需要一些证书。 它们是:CA证书,EMQ证书。如果我们要启用双向身份验证,我们还将需要客户端证书。通常在demo或实验室环境中,我们会亲自生成证书并签名,而不是从受信任的第三方获得证书。接下来,我们将使用OpenSSL附带的工具来生成所需的证书。
首先,我们需要一个用于自签名CA根证书的密钥key,以下命令会生成密钥长度为2048的RSA私钥并将其保存在文件“ MyRootCA.key”中:

openssl genrsa -out MyRootCA.key 2048

下一步是使用我们刚得到的密钥生成根证书:

openssl req -x509 -new -nodes -key MyRootCA.key -sha256 -days 3650 -out MyRootCA.pem

根证书是信任链的起点,我们假定:如果从证书颁发者到链上根证书的所有节点都是可信的,则该链上的证书是可信的。拥有自签名的CA根证书后,我们可以使用它为其他身份(例如EMQ服务器)颁发证书。 同样,我们首先需要一个私钥:

openssl genrsa -out MyEMQ1.key 2048

然后生成针对EMQ1的证书请求:

openssl req -new -key ./MyEMQ1.key -out MyEMQ1.csr

然后,使用CA根证书颁发EMQ1的证书:

openssl x509 -req -in ./MyEMQ1.csr -CA MyRootCA.pem -CAkey MyRootCA.key -CAcreateserial -out MyEMQ1.pem -days 3650 -sha256

现在我们可以开始在EMQ上使用SSL。

在EMQ上启用SSL

在EMQ上启用SSL非常简单,我们只需要修改“ emq.conf/emqx.conf中的一些配置。 默认的侦听端口是8883

listener.ssl.external = 8883

密钥和证书文件的位置:

#private key for emq cert:
listener.ssl.external.keyfile = etc/certs/MyEMQ1.key
#emq cert:
listener.ssl.external.certfile = etc/certs/MyEMQ1.pem
#CA cert:
listener.ssl.external.cacertfile = etc/certs/MyRootCA.pem

修改conf后,重新启动EMQ,并使用mosquitto_sub对其进行测试:

mosquitto_sub -t abc -h emq1 -p 8883 -d --cafile ~/test_certs/MyRootCA.pem --insecure
Client mosqsub|10617-Zhengyus- sending CONNECT
Client mosqsub|10617-Zhengyus- received CONNACK
Client mosqsub|10617-Zhengyus- sending SUBSCRIBE (Mid: 1, Topic: abc, QoS: 0)
Client mosqsub|10617-Zhengyus- received SUBACK
Subscribed (mid: 1): 0

启用客户端证书
在某些情况下,有必要通过检查客户端证书来确保客户端身份(双向认证)。 通过启用以下指令可以轻松完成此操作(修改emq.conf):

#enable the client side certificates
listener.ssl.external.verify = verify_peer

强制使用客户端证书(仅允许具有客户端证书的ssl)

#set it to 'true' to allow the ssl with client side certificate only 
listener.ssl.external.fail_if_no_peer_cert = true

做了上述更改后,我们继续使用相同的命令进行测试后,得到了一个tls错误

mosquitto_sub -t abc -h emq1 -p 8883 -d --cafile ~/test_certs/MyRootCA.pem --insecure
Client mosqsub|10738-Zhengyus- sending CONNECT
Error: A TLS error occurred.

双向认证我们将需要客户端证书,通过用生成服务器端证书的相同方式生成客户端证书:

openssl genrsa -out MyClient1.key 2048
openssl req -new -key ./MyClient1.key -out MyClient1.csr
openssl x509 -req -in ./MyClient1.csr -CA MyRootCA.pem -CAkey MyRootCA.key -CAcreateserial -out MyClient1.pem -days 3650 -sha256

生成证书后我们可以通过以下命令验证证书的有效性

openssl verify -CAfile MyRootCA.pem MyEMQ1.pem MyClient1.pem
MyEMQ1.pem: OK
MyClient1.pem: OK

我们用新生成的客户端证书进行测试:

mosquitto_sub -t abc -h emq1 -p 8883 -d --key ~/test_certs/MyClient1.key --cert ~/test_certs/MyClient1.pem --cafile ~/test_certs/MyRootCA.pem --insecure
Client mosqsub|10796-Zhengyus- sending CONNECT
Client mosqsub|10796-Zhengyus- received CONNACK
Client mosqsub|10796-Zhengyus- sending SUBSCRIBE (Mid: 1, Topic: abc, QoS: 0)
Client mosqsub|10796-Zhengyus- received SUBACK
Subscribed (mid: 1): 0

一切都按预期运行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值