

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

# 在中使用可信密钥 AWS CloudHSM
<a name="manage-keys-using-trusted-keys"></a>

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

**Topics**
+ [了解可信密钥](understand-trusted-key-wraps.md)
+ [可信密钥属性](key_attribute_background.md)
+ [如何使用可信密钥来包装数据密钥](wrap_keys_using_trusted.md)
+ [如何使用可信密钥解包数据密钥](unwrap_keys_using_trusted.md)

# 了解中的可信密钥 AWS CloudHSM
<a name="understand-trusted-key-wraps"></a>

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

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

# 中的可信密钥属性 AWS CloudHSM
<a name="key_attribute_background"></a>

以下属性允许您将 AWS CloudHSM 密钥标记为可信，指定数据密钥只能使用可信密钥进行封装和解包，以及控制数据密钥解封后可以执行的操作：
+ `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` 中的值与应用程序在解包请求时提供的属性相冲突，则解包请求会失败。

了解有关属性的更多信息，请参阅以下主题：
+ [PKCS \$111 密钥属性](pkcs11-attributes.md)
+ [JCE 密钥属性](java-lib-attributes_5.md)
+ [CloudHSM CLI 密钥属性](cloudhsm_cli-key-attributes.md)

# 如何使用可信密钥来封装数据密钥 AWS CloudHSM
<a name="wrap_keys_using_trusted"></a>

要使用可信密钥封装数据密钥 AWS CloudHSM，必须完成三个基本步骤：

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

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

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

## 步骤 1：将数据密钥的 `CKA_WRAP_WITH_TRUSTED` 设置为“true”
<a name="w2aac15c19c11b7"></a>

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

### 选项 1：如果生成新密钥，则设置 `CKA_WRAP_WITH_TRUSTED` 为“true”
<a name="w2aac15c19c11b7b5"></a>

使用 [PKCS \$111](pkcs11-library.md)、[JCE](java-library.md) 或 [CloudHSM CLI](cloudhsm_cli.md) 生成密钥。了解更多详细信息，请参阅以下内容。

------
#### [ PKCS \$111 ]

要使用 PKCS \$111 生成密钥，您需要将密钥的 `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 \$111 生成密钥的公开示例](https://github.com/aws-samples/aws-cloudhsm-pkcs11-examples/tree/master/src/generate)。

------
#### [ 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 生成密钥的公开示例](https://docs.aws.amazon.com/cloudhsm/latest/userguide/java-samples.html#java-samples-code_5)。

------
#### [ 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`。

有关密钥对生成的更多信息，请参阅 [CloudHSM CLI 中的 generate-asymmetric-pair类别](cloudhsm_cli-key-generate-asymmetric-pair.md)。

有关生成对称密钥的更多信息，请参阅 [CloudHSM CLI 中的 generate-symmetric 类别](cloudhsm_cli-key-generate-symmetric.md)。

------

### 选项 2：如果使用现有密钥，请使用 CloudHSM CLI 将它的 `CKA_WRAP_WITH_TRUSTED` 设置为“true”
<a name="w2aac15c19c11b7b7"></a>

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

1. 使用 [使用 CloudHSM CLI 登录 HSM](cloudhsm_cli-login.md) 命令以加密用户（CU）身份登录。

1. 使用 [使用 CloudHSM CLI 设置密钥的属性](cloudhsm_cli-key-set-attribute.md) 命令将密钥的 `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”
<a name="w2aac15c19c11b9"></a>

要使密钥成为可信密钥，必须将其 `CKA_TRUSTED` 属性设置为“true”。您可以使用 CloudHSM CLI 或 CloudHSM 管理实用程序 (CMU, CloudHSM Management Utility) 来执行此操作。
+ 如果使用 CloudHSM CLI 来设置密钥的 `CKA_TRUSTED` 属性，请参阅 [使用 CloudHSM CLI 将密钥标记为可信](manage-keys-cloudhsm-cli-trusted.md)。
+ 如果使用 CMU 来设置密钥的 `CKA_TRUSTED` 属性，请参阅 [如何使用 AWS CloudHSM 管理实用程序将密钥标记为可信](cloudhsm_using_trusted_keys_control_key_wrap.md)。

## 步骤 3：使用可信密钥包装数据密钥
<a name="w2aac15c19c11c11"></a>

要对步骤 1 中引用的数据密钥与您在步骤 2 中设置的可信密钥进行包装，请参阅以下链接以获取代码示例。每个都演示了如何包装密钥。
+ [AWS CloudHSM PKCS \$111 示例](https://github.com/aws-samples/aws-cloudhsm-pkcs11-examples/tree/master/src/wrapping)
+ [AWS CloudHSM JCE 示例](https://github.com/aws-samples/aws-cloudhsm-jce-examples/tree/sdk5/src/main/java/com/amazonaws/cloudhsm/examples)

# 如何使用可信密钥解封数据密钥 AWS CloudHSM
<a name="unwrap_keys_using_trusted"></a>

要解开数据密钥 AWS CloudHSM，您需要一个`CKA_UNWRAP`设置为 true 的可信密钥。要成为这样的密钥，还必须满足以下标准：
+ 密钥的 `CKA_TRUSTED` 属性必须设置为“true”。
+ 密钥必须使用 `CKA_UNWRAP_TEMPLATE` 和相关属性来指定数据密钥解包后可以执行的操作。例如，如果您希望未解包的密钥不可导出，则可以将 `CKA_EXPORTABLE = FALSE` 设置为 `CKA_UNWRAP_TEMPLATE` 的一部分。

**注意**  
`CKA_UNWRAP_TEMPLATE` 仅在 PKCS \$111 中可用。

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

要查看使用可信密钥解包数据密钥的示例，请参阅[此 PKCS \$111 示例](https://github.com/aws-samples/aws-cloudhsm-pkcs11-examples/blob/master/src/wrapping/unwrap_with_template.c)。