随着互联网快速发展,网络安全越来越得到人们的关注。谁都不想自己的数据被人窃听或利用,而当我们直接使用TCP连接一个服务器通讯时,此时是明文传输的,很容易使用抓包工具(如wireshark)抓取我们的数据包,从而分析出相关的数据。比如我们直接登陆mqtt服务器,数据报文中就包括了登陆账号,密码,ClientID等等信息,如果“坏人”捕捉到这些信息,那他就可以连接我们的服务器,显然这不是我们想要的结果。
SSL就是解决其问题的一种方案。即我们可以在我们的应用程(HTTP, MQTT, FTP)与传输层(这里主要是TCP)之间加一级SSL加密传输。细心的小伙伴可以发现现在绝大多数的网站都已经采用了这种方式加密通信,从以前的http悄悄的变成了https咯~
证书其实是SSL中通讯过程基本保障,用来验证服务器或客户端是否是可信任的(这里大家可以联想下我们在银行办理网上银行时,通常银行会给我们一个类似“K宝”的小东西,其作用就是客户端证书,当我们登陆银行网站交易时,网站会验证我们是否可信任,否则不允许登陆或后续交易操作)。且公证的证书(证书机构颁发的,如CA机构)有效的防止他人仿造,保障了通讯过程的安全。而这里我们自己制作的自签证书,仅供自己使用,并不是公认的。好了,暂时先说这么多。OK,开始进入我们的主题。
这里需要我们的测试环境的Ubuntu系统,已经默认安装Openssl了,如果大家没装的话,可以使用apt-get install openssl相关命令安装即可。
1. 生成CA私钥。 这里我们自己“假装”是CA机构,当然需要CA证书,私钥拉,不然咋给其他人办理业务勒~
openssl genrsa -out ca-key.pem 1024
2. 创建证书请求。 证书请求是生成证书必要过程,请求中就包含了所属城市,单位,机构,组织,公共名等等信息。
openssl req -new -out ca-req.csr -key ca-key.pem
3. 自签署(CA)证书,也叫根证书。之后就可以给“其他人”办理业务咯。
openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 3650
以下是生成服务器证书过程,其实过程和以上生成CA证书完全一样。
4. 生成服务器私钥
openssl genrsa -out server-key.pem 1024
5. 生成服务器证书请求文件
openssl req -new -out server-req.csr -key server-key.pem
注意: 在Common Name必须填写自己的服务器IP地址(或域名)。
openssl x509 -req -in server-req.csr -out server-cert.pem -signkey server-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
以下是生成客户端证书过程:
7. 生成客户端私钥
openssl genrsa -out client-key.pem 1024
8. 生成证书请求
openssl req -new -out client-req.csr -key client-key.pem
9. 自签署证书
openssl x509 -req -in client-req.csr -out client-cert.pem -signkey client-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
OK, 到这里我们已经完成了服务器和客户端的证书(完全是个体力活 - -!), 接下来我们就利用我们生成的证书应用于实践中,这里我们采用EMQ(MQTT服务器,如果小伙伴不清楚如何搭建自己MQTT客户端的话,可以我参考我前几篇的文章的介绍,这里就不再赘述) + mqttfx(MQTT客户端)方式来测试。
10. 拷贝生成服务器证书(server-cert.pem)和私钥(server-key.pem),到emq工作目录下的/emqx/etc/certs/中,
cp server-cert.pem server-key.pem ../emqx/etc/certs/
11. 打开emqx/etc中的emqx.conf配置文件
找到
listerner.ssl.external.keyfile 和
listener.ssl.external.certfile这2个参数:
这里我们可以看到默认值与我们生成的名字对不上,我们可以直接更改emqx.conf配置文件中的值与我们的一致, 另外我们也可以保持emqx.conf文件不变,修改我们制作的证书和私钥名字,与之一样(这里我们采用该种方式,尽量保持emqx原生文件不变)。使用mv命令修改:
mv server-cert.pem cert.pem
mv server-key.pem key.pem
12. 将Ubuntu中制作的CA和客户端相关证书,密钥拷贝到windows中(这是因为之后我们要利用Windows中的mqttfx客户端测试)。
cp c* /mnt/hgfs/winshare/my_cert/ //winshare是我的Ubuntu和Windows共享文件夹
13. 打开mqttfx客户端
首先点击“User Creentials”设置服务器地址,端口号(emq加密ssl端口默认为8883),登陆用户名,密码(如果emq关闭匿名登陆则必须填写正确的用户名和密码,如果打开匿名登陆,则可以不管)等信息。
然后点击1)“SSL/TLS”, 进行相关配置:
2)勾选"Enable SSL/TLS"
3) 勾选“Self signed certificates”
4)分别加载我们之前生成的CA证书,客户端证书,客户端私钥
5)勾选“PEM Formatted”
设置完以上,点击“Apply”或OK,回到主界面,点击“Connect”连接我们Ubuntu中emq服务器
之后,我们就可以放心与服务器加密通讯咯。
至此我们已经实现了搭建自己的MQTT服务器,以及加密通讯,为我们之后智能设备对接服务器,进行远程控制做好准备工作。如果小伙伴对如何搭建MQTT服务器不熟悉的话,可以参考我的这篇文章物联网之MQTT服务器搭建。因为考虑篇幅,今天很笼统说了下ssl和证书,并没有很详细的铺开讲述, 这篇文章注重实践操作,如果小伙伴对证书的产生的原由感兴趣,欢迎留言,后续我可以补一篇理论文章。 好了,今天的分享至此,欢迎小伙伴关注,收藏,转发哟~