本文主要介绍了通过建立三层CA证书链,为EMQX集群提供PKI服务,实现客户端与云端的双向认证。EMQX集群部署,请参考:支持上亿物联网终端设备接入的MQTT集群。
根CA为EMQX服务签发服务器端证书,以及给中间CA签发中间证书,由中间CA给设备签发设备证书。
使用不同的 CA 服务,证书签发的流程以及需要的参数不同,如大部分支持安全芯片的设备,其私钥通常由设备端生成,通过向 CA 发送 csr 请求文件的方式获取CA机构签发的证书。下文仅借助流行的 cfssl 工具来完成证书的创建工作,设备端私钥由 cfssl 工具生成,如果尚未安装 cfssl 工具,请查看 cfssl 工具下载相关文章
{
"CN": "emqx",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Hubei",
"L": "Wuhan",
"O": "emqx",
"OU": "system"
}
],
"ca": {
"expiry": "87600h"
}
}
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
通过上边命令得到根CA的私钥 ca-key.pem
以及Root CA的字签名根证书 ca.pem
。
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"emqx": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
{
"CN": "emqx",
"hosts": [
"*"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Hubei",
"L": "Wuhan",
"O": "emqx",
"OU": "system"
}
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=emqx emqx-server-csr.json | cfssljson -bare emqx-server
通过上边的命令,将会得到 emqx 服务端的私钥 emqx-server-key.pem
,以及证书文件 emqx-server.pem.
这两个文件将会写入到 EMQX 配置文件 /etc/emqx/emqx.conf
中
emqx-intermediate-csr.json
文件{
"CN": "emqx",
"hosts": [
"*"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Hubei",
"L": "Wuhan",
"O": "emqx",
"OU": "system"
}
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=emqx emqx-intermediate-csr.json | cfssljson -bare emqx-intermediate
通过上边的命令,将会得到中间CA的私钥 emqx-intermediate-key.pem
,以及中间CA的证书 emqx-intermediate.pem
。中间CA的证书将会被写入到 EMQX 配置文件 /etc/emqx/emqx.conf
中。
{
"CN": "emqx",
"hosts": [
"*"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Hubei",
"L": "Wuhan",
"O": "emqx",
"OU": "system"
}
]
}
cfssl gencert -ca=emqx-intermediate.pem -ca-key=emqx-intermediate-key.pem -config=ca-config.json -profile=emqx emqx-device-csr.json | cfssljson -bare emqx-device-A
通过指定上边命令将会得到设备A的私钥 emqx-device-A-key.pem
,以及设备A的证书 emqx-device-A.pem
。
cfssl gencert -ca=emqx-intermediate.pem -ca-key=emqx-intermediate-key.pem -config=ca-config.json -profile=emqx emqx-device-csr.json | cfssljson -bare emqx-device-B
通过指定上边命令将会得到设备A的私钥 emqx-device-B-key.pem
,以及设备A的证书 emqx-device-B.pem
。如需给更多的设备签发证书,只需将上边的参数 emqx-device-B
换成其他设备名称即可。
emqx 默认的配置文件在 /etc/emqx/emqx.conf
中,修改配置文件,添加 ssl 证书配置信息,以及开启双向认证。
listeners.ssl.default {
bind = "0.0.0.0:8883"
max_connections = 512000
ssl_options {
keyfile = "/etc/ssl/emqx/emqx-server-key.pem"
certfile = "/etc/ssl/emqx/emqx-server.pem"
cacertfile = "/etc/ssl/emqx/emqx-intermediate.pem"
verify = verify_peer
# 强制开启双向认证,如果客户端无法提供证书,则 SSL/TLS 连接将被拒绝
fail_if_no_peer_cert = true
}
}
ssl 配置修改完成后,需要重启 emqx 服务,在重启服务之前,建议给证书文件设置可读权限,防止emqx服务端没有权限读取证书文件。
chmod +r /etc/ssl/emqx/*
systemctl restart emqx
上图是 EMQX 提供的客户端工具,里边设计到的关键参数有:
mqtts://
,表示连接EMQX的 ssl 坚挺类型。已连接
提示消息。同时 emqx 的管理控制台也会有连接成功的客户端信息