配置创建自己的密钥 (BYOK)
方案
密钥保管库客户希望将密钥从 Azure 外部的本地硬件安全模块 (HSM) 安全地传输到支持 Azure 密钥保管库的 HSM。 导入在 Key Vault 外部生成的密钥的过程称为创建自己的密钥 (BYOK)。
要求如下:
- 要传输的密钥永远不会以纯文本形式存在于 HSM 的外部。
- 在 HSM 外部,要传输的密钥始终受 Azure 密钥保管库 HSM 中保存的密钥的保护。
术语
密钥名称 | 键类型 | 源 | 描述 |
---|---|---|---|
密钥交换密钥 (KEK) | RSA | Azure Key Vault HSM | 在 Azure Key Vault 中生成的由 HSM 支持的 RSA 密钥对 |
包装密钥 | AES | 供应商 HSM | 本地 HSM 生成的 [临时] AES 密钥 |
目标密钥 | RSA、EC、AES(仅限托管 HSM) | 供应商 HSM | 要传输到 Azure Key Vault HSM 的密钥 |
密钥交换密钥 (KEK):这是客户在用于导入 BYOK(创建自己的密钥)密钥的密钥保管库中生成的 HSM 支持的密钥。 KEK 应具有以下属性:
- 必须是 RSA-HSM 密钥,大小为 4096 位、3072 位或 2048 位。
- 关键操作 (key_ops) 仅限于“import”,允许在 BYOK 过程中独占使用。
- 必须位于将要导入目标密钥的同一保管库中。
用户步骤
若要执行密钥传输,请执行以下操作:
- 生成 KEK。
- 检索 KEK 的公钥。
- 使用 HSM 供应商提供的 BYOK 工具将 KEK 导入目标 HSM,并导出受 KEK 保护的目标密钥。
- 将受保护的目标密钥导入 Azure Key Vault。
客户使用 HSM 供应商提供的 BYOK 工具和文档完成步骤 3。 会生成一个密钥传输 Blob(“.byok”文件)。
HSM 约束
现有 HSM 可能对其管理的密钥施加约束,包括:
- 可能需要将 HSM 配置为允许基于密钥包装的导出
- 可能需要将目标密钥标记为 Cryptoki 属性 (CKA)_EXTRACTABLE,以便 HSM 允许受控导出
- 在某些情况下,可能需要将 KEK 和包装密钥标记为 CKA_TRUSTED,这允许它用于 HSM 中的包装密钥。
通常,源 HSM 的配置不在此规范的范围内。 Microsoft 期望 HSM 供应商生成 BYOK 工具随附的文档,以包含此类配置步骤。
注意
可以使用其他界面(例如 Azure PowerShell 和 Azure 门户)执行其中的几个步骤。 还可以使用 Key Vault SDK 中的等效函数以编程方式执行。
生成 KEK
使用 az keyvault key create 命令创建 KEK,并将密钥操作设置为“导入”。 记下从以下命令返回的密钥标识符 'kid'。
az keyvault key create --kty RSA-HSM --size 4096 --name KEKforBYOK --ops import --vault-name ContosoKeyVaultHSM
服务支持不同的 KEK 长度;例如,Azure SQL 仅支持 2048 或 3072 字节的密钥长度。
检索 KEK 的公钥
下载 KEK 的公钥部分,并将其存储到 PEM 文件中。
az keyvault key download --name KEKforBYOK --vault-name ContosoKeyVaultHSM --file KEKforBYOK.publickey.pem
使用 HSM 供应商提供的 BYOK 工具生成密钥传输 blob
使用 HSM 供应商提供的 BYOK 工具创建密钥传输 Blob(存储为“.byok”文件)。 作为隐私增强邮件(.pem 文件)提供的 KEK 公钥将是此工具的输入之一。
密钥传输 Blob
长期以来,Microsoft 希望使用 PKCS#11 CKM_RSA_AES_KEY_WRAP 机制将目标密钥传输到 Azure Key Vault,因为此机制生成单个 blob,更重要的是,中间 AES 密钥由两个 HSM 处理,并保证是临时的。 此机制目前在某些 HSM 中不可用,但使用 AES 密钥通过 CKM_AES_KEY_WRAP_PAD 保护目标密钥和使用 CKM_RSA_PKCS_OAEP 保护 AES 密钥的方法组合可生成等效的 Blob。
目标密钥明文依赖于密钥类型:
- 对于 RSA 密钥,为包装在 PKCS#8 [RFC5208] 中的私钥 ASN.1 DER 编码 [RFC3447]
- 对于 EC 密钥,为包装在 PKCS#8 [RFC5208] 中的私钥 ASN.1 DER 编码 [RFC5915]
- 对于八进制密钥,为密钥的原始字节
然后,使用 CKM_RSA_AES_KEY_WRAP 机制来转换明文密钥的字节:
- 将生成临时 AES 密钥,并使用带有 SHA1 的 RSA-OAEP 通过包装 RSA 密钥加密。
- 编码的明文密钥使用 AES 密钥通过使用填充的 AES 密钥包装进行加密。
- 加密的 AES 密钥和加密的明文密钥连接以生成最终的已加密文本 blob。
传输 blob 的格式主要使用 JSON Web 加密紧凑序列化 (RFC7516) 作为一种将所需元数据传递给服务进行正确解密的工具。