Amazon Nitro Enclaves 如何使用 Amazon KMS - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon Nitro Enclaves 如何使用 Amazon KMS

Amazon Nitro Enclaves 是一项 Amazon EC2 功能,它允许您从 Amazon EC2 实例创建隔离的计算环境。

在 Amazon Nitro Enclaves 中运行的应用程序可以使用 Amazon Nitro Enclaves 开发工具包调用 Amazon KMS DecryptGenerateDataKeyGenerateRandom 操作。Nitro Enclaves 开发工具包将证明文档从 Enclave 添加到每个 Amazon KMS API 请求中。Amazon KMS 操作会使用证明文档中的公有密钥对明文进行加密,而不是返回明文数据。这种设计允许密文只能通过 Enclave 内相应的私有密钥进行解密。

为了支持 Amazon Nitro Enclaves,Amazon KMS 添加一个具有 RecipientInfo 对象类型和 CiphertextForRecipient 响应字段的 Recipient 请求参数到这些操作的标准请求和响应字段中。这些特定于 Enclave 的元素仅在受支持的 API 操作中有效,并且仅当请求使用 Amazon Nitro Enclaves 开发工具包签名时有效。Amazon KMS 依赖于 Enclave D 证明文件的数字签名来证明请求中的公有密钥来自于有效的 Enclave。您不能提供自己的证书来对证明文档进行数字签名。

Amazon KMS 还支持策略条件键,您可以使用这些键仅在证明文件具有指定内容时允许对 Amazon KMS 密钥执行 Enclave 操作。有关详细信息,请参阅Amazon Nitro Enclaves 的 Amazon KMS 条件键

有关 Amazon Nitro Enclaves 的信息,请参阅 Amazon Nitro Enclaves 开发人员指南中的什么是 Amazon Nitro Enclaves。有关为加密设置数据和数据密钥的信息,请参阅将加密证明与 Amazon KMS 结合使用

Recipient

"Recipient": { "AttestationDocument": blob, "KeyEncryptionAlgorithm": "string" }

包含来自 Enclave 和加密算法的签名证明文档的请求参数。唯一有效的加密算法是 RSAES_OAEP_SHA_256

此参数仅在请求来自 Amazon Nitro Enclaves 开发工具包时有效。

类型:RecipientInfo 对象

RecipientInfo

此类型包含有关从 API 操作接收响应的 Enclave 的信息。

AttestationDocument

包含描述 Nitro enclave 状态的测量的文档。本文档还包含 Enclave 的公有密钥。Amazon KMS 将在此公有密钥下对响应中的任何明文进行加密,从而使它稍后只能通过 Enclave 中响应的私有密钥进行解密。

类型:Base64 编码的二进制数据对象

长度限制:最小长度为 1。长度上限为 262144。

必需:否

KeyEncryptionAlgorithm

Amazon KMS 应与公有密钥结合使用的加密算法。唯一有效值为 RSAES_OAEP_SHA_256

类型:字符串

有效值:RSAES_OAEP_SHA_256

必需:否

CiphertextForRecipient

{ "CiphertextForRecipient": blob }

此响应字段包含使用请求中的证明文档中的公有密钥加密的密文。只要当请求中包含带有有效证明文档和加密算法的 Recipient 参数时,才会填充此字段。填充此字段后,响应中的 Plaintext 字段为 null。

类型:Base64 编码的二进制数据对象

长度限制:最小长度为 1。长度上限为 6144。

Amazon Nitro Enclaves 的 Amazon KMS 操作

以下 Amazon KMS 操作支持 Nitro Enclaves。本主题介绍了当请求来源于 Amazon Nitro Enclaves 开发工具包且 Recipient 参数包含有效的证明文档时这些 API 操作是如何工作的。这些操作支持 Recipient 参数和 CiphertextForRecipient 响应字段。

Decrypt

要从 Enclave 中调用 Decrypt 操作,请在 Amazon Nitro Enclaves 开发工具包中使用 kms-decrypt 操作。

使用指定的 Amazon KMS 密钥解密请求中的密文 Blob 后,Decrypt 操作使用证明文档中的公有密钥和指定的加密算法重新加密生成的明文。它将在响应的 CiphertextForRecipient 字段中返回产生的密文。响应中的 Plaintext 字段为 null。

GenerateDataKey

要从 Enclave 中调用 GenerateDataKey 操作,请在 Amazon Nitro Enclaves 开发工具包中使用 kms-generate-data-key 操作。

生成数据密钥后,GenerateDataKey 操作将在指定的 Amazon KMS 密钥下加密数据密钥的一个副本,并将其返回到 CiphertextBlob 字段中。它会加密证明文档中公有密钥下的其他数据密钥副本,并将其返回到 CiphertextForRecipient 字段中。响应中的 Plaintext 字段为 null。

您对 GenerateDataKey 响应中两个加密数据密钥的使用取决于您对 Enclave 的使用。

  • 如果要使用数据密钥加密 Enclave 内的数据,请使用 Enclave 内的私有密钥对 CiphertextForRecipient 字段中的值进行解密。如果要将此新加密的数据保留在 Enclave 之外,您可以将其与两个加密的数据密钥副本中的任何一个一起存储在 GenerateDataKey (kms-generate-data-key) 响应中。

  • 如果您打算保持 Enclave 运行,并且可以依赖于 Enclave 内存中的私有密钥的持久性,则可以在将带有新加密数据的 CiphertextForRecipient 对象移动到 Enclave 之外时,包括该对象。当您准备解密 CiphertextForRecipient 对象时,您必须在 Enclave 中使用相应的私有密钥。

    如果您不打算保持您的 Enclave 运行,或者您不想依赖于 Enclave 内存中的私有密钥的持久性,您应该包含带有加密数据的 CiphertextBlob 对象。要解密此数据密钥副本,您必须将其发送到 Decrypt (kms-decrypt) 请求中的 Amazon KMS。

    您还可以将 CiphertextBlob 对象传递到不同的 Enclave,然后通过在 Amazon Nitro Enclaves 开发工具包中的调用 kms-decrypt (Decrypt) 操作来对其进行解密。此请求将包含带有新公有密钥的新 Enclave 的证明文档。Amazon KMS 将解密在 Amazon KMS 密钥下加密的数据密钥,然后在新 Enclave 的公有密钥下重新加密它。此数据密钥只能使用新 Enclave 中的相应私有密钥进行解密。

GenerateRandom

要从 Enclave 中调用 GenerateDataKey 操作,请在 Amazon Nitro Enclaves 开发工具包中使用 kms-generate-random 操作。

生成随机字节字符串后,GenerateRandom 操作将使用证明文档中的公有密钥和指定的加密算法对随机字节字符串进行加密。它将在 CiphertextForRecipient 字段中返回加密的字节字符串。响应中的 Plaintext 字段为 null。