美文网首页MQTT
用TLS/SSL保证EMQ的网络传输安全

用TLS/SSL保证EMQ的网络传输安全

作者: EMQ | 来源:发表于2018-07-23 15:35 被阅读73次

作为基于现代密码学公钥算法的安全协议,TLS/SSL能在计算机通讯网络上保证传输安全,EMQ的MQTT broker支持TLS,也可以用这种方式来确保传输安全。

TLS/SSL带来的安全优势

  • 强认证。 用TLS建立连接的时候,通讯双方可以互相检查对方的身份。在实践中,很常见的一种身份检查方式是检查对方持有的X.509数字证书。这样的数字证书通常是由一个受信机构办法的,不可伪造。
  • 保证机密性 TLS通讯的每次会话都会由会话密钥加密,会话密钥有通讯双方协商产生。任何第三方都无法知晓通讯内容。即使一次会话的密钥泄露,并不影响其他会话的安全性。
  • 完整性。 加密通讯中的数据很难被篡改而不被发现。

接下来EMQ君将介绍TLS/SSL协议以及如何在EMQ上启用。

TLS/SSL协议

TLS/SSL协议下的通讯过程分为两部分,第一部分是握手协议。握手协议的目的是鉴别对方身份并建立一个安全的通讯通道。握手完成之后双方会协商出接下来使用的密码套件和会话密钥;第二部分是record协议,redord和其他数据传输协议非常类似,会携带内容类型,版本,长度和荷载等信息,不同的是它所携带的信息是加密了的。

下面的图片描述了TLS/SSL握手协议的过程,从客户端的“hello”一直到服务器的“finished”完成握手。有兴趣的同学可以放狗找更详细的资料看。对这个过程不了解也并不影响我们在EMQ中启用这个功能。

在EMQ中启用TLS/SSL的准备工作

通常来说,我们会需要数字证书来保证TLS通讯的强认证。数字证书的试用本身是一个三方协议,除了通讯双方,还有一个颁发证书的受信第三方,有时候这个受信第三方就是一个CA。和CA的通讯,一般是以预先发行证书的方式进行的。也就是在开始TLS通讯的时候,我们需要至少有2个证书,一个CA的,一个EMQ的,EMQ的证书由CA颁发,并用CA的证书验证。如果要做双向认证,还会用到一个客户端证书。

获得一个真正受外界信任的证书会有一定的开销。在实验室环境,我们可以用自己生成的证书来模拟这个过程。接下来的演示,EMQ君就是用的这个方法。

在这里,我们假设您的系统已经安装了OpenSSL。试用OpenSSL附带的工具集就可以生成我们需要的证书了。

首先,我们需要一个自签名的CA证书。生成这个证书需要有一个私钥为它签名,如果还没有合适的私钥的话,可以在命令行上执行以下命令来生成一个:

openssl genrsa -out MyRootCA.key 2048

这个命令将生成一个密钥长度2048的密钥并保存在MyRootCA.key。有了这个密钥,就可以用它来生成EMQ broker的根证书了:

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

根证书是整个信任链的起点,如果一个证书的每一级签发者向上一直到根证书都是可信的,那个我们就可以认为这个证书也是可信的。有了这个根证书,我们就可以用它来给其他实体签发实体证书了。

实体(在这里就是EMQ Broker)也需要一个自己的私钥对来保证它对自己证书的控制权。生成这个密钥的过程和上面类似:

openssl genrsa -out MyEMQ1.key 2048

然后以这个密钥签发一个证书请求:

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

然后以根证书来签发EMQ Broker的实体证书了:

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

现在,我们可以启用EMQ的TLS/SSL连接了

在EMQ Broker上启用TLS/SSL

启用TLS/SSL的过程是比较简单的,只需要修改emq.conf文件中的一些配置就可以了:

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

重启EMQ后,用mosquittu_sub来验证TLS是否正常启动:

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

这个结果和我们期待的一样。moqsuitto客户端通过TLS/ssl正常连接并订阅主题。
如果我们从EMQ的Dashboard上看的话,可以看到在8883端口上有一个mqtt:ssl连接:

启用TLS/SSL的双向验证

在一些对于身份验证要求比较严格的场景,也会要求EMQ对客户端的身份用证书进行验证。这时候就需要启动双向验证了。

emq.conf中启动对对端的证书验证:

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

emq.conf中强制对对端的证书验证:

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

完成上面的步骤后,如果我们再想用之前的方式连接EMQ,客户端就会被拒绝:

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

修改mosquitto_sub的命令行启动客户端证书验证:

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

希望EMQ君的这篇小文章能帮上你的忙:)

参考文章

  1. 了解常见的MQTT服务器的安装请参考这篇文章

  2. Mosquitto客户端的使用,请参考这篇文章

相关文章

  • EMQ X MQTT 服务器启用双向 SSL/TLS 安全连接

    作为基于现代密码学公钥算法的安全协议,TLS/SSL 能在计算机通讯网络上保证传输安全,EMQ X 内置对 TLS...

  • EMQ X MQTT 服务器启用 SSL/TLS 安全连接

    作为基于现代密码学公钥算法的安全协议,TLS/SSL 能在计算机通讯网络上保证传输安全,EMQ X 内置对 TLS...

  • 用TLS/SSL保证EMQ的网络传输安全

    作为基于现代密码学公钥算法的安全协议,TLS/SSL能在计算机通讯网络上保证传输安全,EMQ的MQTT broke...

  • Https[证书生成]

    TLS:(Transport Layer Security)为安全传输层协议,所以属于传输层;SSL与TLS的区别...

  • HTTPS

    HTTPS 超文本传输安全协议 端口:443 SSL/TLS TLS(Transport Layer Securi...

  • Https 详解

    超文本传输安全协议(HTTPS,常称为 HTTP over TLS/SSL)是一种通过计算机网络进行安全通信的传输...

  • 证书、CA、证书信任链

    TLS 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(...

  • DB2 SSL 配置

    一、TLS和SSL介绍 应用程序和网站用来保护其传输数据的最常用方法是传输层安全(TLS)。TLS的前身是安全套接...

  • 明天面试一个小朋友,我准备问问他 SSL / TLS

    不使用 SSL/TLS 的网络通信,一般都是明文传输,网络传输内容在传输过程中很容易被窃听甚至篡改,非常不安全。S...

  • Go socket服务器使用TLS

    TLS(以前称为SSL)最著名的功能是启用HTTPS,HTTP的安全版本。然而,正如TLS的名字(传输层安全)所暗...

网友评论

  • ldsheng:生成证书的命令不成功。其他的可参考

本文标题:用TLS/SSL保证EMQ的网络传输安全

本文链接:https://www.haomeiwen.com/subject/oqdjmftx.html