在中使用可信密钥 AWS CloudHSM - AWS CloudHSM

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在中使用可信密钥 AWS CloudHSM

AWS CloudHSM 支持可信密钥封装,以保护数据密钥免受内部威胁。本主题介绍如何创建可信密钥以确保数据安全。

了解可信密钥

可信密钥是用于包装其他密钥的密钥,管理员和加密员(CO, cryptographic officer)使用属性 CKA_TRUSTED 特意将其标识为可信。此外,管理员和加密员(CO, cryptographic officer)使用 CKA_UNWRAP_TEMPLATE 和相关属性来指定数据密钥在被可信密钥解包后可以执行的操作。由可信密钥解包的数据密钥还必须包含这些属性,解包操作才能成功,这有助于确保解包的数据密钥仅允许用于您想要的用途。

使用该 CKA_WRAP_WITH_TRUSTED 属性来标识要用可信密钥包装的所有数据密钥。这样做可以限制数据密钥,这样一来应用程序只能使用可信密钥来解包它们。一旦在数据密钥上设置了该属性,该属性就会变成只读,无法更改。有了这些属性后,应用程序只能使用您信任的密钥来解包您的数据密钥,而解包总是会产生带有限制这些密钥使用方式的属性的数据密钥。

可信密钥属性

以下属性允许您将密钥标记为可信,指定数据密钥只能使用可信密钥进行包装和解包以及控制数据密钥解包后可以执行的操作:

  • CKA_TRUSTED:将此属性(除 CKA_UNWRAP_TEMPLATE 外)应用于将包装数据密钥的密钥,以指定已完成必要调查的管理员或加密员(CO, crypto officer)并信任此密钥。只有管理员或 CO 可以设置 CKA_TRUSTED。加密用户(CU)拥有密钥,但只有 CO 可以设置其 CKA_TRUSTED 属性。

  • CKA_WRAP_WITH_TRUSTED:将此属性应用于可导出数据密钥,以指定只能用标记为 CKA_TRUSTED 的密钥来包装此密钥。将 CKA_WRAP_WITH_TRUSTED 设置为 true 后,该属性将变为只读,并且您无法更改或移除该属性。

  • CKA_UNWRAP_TEMPLATE:将此属性应用于包装密钥(除 CKA_TRUSTED 外),以指定服务必须自动将哪些属性名称和值应用于服务解包的数据密钥。应用程序提交密钥供解包时,也可以提供自己的解包模板。如果您指定了解包模板并且应用程序提供了自己的解包模板,则 HSM 会使用这两个模板将属性名称和值应用于密钥。但是,如果包装密钥的 CKA_UNWRAP_TEMPLATE 中的值与应用程序在解包请求时提供的属性相冲突,则解包请求会失败。

了解有关属性的更多信息,请参阅以下主题:

如何使用可信密钥来包装数据密钥

要使用可信密钥包装数据密钥,必须完成三个基本步骤:

  1. 对于计划使用可信密钥包装的数据密钥,请将其 CKA_WRAP_WITH_TRUSTED 属性设置为“true”。

  2. 对于计划用其包装数据密钥的可信密钥,请将其 CKA_TRUSTED 属性设置为“true”。

  3. 使用可信密钥包装数据密钥。

步骤 1:将数据密钥的 CKA_WRAP_WITH_TRUSTED 设置为“true”

对于要包装的数据密钥,请选择以下选项之一,将密钥的 CKA_WRAP_WITH_TRUSTED 属性设置为“true”。这样做可以限制数据密钥,因此应用程序只能使用可信密钥来解包它数据密钥。

选项 1:如果生成新密钥,则设置 CKA_WRAP_WITH_TRUSTED 为“true”

使用 PKCS #11JCECloudHSM CLI 生成密钥。了解更多详细信息,请参阅以下内容。

PKCS #11

要使用 PKCS #11 生成密钥,您需要将密钥的 CKA_WRAP_WITH_TRUSTED 属性设置为“true”。如以下示例所示,通过在密钥的 CK_ATTRIBUTE template 中包含此属性,然后将该属性设置为“true”来执行此操作:

