设备认证

最近更新时间:2019-11-25 12:38:07

设备身份信息

为保证安全,物联网平台会验证每个接入设备的合法性,为此提供了两种认证方式,满足不同的使用场景及各种资源的设备接入。两种认证方式分别为证书认证和密钥认证。证书方式安全性更高,但需要消耗较多的软硬件资源。

  • 证书设备要通过平台的安全认证,必须具备四元组信息:产品 ID(ProductId)、设备名(DeviceName)、设备证书文件(DeviceCert)、设备私钥文件(DevicePrivateKey),其中证书文件和私钥文件由平台生成,且一一对应。
  • 密钥设备要通过平台的安全认证,必须具备三元组信息:产品 ID(ProductId)、设备名(DeviceName)、设备密钥(DeviceSecret),其中设备密钥由平台生成。

设备密钥是在控制台创建产品时,通过设置认证方式来确定,如下图所示:

设备身份信息烧录

创建产品后,在物联网开发平台 控制台 或者通过 云 API 创建设备,并获取对应的设备信息,将上述的四元组或者三元组信息,在设备生产的特定环节,烧录到非易失介质中,设备 SDK 运行时读取存放的设备信息,进行设备认证。

SDK 提供了设备信息读写的 HAL 接口,必须实现。请参考 Linux 平台 HAL_Device_Linux.c 中设备信息读写的实现。

设备信息 HAL 接口

HAL_API 说明
HAL_SetDevInfo 设备信息写入
HAL_GetDevInfo 设备信息读取

应用示例

  • 初始化连接参数
static DeviceInfo sg_devInfo;

static int _setup_connect_init_params(MQTTInitParams* initParams)
{
    int ret;

    ret = HAL_GetDevInfo((void *)&sg_devInfo);    
    if(QCLOUD_ERR_SUCCESS != ret){
        return ret;
    }

    initParams->device_name = sg_devInfo.device_name;
    initParams->product_id = sg_devInfo.product_id;
     ......
}    
  • 鉴权参数生成
static int _serialize_connect_packet(unsigned char *buf, size_t buf_len, MQTTConnectParams *options, uint32_t *serialized_len) {
            ......
            ......
    int username_len = strlen(options->client_id) + strlen(QCLOUD_IOT_DEVICE_SDK_APPID) + MAX_CONN_ID_LEN + cur_timesec_len + 4;
    options->username = (char*)HAL_Malloc(username_len);
    get_next_conn_id(options->conn_id);
    HAL_Snprintf(options->username, username_len, "%s;%s;%s;%ld", options->client_id, QCLOUD_IOT_DEVICE_SDK_APPID, options->conn_id, cur_timesec);

#if defined(AUTH_WITH_NOTLS) && defined(AUTH_MODE_KEY)
     if (options->device_secret != NULL && options->username != NULL) {
         char                sign[41]   = {0};
         utils_hmac_sha1(options->username, strlen(options->username), sign, options->device_secret, options->device_secret_len);
         options->password = (char*) HAL_Malloc (51);
         if (options->password == NULL) IOT_FUNC_EXIT_RC(QCLOUD_ERR_INVAL);
         HAL_Snprintf(options->password, 51, "%s;hmacsha1", sign);
     }
#endif
            ......
}