# 设备认证

为了将设备连接至 FogCloud,您需要首先在 FogCloud 创建设备,创建包括定义产品,并在该产品下创建设备。您可以使用 FogCloud 管理后台或者云端 API 来创建产品和设备。FogCloud 目前支持 MQTT 通信协议,您的设备需要经过身份认证才能连接至 FogCloud。FogCloud 使用密钥认证:设备使用 device_secret 进行签名,该签名会传递至 FogCloud 作为身份证明。

# 1. 设备密钥认证

连接地址:

地区

mqtt 地址

中国

mqtts://app.mqtt.fogcloud.io:8883

欧洲

mqtts://mqtt-eu.fogcloud.io:8883

设备认证方式目前支持密钥认证。密钥认证有两种认证方案:「一机一密」和「一型一密」,两种方案在易用性和安全性上各有优势。为系统安全性考虑,推荐使用“一机一密”,但由于密钥是服务端生成,所以使用“一机一密”的前提是物联网模组或者主控 MCU 芯片支持烧录每个芯片都不一样的 ID。

# 1.1 一机一密

一机一密需要预先为设备烧录三元组信息:product_key,device_name,device_secret。当设备与FogCloud平台建立 mqtt 连接时,FogCloud会对三元组组成的连接参数进行认证。认证通过后,设备可与FogCloud平台进行通信。

# 1.1.1 mqtt 连接参数

  • client_id

固定格式:${client_id}|signmethod=${signmethod},authType=${auth_type}|

参数说明:

参数

说明

${client_id}

mqtt 客户端 id,需要自定义。建议使用device_name<span>&</span>product_keymac地址

${signmethod}

签名算法,支持:hmacmd5hmacsha1aescmac;不填则默认hmacsha1

${auth_type}

认证方式:1-一机一密,2-一型一密预注册,3-一型一密免预注册。不传则默认为 1

  • username

固定格式:${device_name}<span>&</span>${product_key}

  • password

使用client_id参数中的${signmethod}为签名算法,以device_secret为密码,对拼接字符串计算签名,并将得到的字节码转为 hex 字符串即可得到password

进行签名的字符串为固定格式:clientId${client_id}deviceName${device_name}productKey{$product_key}

# 1.1.2 示例

一个设备的三元组为:

{
    "product_key": "7153abc4",
    "device_name": "00000000",
    "device_secret": "10dbb5bd4328feda67376318ac4ac714"
}

client_id 参数为:

{
    "authType": 1,
    "client_id": "00000000&7153abc4",
    "signmethod": "hmacsha1"
}

则其 MQTT 连接参数如下:

client_id=00000000&7153abc4|signmethod=hmacsha1,authType=1|
username=00000000&7153abc4
password=hmacsha1("10dbb5bd4328feda67376318ac4ac714", "clientId00000000&7153abc4deviceName00000000productKey7153abc4").toHexString()

加密后的 password 为 16 进制字符串:

ea2d65261c829ee0902d021dbcba8512479e6c02

# 1.2 一型一密

一型一密可以为同一产品下所有设备烧录相同的信息:product_keyproduct_secret。设备激活时需发送激活请求,FogCloud平台会进行身份认证,认证通过后,返回设备接入所需信息

# 1.2.1 基本步骤

  1. 创建产品

  2. 在产品详情里开启动态注册功能

  3. 添加设备

  4. 烧录product_key, product_secret到设备

  5. 动态注册

# 1.2.2 基于 http 的动态激活

设备直接向FogCloud平台发起 HTTP 请求,动态获取三元组信息,然后再按一机一密方式进行接入。

  • 接口地址
POST https://${host}/openapi/v1/auth/register/device
  • 请求体
{
  "product_key": "12345678",
  "mac": "00000000",         //设备mac地址
  "sign_method": "hmacsha1", //hmac算法,可选:hmacmd5, hmacsha1
  "sign": "20a9af62f630ce54eae18a424905cae3da909371", //hmac签名
  "random": "123fadff" // 随机字符串,长度5~20个字节
}
  • 返回参数
{
  "code": 0,     //0-成功
  "message": "", //错误信息
  "data": {
    "product_key": "string",
    "device_name": "string",
    "device_secret": "string"
  }
}
  • 签名计算方式

使用sign_method字段的hmac算法,product_secret作为秘钥,对固定格式字符串进行签名,并将得到的字节码转为 hex 字符串即可。
被签名的字符串固定格式为:
"mac${mac}productKey${product_key}random${random}"

  • 签名示例

一个设备的请求参数为:

{
    "product_key": "5a2cb046",
    "mac": "00aa9ea12",
    "sign_method": "hmacsha1",
    "random": "123fadff"
}

product_secret为:"567bf9c3ac1cc983265a3099efd9477c"

需要计算签名的字符串为:"mac00aa9ea12productKey5a2cb046random123fadff"

使用 hmacsha1 算法计算签名的伪代码:hmacsha1("567bf9c3ac1cc983265a3099efd9477c", "mac00aa9ea12productKey5a2cb046random123fadff").toHexString()

最后计算得到的签名为:"7aa0b6ffd103e6facd952c5088beb1b5ecfb305c"

# 1.2.3 基于 http 的动态生成

设备直接向FogCloud平台发起 HTTP 请求,动态生成三元组信息,device_name由设备指定,然后再按一机一密方式进行接入。

  • 接口地址
POST https://${host}/openapi/v1/auth/generator/device

  • 请求体
{
  "product_key": "string",
  "device_name": "string", //长度6~20个字节,仅支持英文数字字符
  "sign_method": "string", //hmac算法,可选:hmacmd5, hmacsha1
  "sign": "string",        //hmac签名
  "random": "string"       //随机字符串,长度5~20个字节
}
  • 返回参数
{
  "code": 0,
  "message": "SUCCESS",
  "data": {
    "product_key": "string",
    "device_name": "string",
    "device_secret": "string"
  }
}
  • 签名计算方式

使用sign_method字段的hmac算法,product_secret作为秘钥,对固定格式字符串进行签名,并将得到的字节码转为 hex 字符串即可。
被签名的字符串固定格式为:
"deviceName${device_name}productKey${product_key}random${random}"

  • 签名示例

一个设备的请求参数为:

{
    "product_key": "5a2cb046",
    "device_name": "00aa9ea12",
    "sign_method": "hmacsha1",
    "random": "123fadff"
}

product_secret为:"567bf9c3ac1cc983265a3099efd9477c"

需要计算签名的字符串为:"deviceName00aa9ea12productKey5a2cb046random123fadff"

使用 hmacsha1 算法计算签名的伪代码:hmacsha1("567bf9c3ac1cc983265a3099efd9477c", "deviceName00aa9ea12productKey5a2cb046random123fadff").toHexString()

最后计算得到的签名为:"733786f4e1a2a6c0e13aebfc3e228ec463971f43"

更新时间: 2023/3/7 下午5:06:06