CK_BYTE_PTR label = "test_key"; CK_ATTRIBUTE template[] = { {CKA_WRAP_WITH_TRUSTED, &true_val, sizeof(CK_BBOOL)}, {CKA_LABEL, label, strlen(label)}, ... };

有关更多信息,请参阅我们演示使用 PKCS #11 生成密钥的公开示例

JCE

要使用 JCE 生成密钥,您需要将密钥的 WRAP_WITH_TRUSTED 属性设置为“true”。如以下示例所示,通过在密钥的 KeyAttributesMap 中包含此属性,然后将该属性设置为“true”来执行此操作:

final String label = "test_key"; final KeyAttributesMap keySpec = new KeyAttributesMap(); keySpec.put(KeyAttribute.WRAP_WITH_TRUSTED, true); keySpec.put(KeyAttribute.LABEL, label); ...

有关更多信息,请参阅我们演示使用 JCE 生成密钥的公开示例

CloudHSM CLI

要使用 CloudHSM CLI 生成密钥,您需要将密钥的 wrap-with-trusted 属性设置为“true”。方法是在密钥生成命令的相应参数中加入 wrap-with-trusted=true

  • 对于对称密钥,请在 attributes 参数中添加 wrap-with-trusted

  • 对于公有密钥,请在 public-attributes 参数中添加 wrap-with-trusted

  • 对于私有密钥,请在 private-attributes 参数中添加 wrap-with-trusted

有关密钥对生成的更多信息,请参阅 钥匙 generate-asymmetric-pair

有关生成对称密钥的更多信息,请参阅 key generate-symmetric

选项 2:如果使用现有密钥,请使用 CloudHSM CLI 将它的 CKA_WRAP_WITH_TRUSTED 设置为“true”

要将现有密钥的 CKA_WRAP_WITH_TRUSTED 属性设置为“true”,请执行以下步骤:

  1. 使用 login 命令以加密用户(CU)身份登录。

  2. 使用 key set-attribute 命令将密钥的 wrap-with-trusted 属性设置为“true”。

    aws-cloudhsm > key set-attribute --filter attr.label=test_key --name wrap-with-trusted --value true { "error_code": 0, "data": { "message": "Attribute set successfully" } }

步骤 2:将可信密钥的 CKA_TRUSTED 设置为“true”

要使密钥成为可信密钥,必须将其 CKA_TRUSTED 属性设置为“true”。您可以使用 CloudHSM CLI 或 CloudHSM 管理实用程序 (CMU, CloudHSM Management Utility) 来执行此操作。

第 3 步。使用可信密钥包装数据密钥

要对步骤 1 中引用的数据密钥与您在步骤 2 中设置的可信密钥进行包装,请参阅以下链接以获取代码示例。每个都演示了如何包装密钥。

如何使用可信密钥解包数据密钥

要解包数据密钥,您需要一个已将 CKA_UNWRAP 设置为“true”的可信密钥。要成为这样的密钥,还必须满足以下标准:

  • 密钥的 CKA_TRUSTED 属性必须设置为“true”。

  • 密钥必须使用 CKA_UNWRAP_TEMPLATE 和相关属性来指定数据密钥解包后可以执行的操作。例如,如果您希望未解包的密钥不可导出,则可以将 CKA_EXPORTABLE = FALSE 设置为 CKA_UNWRAP_TEMPLATE 的一部分。

注意

CKA_UNWRAP_TEMPLATE 仅在 PKCS #11 中可用。

当应用程序提交要解包的密钥时,该应用程序还可提供自己的解包模板。如果您指定了解包模板并且应用程序提供了自己的解包模板,则 HSM 会使用这两个模板将属性名称和值应用于密钥。但是,如果在解包请求期间,可信密钥的 CKA_UNWRAP_TEMPLATE 中的值与应用程序提供的属性冲突,则解包请求将失败。

要查看使用可信密钥解包数据密钥的示例,请参阅此 PKCS #11 示例