使用 HTTP 自定义认证实现一机一密

Cloud 服务支持发表于:2023年06月08日 10:31:10更新于:2023年06月08日 11:12:24

MQTT 是一种轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。为了确保通讯安全,通常使用 TLS/SSL 来进行通讯加密。

本文主要介绍如何通过客户端证书 CN 连接到 EMQX Cloud,结合 HTTP 自定义认证实现一机一证书的验证。

EMQX Cloud 简介

EMQX Cloud 是由 EMQ 推出的可连接海量物联网设备、集成各类数据库及业务系统的全托管云原生 MQTT 服务。

作为全球首个全托管的 MQTT 5.0 公有云服务,EMQX Cloud 提供了一站式运维代管、独有隔离环境的 MQTT 消息服务。

在万物互联的时代,EMQX Cloud 可以帮助用户快速构建面向物联网领域的行业应用,可以帮助用户快速构建面向物联网领域的行业应用,轻松实现物联网数据的采集、传输、计算和持久化。

00164813dbeec9420e9da6fb7790f0c

借助云服务商提供的基础计算设施,EMQX Cloud 面向全球数十个国家与地区提供服务,为 5G 与万物互联应用提供低成本、安全可靠的云服务。


操作流程

一、配置 TLS/SSL 双向认证

1、准备工作

① 购买服务器证书,并将其域名解析到部署连接地址。

00164813de3bec8e42dfa7b79a4990c

② 生成客户端 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 自定义认证服务。

00164813c8b9db3d1c271fbff258e8d

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 自定义认证/访问控制,点击配置认证,即可新建认证。

00164813c482da377379153d2ce7abb

三、测试结果

1、  连接到部署

在本实例中我们使用 MQTTX 模拟客户端携带以下信息连接到 EMQX Cloud。

① 服务端 CA

② Common Name 为 346a004d-1dab-4016-bb38-03cca7094415 的客户端证书、客户端秘钥

③ password:public


点击右上角 connect,出现 connected 表示已连接成功。

00164813cbbae11a58522b0764be587

至此,带有指定 common name 的设备已成功连接至 EMQX Cloud,即一机一密设备通过验证并连接至 EMQX Cloud 已成功。

00164813ceaf137ddfffcaad70b4b19


2、由于配置了 TLS/SSL ,开启 HTTP 自定义认证模块后,会传递 %C 和 %d 参数。

00164813e0c142119b8c3b2ca03f324


小结

至此我们完成了 EMQX Cloud 的客户端一机一证书验证流程,成功连接到部署。相比于其他方案,一机一密能够做到针对每个设备的单独验证与授权,具有更高的安全性,若您也为您的每一个物联网设备设置了唯一的访问凭证,可以参考本文进行配置。


    您需要登录后才可以回复