多代理身份验证到 MQTT

物联网 MQTT 验证 休息 API
2021-05-30 04:34:23

我正在构建一个小型物联网平台。我有一个从 MongoDB 读取数据的 webapp。有一个从 MQTT 读取数据并将数据存储到 mongo 的工作线程。

到这里为止,一切都很好。

我希望能够将代理发送到任何设备,无论是 RaspberryPi 还是 Arduino Yún 等。代理应该从 MQTT 代理读取数据/向 MQTT 代理发送数据。

用户需要在我的应用程序上注册并添加他们的设备才能这样做。如何正确处理身份验证?我是否允许任何人向 mqtt 添加内容?我是否首先强制设备通过应用程序上的 HTTP 进行身份验证,然后他们才能使用代理?

我要使用公钥还是令牌身份验证?我不明白所以我问你。

3个回答

对于 MQTT 设备,应该不需要首先通过 HTTP 使用身份验证。MQTT 支持身份验证,它可以链接到 ACL 以控制给定用户/设备可以发布/订阅哪些主题。身份验证可以是 MQTT 协议级别的用户/密码或基于传输级别的 TLS 证书。

大多数代理支持 ACL 中的通配符(和变量替换,例如 {username})主题,这允许您构建主题结构,可以创建只能由给定用户访问的主题树。

当用户注册新设备时,您可以让系统为该设备颁发用户名/密码/客户端 ID,或者颁发可用于唯一标识设备并将其附加到正确 ACL 结构的证书。

如果不了解您将传递的信息类型以及您打算使用的 MQTT 主题结构类型,就很难以更具体的方式回答。

永远不要让“任何人”通过 MQTT 向数据库添加内容;) 一旦不良数据进入数据库,您的分析程序的任何结果充其量都将出现偏差,或者更糟的是正确错误。任何时候当您有来自“外部”的 MQTT 流量时,您都希望有一些东西:DDoS 保护,以便有人无法淹没您的数据库,主题验证......是“访问”列表中的主题吗?和有效负载验证...是否应该允许这个 3,000 字节有效负载进入我的 MQTT Broker,它通常会看到 50 字节有效负载?

对于你的问题;由于用户必须在发送第一个 MQTT 数据包之前注册设备,因此您可以使用令牌 + SSL 之类的东西进行身份验证和加密。您的客户端软件在与 MQTT 代理连接时要求提供令牌并将其作为用户名或密码发送,并且由于您提前生成了它,因此代理可以进行快速查找以确保其有效并分配给该代理。

如果您不想自己打扰经纪人并在其中嵌入任何身份验证方案,我为您提供解决方案(非商业性,例如它是免费的):

每个小型 IoT 平台实例都需要有单独的 flespi.io 帐户(我们称之为客户)。您的平台将配置一个 flespi 超级令牌(用于访问 flespi.io)并且能够通过使用 MQTT 或HTTP API创建受限令牌在注册或激活期间,您将针对每个设备发布具有指定 ACL 的令牌,该 ACL 将 sub/pub 访问权限限制为仅指定主题。

设备使用令牌对 MQTT 代理进行身份验证(请参阅页面中间的授权)。

在该方案中,您可以侦听来自设备的所有已发布消息并自动在数据库中创建条目,以确保它们来自经过身份验证的(真实)设备。