配置创建自己的密钥 (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 过程中独占使用。
  • 必须位于将要导入目标密钥的同一保管库中。

用户步骤

若要执行密钥传输,请执行以下操作:

  1. 生成 KEK。
  2. 检索 KEK 的公钥。
  3. 使用 HSM 供应商提供的 BYOK 工具将 KEK 导入目标 HSM,并导出受 KEK 保护的目标密钥。
  4. 将受保护的目标密钥导入 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) 作为一种将所需元数据传递给服务进行正确解密的工具。