您现在访问的是微软AZURE全睃版技术文档网站,若需覝访问由世纪互蝔违蝥的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

对称密钥证明

本文介绍了在使用含设备预配服务的对称密钥时的标识证明过程。

对称密钥证明是一种通过设备预配服务实例对设备进行身份验证的简单方法。 此证明方法表示不熟悉设备预配或不具备严格安全要求的开发人员的“Hello world”体验。 使用 TPMX.509 证书的设备证明更加安全,且应用于更严格的安全要求。

对称密钥注册还为具有有限安全功能的旧设备提供了通过 Azure IoT 启动到云的绝佳方法。 有关旧设备的对称密钥证明的详细信息,请参阅如何为旧设备使用对称密钥

对称密钥创建

默认情况下,当保存新注册且启用“自动生成密钥”选项时,设备预配服务会创建默认长度为 64 字节的新对称密钥。

自动生成对称密钥

还可以通过禁用此选项来为注册提供你自己的对称密钥。 在指定你自己的对称密钥时,你的密钥长度必须介于 16 个字节与 64 个字节之间。 此外,对称密钥必须以有效的 Base64 格式提供。

详细证明过程

使用 IoT 中心支持的相同安全令牌来执行含设备预配服务的对称密钥证明,以标识设备。 这些安全令牌都是共享访问签名 (SAS) 令牌

SAS 令牌具有使用对称密钥创建的哈希签名 。 设备预配服务会重新创建该签名,以验证在证明期间显示的安全令牌是否可信。

SAS 令牌的格式如下:

SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}

下面是每个令牌的组成元素:

说明
{signature} HMAC-SHA256 签名字符串。 对于单个注册,此签名通过使用对称密钥(主密钥或辅助密钥)执行哈希而生成。 对于注册组,从注册组密钥中派生的密钥用于执行哈希。 哈希在以下格式的消息上执行:URL-encoded-resourceURI + "\n" + expiry重要说明:必须先从 base64 解码密钥,然后才能将其用于执行 HMAC-SHA256 计算。 此外,签名结果必须为 URL 编码。
{resourceURI} 以设备预配服务实例的范围 ID 开头、可通过此令牌访问的注册终结点的 URI。 例如: {Scope ID}/registrations/{Registration ID}
{expiry} 从纪元 1970 年 1 月 1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串。
{URL-encoded-resourceURI} 小写资源 URI 的小写 URL 编码
{policyName} 此令牌所引用的共享访问策略名称。 使用对称密钥证明预配时使用的策略名称是“注册” 。

当设备使用单个注册进行证明时,设备将使用在单个注册条目中定义的对称密钥创建 SAS 令牌的哈希签名。

有关创建 SAS 令牌的代码示例,请参阅安全令牌

Azure IoT C SDK 支持创建对称密钥证明的安全令牌。 有关使用 Azure IoT C SDK 来证明单个注册的示例,请参阅预配模拟对称密钥设备

组注册

预配时,设备不直接使用组注册的对称密钥。 属于注册组的设备使用派生的设备密钥进行预配。

首先,为通过注册组进行证明的每个设备定义一个唯一注册 ID。 注册 ID 的有效字符为小写字母数字和短划线(“-”)。 此注册 ID 应是标识设备的唯一 ID。 例如,旧设备可能不支持多种安全功能。 旧设备可能只有可用于唯一标识该设备的 MAC 地址或序列号。 在这种情况下,注册 ID 可由类似于以下内容的 MAC 地址和序列号组成:

sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6

如何使用对称密钥预配旧设备一文中使用了该示例。

为设备定义注册 ID 后,注册组的对称密钥用于计算注册 ID 的 HMAC-SHA256 哈希,以生成派生的设备密钥。 下方选项卡中提供了计算派生设备密钥的一些示例方法。

Azure CLI 的 IoT 扩展提供了用于生成派生设备密钥的 compute-device-key 命令。 此命令可从基于 Windows 或 Linux 的系统、PowerShell 或 Bash shell 中使用。

--key 参数值替换为注册组中的主密钥。

--registration-id 参数值替换为注册 ID。

az iot dps compute-device-key --key 8isrFI1sGsIlvvFSSFRiMfCNzv21fjbE/+ah/lSh3lF8e2YG1Te7w1KpZhJFFXJrqYKi9yegxkqIChbqOS9Egw== --registration-id sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6

示例结果:

"Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc="

Windows

如果使用的是基于 Windows 的工作站,可以使用 PowerShell 生成派生的设备密钥,如以下示例中所示。

将密钥值替换为注册组中的主密钥。

用注册 ID 替换 REG_ID 值。

$KEY='8isrFI1sGsIlvvFSSFRiMfCNzv21fjbE/+ah/lSh3lF8e2YG1Te7w1KpZhJFFXJrqYKi9yegxkqIChbqOS9Egw=='
$REG_ID='sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6'

$hmacsha256 = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha256.key = [Convert]::FromBase64String($KEY)
$sig = $hmacsha256.ComputeHash([Text.Encoding]::ASCII.GetBytes($REG_ID))
$derivedkey = [Convert]::ToBase64String($sig)
echo "`n$derivedkey`n"
Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc=

然后使用生成的设备密钥来生成要用于证明的 SAS 令牌。 注册组中的每个设备都需要使用从唯一派生密钥中生成的安全令牌进行证明。 注册组对称密钥不能直接用于证明。

派生设备密钥的安装

理想情况下,在中心中派生和安装设备密钥。 此方法可保证不会在部署到设备的任何软件中包含组密钥。 向设备分配 MAC 地址或序列号后,可以派生密钥,并将其注入到设备,而无论制造商选择以何种方式来存储它。

请考虑下图,该图显示了一个设备密钥表,这些设备密钥通过以下方式在中心中生成:通过组注册密钥 (K) 对每个设备注册 ID 进行哈希处理 。

从中心分配的设备密钥

每个设备的标识由注册 ID 和在中心安装的派生设备密钥表示。 设备密钥不会复制到其他位置,且组密钥不会存储在设备上。

如果未在中心中安装设备密钥,应使用硬件安全模块 HSM 来安全存储设备标识。

后续步骤

了解对称密钥证明后,请参阅以下文章以了解更多信息: