MQTT 是一种轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。为了确保通讯安全,通常使用 TLS/SSL 来进行通讯加密。
本文主要介绍如何通过客户端证书 CN 连接到 EMQX Cloud,结合 HTTP 自定义认证实现一机一证书的验证。
EMQX Cloud 简介
EMQX Cloud 是由 EMQ 推出的可连接海量物联网设备、集成各类数据库及业务系统的全托管云原生 MQTT 服务。
作为全球首个全托管的 MQTT 5.0 公有云服务,EMQX Cloud 提供了一站式运维代管、独有隔离环境的 MQTT 消息服务。
在万物互联的时代,EMQX Cloud 可以帮助用户快速构建面向物联网领域的行业应用,可以帮助用户快速构建面向物联网领域的行业应用,轻松实现物联网数据的采集、传输、计算和持久化。
借助云服务商提供的基础计算设施,EMQX Cloud 面向全球数十个国家与地区提供服务,为 5G 与万物互联应用提供低成本、安全可靠的云服务。
操作流程
一、配置 TLS/SSL 双向认证
1、准备工作
① 购买服务器证书,并将其域名解析到部署连接地址。
② 生成客户端 root ca 自签名证书,使用自签名 root ca 证书签发客户端证书需确保 Common Name 唯一。
# CA 证书生成 client-ca.crt,subj 依据实际使用情况调整。
openssl req \
-new \
-newkey rsa:2048 \
-days 365 \
-nodes \
-x509 \
-subj "/C=CN/O=EMQ Technologies Co., Ltd/CN=EMQ CA" \
-keyout client-ca.key \
-out client-ca.crt
# 客户端秘钥生成 client.key
openssl genrsa -out client.key 2048
# 生成客户端证书请求文件 client.csr,CN 为客户端携带认证信息
openssl req -new -key client.key -out client.csr -subj "/CN=346a004d-1dab-4016-bb38-03cca7094415"
# 用 CA 证书给客户端证书签名,生成 client.crt
openssl x509 -req -days 365 -sha256 -in client.csr -CA client-ca.crt -CAkey client-ca.key -CAcreateserial -out client.crt
# 查看客户端端证书信息
openssl x509 -noout -text -in client.crt
# 验证证书
openssl verify -CAfile client-ca.crt client.crt
2、配置流程
登录 EMQX Cloud 控制台 。进入部署详情,点击 +TLS/SSL 配置按钮,配置证书内容,您可以上传文件或者直接填写证书内容 TLS/SSL 认证类型:
✓ 单向认证:仅客户端验证服务端证书。
✓ 双向认证:客户端和服务端相互验证证书。
在本示例文档中我们以双向认证为例,在部署控制台填入以下内容:
①公钥证书:服务端证书
②证书链:证书链,通常第三方机构签发证书时会提供
③私钥:私有秘钥
④客户端 CA 证书:选择双向认证时,需要提供客户端的 CA 证书
填写完成后,点击确定,直至状态为运行中,即双向认证创建完成。
二、创建 HTTP 自定义认证
1、创建 VPC 对等连接
在 EMQX Cloud 部署详情页面,创建 VPC 对等连接,便于专业版部署内网访问到您方 HTTP 自定义认证服务。
2、配置 HTTP 自定义认证
EMQX Cloud 在设备连接事件中使用当前客户端相关信息作为参数,向用户自定义的认证服务发起请求查询权限,通过返回的 HTTP 响应状态码 (HTTP statusCode) 来处理认证请求。
✓ 认证成功:API 返回 200 状态码
✓ 认证失败:API 返回 非 200 状态码
✓ 忽略认证:API 返回 200 状态码且消息体 ignore
HTTP 请求方法为 GET 时,请求参数将以 URL 查询字符串的形式传递;POST 请求则将请求参数以普通表单形式提交(content-type 为 x-www-form-urlencoded)。
你可以在认证请求中使用以下占位符,请求时 EMQX Cloud 将自动填充为客户端信息:
%u:用户名
%c:Client ID
%a:客户端 IP 地址
%r:客户端接入协议
%m:Mountpoint
%t:主题
%P:明文密码
%p:客户端端口
%C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效
%d:TLS 证书 subject,仅当 TLS 连接时有效
在部署中点击认证鉴权 - 外部认证授权 - HTTP 自定义认证/访问控制,点击配置认证,即可新建认证。
三、测试结果
1、 连接到部署
在本实例中我们使用 MQTTX 模拟客户端携带以下信息连接到 EMQX Cloud。
① 服务端 CA
② Common Name 为 346a004d-1dab-4016-bb38-03cca7094415 的客户端证书、客户端秘钥
③ password:public
点击右上角 connect,出现 connected 表示已连接成功。
至此,带有指定 common name 的设备已成功连接至 EMQX Cloud,即一机一密设备通过验证并连接至 EMQX Cloud 已成功。
2、由于配置了 TLS/SSL ,开启 HTTP 自定义认证模块后,会传递 %C 和 %d 参数。
小结
至此我们完成了 EMQX Cloud 的客户端一机一证书验证流程,成功连接到部署。相比于其他方案,一机一密能够做到针对每个设备的单独验证与授权,具有更高的安全性,若您也为您的每一个物联网设备设置了唯一的访问凭证,可以参考本文进行配置。