

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

# 对自定义密钥存储进行故障排除
<a name="fix-keystore"></a>

AWS CloudHSM 密钥存储库旨在提供可用性和弹性。但是，为了保持 AWS CloudHSM 密钥库的正常运行，可能需要修复一些错误情况。

**Topics**
+ [如何修复不可用的 KMS 密钥](#fix-unavailable-cmks)
+ [如何修复失败的 KMS 密钥](#fix-cmk-failed)
+ [如何修复连接故障](#fix-keystore-failed)
+ [如何响应加密操作失败](#fix-keystore-communication)
+ [如何修复无效的 `kmsuser` 凭证](#fix-keystore-password)
+ [如何删除孤立密钥材料](#fix-keystore-orphaned-key)
+ [如何恢复 KMS 密钥的已删除密钥材料](#fix-keystore-recover-backing-key)
+ [如何以 `kmsuser` 身份登录](#fix-login-as-kmsuser)

## 如何修复不可用的 KMS 密钥
<a name="fix-unavailable-cmks"></a>

密[钥库 AWS KMS keys 中的密 AWS CloudHSM 钥状态](key-state.md)通常为`Enabled`。与所有 KMS 密钥一样，当您在密钥存储中禁用 KMS 密钥或安排将其删除时，密钥状态会发生变化。 AWS CloudHSM 但是，与其他 KMS 密钥不同，自定义密钥存储中的 KMS 密钥还可具有[密钥状态](key-state.md) `Unavailable`。

密钥状态 `Unavailable` 表示 KMS 密钥位于被故意[断开连接](disconnect-keystore.md)的自定义密钥存储中，并且尝试重新连接该集群（如果有）失败。当某个 KMS 密钥不可用时，您可以查看和管理该 KMS 密钥，但不能将其用于[加密操作](manage-cmk-keystore.md#use-cmk-keystore)。

要查找 KMS 密钥的密钥状态，请在 **Customer managed keys**（客户托管密钥）页面上，查看 KMS 密钥的 **Status**（状态）字段。或者，使用[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)操作并查看响应中的`KeyState`元素。有关更多信息，请参阅 [识别和查看密钥](viewing-keys.md)。

已断开的自定义密钥存储中的 KMS 密钥的密钥状态将为 `Unavailable` 或 `PendingDeletion`。计划从自定义密钥存储中删除的 KMS 密钥的密钥状态为 `Pending Deletion`，即使自定义密钥存储已断开连接也是如此。这使您可以取消计划的密钥删除而无需重新连接自定义密钥存储。

要修复不可用的 KMS 密钥，请[重新连接自定义密钥存储](disconnect-keystore.md)。重新连接自定义密钥存储后，自定义密钥存储中的 KMS 密钥的密钥状态将自动还原到之前的状态，例如 `Enabled` 或 `Disabled`。待删除的 KMS 密钥将保持 `PendingDeletion` 状态。但是，当问题仍然存在时，[启用和禁用不可用的 KMS 密钥](enabling-keys.md)不会更改其密钥状态。仅当密钥变得可用时，启用或禁用操作才会生效。

如需帮助解决失败的连接，请参阅[如何修复连接故障](#fix-keystore-failed)。

## 如何修复失败的 KMS 密钥
<a name="fix-cmk-failed"></a>

在密钥存储中 AWS CloudHSM 创建和使用 KMS 密钥时出现问题可能是由于您的密 AWS CloudHSM 钥存储库、其关联的 AWS CloudHSM 集群、KMS 密钥或其密钥材料出现问题所致。

当 AWS CloudHSM 密钥存储与其 AWS CloudHSM 集群断开连接时，自定义密钥存储中 KMS 密钥的密钥状态为`Unavailable`。所有在已断开连接的密钥存储中创建 KMS AWS CloudHSM 密钥的请求都会返回`CustomKeyStoreInvalidStateException`异常。所有加密、解密、重新加密或生成数据密钥的请求都将返回 `KMSInvalidStateException` 异常。要修复此问题，[请重新连接 AWS CloudHSM 密钥库](connect-keystore.md)。

但是，即使密钥存储库中的密钥状态为`Enabled`且 AWS CloudHSM 密钥存储的连接状态为，您尝试使用密钥存储库中的 KMS 密 AWS CloudHSM 钥进行[加密操作](manage-cmk-keystore.md#use-cmk-keystore)也`Connected`可能会失败。这可能由以下任一情况导致。
+ KMS 密钥的密钥材料可能已从关联的 AWS CloudHSM 集群中删除。要进行调查，请[查找 KMS 密钥的密钥材料的密钥 ID](find-handle-for-cmk-id.md)，并在必要时尝试[恢复密钥材料](#fix-keystore-recover-backing-key)。
+ 所有 HSMs 内容均已从与 AWS CloudHSM 密钥库关联的 AWS CloudHSM 集群中删除。要在加密操作中使用密 AWS CloudHSM 钥存储中的 KMS 密钥，其 AWS CloudHSM 集群必须包含至少一个活动的 HSM。要验证 AWS CloudHSM 集群 HSMs 中的数量和状态，[请使用 AWS CloudHSM 控制台](https://docs.aws.amazon.com/cloudhsm/latest/userguide/add-remove-hsm.html)或[DescribeClusters](https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html)操作。要向集群添加 HSM，请使用 AWS CloudHSM 控制台或[CreateHsm](https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_CreateHsm.html)操作。
+ 与 AWS CloudHSM 密钥库关联的 AWS CloudHSM 集群已删除。要修复该问题，请[从与原始集群相关的备份创建一个集群](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-cluster-from-backup.html)，例如原始集群的备份或用于创建原始集群的备份。然后，在自定义密钥存储设置中[编辑集群 ID](update-keystore.md)。有关说明，请参阅[如何恢复 KMS 密钥的已删除密钥材料](#fix-keystore-recover-backing-key)。
+ 与自定义密钥库关联的 AWS CloudHSM 集群没有任何可用的 PKCS \$111 会话。这种情况通常发生在高突发流量期间，此时需要额外的会话来服务流量。要响应带有关 PKCS \$111 会话的错误消息的 `KMSInternalException`，请退后并重试该请求。

## 如何修复连接故障
<a name="fix-keystore-failed"></a>

如果您尝试将[AWS CloudHSM 密钥库连接到](connect-keystore.md)其 AWS CloudHSM 集群，但操作失败，则 AWS CloudHSM 密钥库的连接状态将更改为`FAILED`。要查找 AWS CloudHSM 密钥库的连接状态，请使用 AWS KMS 控制台或[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html)操作。

另外，由于容易检测到集群配置错误，一些连接尝试会很快失败。在这种情况下，连接状态仍为 `DISCONNECTED`。这些失败将返回错误消息或[例外](https://docs.aws.amazon.com/kms/latest/APIReference/API_ConnectCustomKeyStore.html#API_ConnectCustomKeyStore_Errors)来说明尝试失败的原因。查看异常描述和[集群要求](create-keystore.md#before-keystore)，修复问题，必要时[更新 AWS CloudHSM 密钥库](update-keystore.md)，然后尝试重新连接。

当连接状态为时`FAILED`，运行[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html)操作并查看响应中的`ConnectionErrorCode`元素。

**注意**  
当 AWS CloudHSM 密钥库的连接状态为时`FAILED`，必须先[断开 AWS CloudHSM 密钥库的连接](disconnect-keystore.md)，然后才能尝试重新连接。您无法将密 AWS CloudHSM 钥库与`FAILED`连接状态相连接。
+ `CLUSTER_NOT_FOUND`表示找 AWS KMS 不到具有指定 AWS CloudHSM 集群 ID 的集群。这可能是因为向 API 操作提供了错误的集群 ID，或者集群被删除而不是被替换。要修复此错误，请验证集群 ID，例如使用 AWS CloudHSM 控制台或[DescribeClusters](https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html)操作。如果集群已被删除，请[从源的最新备份创建一个集群](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-cluster-from-backup.html)。然后，[断开 AWS CloudHSM 密钥存储](disconnect-keystore.md)的连接，[编辑 AWS CloudHSM 密钥库](update-keystore.md)集群 ID 设置，然后将[AWS CloudHSM 密钥库重新连接到](connect-keystore.md)集群。
+ `INSUFFICIENT_CLOUDHSM_HSMS`表示关联的 AWS CloudHSM 群集不包含任何群集 HSMs。要连接，集群必须至少具有一个 HSM。要查找集群 HSMs 中的数量，请使用[DescribeClusters](https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html)操作。要解决此错误，请[添加至少一个 HSM](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-hsm.html) 到集群。如果您添加多个 HSMs，最好在不同的可用区中创建它们。
+ `INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET`表示 AWS KMS 无法将 AWS CloudHSM 密钥库连接到其 AWS CloudHSM 集群，因为至少有一个[与该集群关联的私有子网](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-subnets.html)没有任何可用的 IP 地址。 AWS CloudHSM 密钥库连接需要在每个关联的私有子网中有一个空闲的 IP 地址，但最好使用两个。

  您[无法将 IP 地址](https://aws.amazon.com/premiumsupport/knowledge-center/vpc-ip-address-range/)（CIDR 块）添加到现有子网。如有可能，请移动或删除在子网中使用 IP 地址的其他资源，例如未使用的 EC2 实例或弹性网络接口。否则，您可以使用[具有[更多可用地址空间](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-sizing)的新私有子网或现有私有子网使用 AWS CloudHSM 群集的最新备份创建](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-cluster-from-backup.html)集群。然后，要将新集群与您的 AWS CloudHSM 密钥存储关联，[请断开自定义密钥存储](disconnect-keystore.md)的连接，将 AWS CloudHSM 密钥存储的[集群 ID 更改](update-keystore.md)为新集群的 ID，然后尝试重新连接。
**提示**  
为避免[重置`kmsuser`密码](#fix-keystore-password)，请使用 AWS CloudHSM 群集的最新备份。
+ `INTERNAL_ERROR`表示由于内部错误而 AWS KMS 无法完成请求。重试请求。对于`ConnectCustomKeyStore`请求，请先断开 AWS CloudHSM 密钥库的连接，然后再尝试重新连接。
+ `INVALID_CREDENTIALS`表示 AWS KMS 无法登录关联的 AWS CloudHSM 集群，因为其`kmsuser`账户密码不正确。如需帮助解决此错误，请参阅[如何修复无效的 `kmsuser` 凭证](#fix-keystore-password)。
+ `NETWORK_ERRORS` 通常表示暂时性网络问题。[断开 AWS CloudHSM 密钥库](disconnect-keystore.md)的连接，等待几分钟，然后再次尝试连接。
+ `SUBNET_NOT_FOUND`表示 AWS CloudHSM 群集配置中至少有一个子网已被删除。如果在群集配置中找 AWS KMS 不到所有子网，则尝试将 AWS CloudHSM 密钥库连接到 AWS CloudHSM 集群失败。

  要修复此错误[，请使用同一集群的最新备份创建](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-cluster-from-backup.html) AWS CloudHSM 集群。（此过程使用 VPC 和私有子网创建新的集群配置。） 验证新集群是否满足[自定义密钥存储的要求](create-keystore.md#before-keystore)，并记下新集群 ID。然后，要将新集群与您的 AWS CloudHSM 密钥存储关联，[请断开自定义密钥存储](disconnect-keystore.md)的连接，将 AWS CloudHSM 密钥存储的[集群 ID 更改](update-keystore.md)为新集群的 ID，然后尝试重新连接。
**提示**  
为避免[重置`kmsuser`密码](#fix-keystore-password)，请使用 AWS CloudHSM 群集的最新备份。
+ `USER_LOCKED_OUT` 表示 [`kmsuser` 加密用户 (CU) 账户](keystore-cloudhsm.md#concept-kmsuser)无法访问关联的 AWS CloudHSM 集群，因为失败的密码尝试过多。如需帮助解决此错误，请参阅[如何修复无效的 `kmsuser` 凭证](#fix-keystore-password)。

  要修复此错误，[请断开 AWS CloudHSM 密钥存储的连接](disconnect-keystore.md)，然后在 CloudHSM CLI 中使用[https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html)命令来更改帐户密码。`kmsuser`然后，[编辑自定义密钥存储的 `kmsuser` 密码设置](update-keystore.md)并重试连接。如需帮助，请使用[如何修复无效的 `kmsuser` 凭证](#fix-keystore-password)主题中所述的过程。
+ `USER_LOGGED_IN`表示 `kmsuser` CU 账户已登录到关联的 AWS CloudHSM 集群。这样可以 AWS KMS 防止轮换`kmsuser`账户密码和登录集群。要修复此错误，请从集群中注销 `kmsuser` CU。如果您更改了登录集群的`kmsuser`密码，则还必须更新密钥库的密 AWS CloudHSM 钥库密码值。有关帮助信息，请参阅 [如何注销并重新连接](#login-kmsuser-2)。
+ `USER_NOT_FOUND`表示在关联的 AWS CloudHSM 集群中找 AWS KMS 不到 `kmsuser` CU 账户。要修复此错误，[请在集群中创建一个 `kmsuser` CU 账户](create-keystore.md#kmsuser-concept)，然后[更新密钥库的 AWS CloudHSM 密钥库密码值](update-keystore.md)。有关帮助信息，请参阅 [如何修复无效的 `kmsuser` 凭证](#fix-keystore-password)。

## 如何响应加密操作失败
<a name="fix-keystore-communication"></a>

在自定义密钥存储中使用 KMS 密钥的加密操作可能会失败，并显示 `KMSInvalidStateException`。以下错误消息可能附带 `KMSInvalidStateException`。


|  | 
| --- |
| KMS 无法与您的 CloudHSM 集群进行通信。这可能是暂时的网络问题。如果您反复看到此错误，请验证 AWS CloudHSM 集群 VPC 的网络 ACLs 和安全组规则是否正确。 | 
+ 虽然它是 HTTPS 400 错误，但它可能是由于暂时的网络问题引起的。要进行响应，首先重试请求。但是，如果继续失败，请检查网络组件的配置。此错误很可能是由于网络组件（例如阻止传出流量的防火墙规则或 VPC 安全组规则）的错误配置引起的。例如，KMS 无法通过 AWS CloudHSM 集群进行通信 IPv6。有关先决条件的详细信息，请参阅[创建密 AWS CloudHSM 钥库](create-keystore.md)。


|  | 
| --- |
| KMS 无法与您的 AWS CloudHSM 集群通信，因为 kmsuser 已被锁定。如果您反复看到此错误，请断开 AWS CloudHSM 密钥存储并重置 kmsuser 帐户密码。更新自定义密钥存储的 kmsuser 密码，然后重试请求。 | 
+ 此错误消息表示 [`kmsuser` 加密用户（CU）账户](keystore-cloudhsm.md#concept-kmsuser)无法访问关联的 AWS CloudHSM 集群，因为失败的密码尝试过多。如需帮助解决此错误，请参阅[如何断开和登录](#login-kmsuser-1)。

## 如何修复无效的 `kmsuser` 凭证
<a name="fix-keystore-password"></a>

[连接 AWS CloudHSM 密钥库](connect-keystore.md)时，以[`kmsuser`加密用户](keystore-cloudhsm.md#concept-kmsuser) (CU) 的身份 AWS KMS 登录到关联的 AWS CloudHSM 集群。它会一直保持登录状态，直到 AWS CloudHSM 密钥存储断开连接。[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html) 响应显示 `ConnectionState` 值 `FAILED` 以及 `ConnectionErrorCode` 值 `INVALID_CREDENTIALS`，如以下示例中所示。

如果您断开 AWS CloudHSM 密钥存储的连接并更改了`kmsuser`密码，则 AWS KMS 无法使用 `kmsuser` CU 账户的凭据登录 AWS CloudHSM 集群。因此，所有连接 AWS CloudHSM 密钥库的尝试都失败了。`DescribeCustomKeyStores` 响应显示 `ConnectionState` 值 `FAILED` 以及 `ConnectionErrorCode` 值 `INVALID_CREDENTIALS`，如以下示例中所示。

```
$ aws kms describe-custom-key-stores --custom-key-store-name ExampleKeyStore
{
   "CustomKeyStores": [
      "CloudHsmClusterId": "cluster-1a23b4cdefg",
      "ConnectionErrorCode": "INVALID_CREDENTIALS"
      "CustomKeyStoreId": "cks-1234567890abcdef0",
      "CustomKeyStoreName": "ExampleKeyStore",
      "TrustAnchorCertificate": "<certificate string appears here>",
      "CreationDate": "1.499288695918E9",
      "ConnectionState": "FAILED"
   ],
}
```

此外，在使用不正确的密码登录到集群的尝试失败五次后， AWS CloudHSM 将锁定用户账户。要登录到集群，您必须更改账户密码。

如果在尝试以 `kmsuser` CU 身份登录集群时 AWS KMS 收到锁定响应，则连接 AWS CloudHSM 密钥库的请求将失败。[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html)响应中包含`ConnectionState`的`ConnectionErrorCode`值为`FAILED`，值为`USER_LOCKED_OUT`，如以下示例所示。

```
$ aws kms describe-custom-key-stores --custom-key-store-name ExampleKeyStore
{
   "CustomKeyStores": [
      "CloudHsmClusterId": "cluster-1a23b4cdefg",
      "ConnectionErrorCode": "USER_LOCKED_OUT"
      "CustomKeyStoreId": "cks-1234567890abcdef0",
      "CustomKeyStoreName": "ExampleKeyStore",
      "TrustAnchorCertificate": "<certificate string appears here>",
      "CreationDate": "1.499288695918E9",
      "ConnectionState": "FAILED"
   ],
}
```

要修复上述任一状况，请使用以下过程。

1. [断开 AWS CloudHSM 密钥库的](disconnect-keystore.md)连接。

1. 运行[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html)操作并查看响应中`ConnectionErrorCode`元素的值。
   + 如果 `ConnectionErrorCode` 值为 `INVALID_CREDENTIALS`，请确定 `kmsuser` 账户的当前密码。必要时，请使用 CloudHSM CLI 中的 [https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html) 命令将密码设置为已知值。
   + 如果 `ConnectionErrorCode` 值是 `USER_LOCKED_OUT`，您必须使用 CloudHSM CLI 中的 [https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html) 命令更改 `kmsuser` 密码。

1. [编辑 `kmsuser` 密码设置](update-keystore.md)，使其与当前集群中的 `kmsuser` 密码匹配。此操作将告知 AWS KMS 要用来登录到集群的密码。它不会更改集群中的 `kmsuser` 密码。

1. [连接自定义密钥存储](connect-keystore.md)。

## 如何删除孤立密钥材料
<a name="fix-keystore-orphaned-key"></a>

计划从密钥库中删除 KMS AWS CloudHSM 密钥后，您可能需要从关联的 AWS CloudHSM 集群中手动删除相应的密钥材料。

在密钥存储中创建 KMS AWS CloudHSM 密钥时， AWS KMS 会在中创建 KMS 密钥元数据， AWS KMS 并在关联的 AWS CloudHSM 集群中生成密钥材料。当您计划删除密钥存储中的 KMS 密 AWS CloudHSM 钥时，等待期过后， AWS KMS 会删除 KMS 密钥元数据。然后 AWS KMS 尽最大努力从 AWS CloudHSM 集群中删除相应的密钥材料。如果 AWS KMS 无法访问集群，例如当集群与 AWS CloudHSM 密钥库断开连接或`kmsuser`密码更改时，尝试可能会失败。 AWS KMS 不会尝试从群集备份中删除密钥材料。

AWS KMS 在 AWS CloudTrail 日志`DeleteKey`的事件条目中报告其尝试从集群中删除密钥材料的结果。它会在 `additionalEventData` 元素的 `backingKeysDeletionStatus` 元素中显示，如以下示例条目所示。该条目还包括 KMS 密钥 ARN、 AWS CloudHSM 集群 ID 和密钥材料的 ID (`backing-key-id`)。

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "accountId": "111122223333",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2021-12-10T14:23:51Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "DeleteKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": null,
    "responseElements":  {
        "keyId":"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    },
    "additionalEventData": {
        "customKeyStoreId": "cks-1234567890abcdef0",
        "clusterId": "cluster-1a23b4cdefg",
        "backingKeys": "[{\"backingKeyId\":\"backing-key-id\"}]",
        "backingKeysDeletionStatus": "[{\"backingKeyId\":\"backing-key-id\",\"deletionStatus\":\"FAILURE\"}]"
    },
    "eventID": "c21f1f47-f52b-4ffe-bff0-6d994403cf40",
    "readOnly": false,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:eu-west-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ],
    "eventType": "AwsServiceEvent",
    "recipientAccountId": "111122223333",
    "managementEvent": true,
    "eventCategory": "Management"
}
```

**注意**  
以下过程使用 AWS CloudHSM 客户端 SDK 5 命令行工具 [CloudHSM C](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli.html) LI。CloudHSM CLI 将 `key-handle` 替换为 `key-reference`。  
2025 年 1 月 1 日， AWS CloudHSM 将终止对客户端 SDK 3 命令行工具、CloudHSM 管理实用程序 (CMU) 和密钥管理实用程序 (KMU) 的支持。有关客户端 SDK 3 命令行工具和客户端 SDK 5 命令行工具之间区别的更多信息，请参阅《AWS CloudHSM 用户指南》**中的[从客户端 SDK 3 CMU 和 KMU 迁移到客户端 SDK 5 CloudHSM CLI](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-migrate-from-kmu-cmu.html)。

以下过程演示如何从关联的 AWS CloudHSM 集群中删除孤立的密钥材料。

1. 如果 AWS CloudHSM 密钥库尚未断开连接，请断开密钥库的连接，然后[https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-login.html](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-login.html)，如中所述[如何断开和登录](#login-kmsuser-1)。
**注意**  
虽然自定义密钥存储已断开连接，但在自定义密钥存储中创建 KMS 密钥或在加密操作中使用现有 KMS 密钥的所有尝试都将失败。此操作可以阻止用户存储和访问敏感数据。

1. 使用 CloudHSM CLI 中的密[钥删除](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-key-delete.html)命令 HSMs 从集群中删除密钥。

   密钥存储中使用 KMS 密钥进行加密操作的所有 CloudTrail 日志条目都包含一个带有`customKeyStoreId`和`backingKey`的`additionalEventData`字段。 AWS CloudHSM `backingKeyId` 字段中返回的值是 CloudHSM 密钥 `id` 属性。我们建议通过筛选**密钥删除**操作`id`来删除您在 CloudTrail 日志中标识的孤立密钥材料。

   AWS CloudHSM 将该`backingKeyId`值识别为十六进制值。要按 `id` 筛选，必须在 `backingKeyId` 前面加上 `Ox`。例如，如果 CloudTrail 日志`backingKeyId`中的是`1a2b3c45678abcdef`，则可以按此进行筛选`0x1a2b3c45678abcdef`。

   以下示例从您的集群 HSMs 中删除密钥。已`backing-key-id`在 CloudTrail 日志条目中列出。在运行此命令之前，请将示例 `backing-key-id` 替换为您账户中的有效密钥 ID。

   ```
   aws-cloudhsm key delete --filter attr.id="0x<backing-key-id>"
   {
     "error_code": 0,
     "data": {
       "message": "Key deleted successfully"
     }
   }
   ```

1. 注销并重新连接 AWS CloudHSM 密钥库，如中所述。[如何注销并重新连接](#login-kmsuser-2)

## 如何恢复 KMS 密钥的已删除密钥材料
<a name="fix-keystore-recover-backing-key"></a>

如果删除的密钥材料，则 KMS 密钥将无法使用，并且无法解密在 KMS 密钥下加密的所有密文。 AWS KMS key 如果从关联的 AWS CloudHSM 集群中删除密钥存储区中 KMS AWS CloudHSM 密钥的密钥材料，则可能会发生这种情况。但是，可以恢复该密钥材料。

在密钥存储中创建 AWS KMS key （KMS AWS CloudHSM 密钥）时， AWS KMS 登录到关联的 AWS CloudHSM 集群并为 KMS 密钥创建密钥材料。它还会将密码更改为只有它知道的值，并且只要 AWS CloudHSM 密钥库已连接，它就会保持登录状态。由于只有密钥所有者（即创建密钥的 CU）才能删除密钥，因此不太可能 HSMs 意外删除密钥。

但是，如果从集群 HSMs 中删除 KMS 密钥的密钥材料，KMS 密钥的密钥状态最终会更改为`UNAVAILABLE`。如果您尝试使用 KMS 密钥进行加密操作，该操作将失败并出现 `KMSInvalidStateException` 异常。最重要的是，在 KMS 密钥下加密的任何数据都无法解密。

在某些情况下，您可以通过[从包含密钥材料的备份创建集群](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-cluster-from-backup.html)来恢复已删除的密钥材料。仅当在密钥存在且未被删除的情况下创建了一个备份时，此策略才有效。

使用以下过程恢复密钥材料。

1. 查找包含密钥材料的集群备份。备份还必须包含支持集群及其加密数据所需的所有用户和密钥。

   使用[DescribeBackups](https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeBackups.html)操作列出集群的备份。然后，使用备份时间戳帮助您选择一个备份。要将输出限制为与 AWS CloudHSM 密钥库关联的集群，请使用`Filters`参数，如以下示例所示。

   ```
   $ aws cloudhsmv2 describe-backups --filters clusterIds=<cluster ID>
   {
       "Backups": [
           {
               "ClusterId": "cluster-1a23b4cdefg",
               "BackupId": "backup-9g87f6edcba",
               "CreateTimestamp": 1536667238.328,
               "BackupState": "READY"
           },
                ...
       ]
   }
   ```

1. [从所选备份创建集群](https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-cluster-from-backup.html)。验证备份是否包含已删除的密钥以及集群所需的其他用户和密钥。

1. [断开 AWS CloudHSM 密钥库](disconnect-keystore.md)的连接，以便您可以编辑其属性。

1. [编辑 AWS CloudHSM 密钥库的集群 ID](update-keystore.md)。输入您从备份创建的集群的集群 ID。由于该集群与原始集群共享备份历史记录，新集群 ID 应该是有效的。

1. [重新连接 AWS CloudHSM 密钥库](connect-keystore.md)。

## 如何以 `kmsuser` 身份登录
<a name="fix-login-as-kmsuser"></a>

要在 AWS CloudHSM 集群中为密钥存储创建和管理 AWS CloudHSM 密钥材料，请 AWS KMS 使用[`kmsuser`加密用户 (CU) 账户](keystore-cloudhsm.md#concept-kmsuser)。您在集群[中创建 `kmsuser` CU 账户](create-keystore.md#before-keystore)，并在创建 AWS CloudHSM 密钥库 AWS KMS 时提供其密码。

通常， AWS KMS 管理`kmsuser`账户。但是，对于某些任务，您需要断开 AWS CloudHSM 密钥存储的连接，以 `kmsuser` CU 身份登录集群，然后使用 C [loudHSM 命令行界面 (C](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli.html) LI)。

**注意**  
虽然自定义密钥存储已断开连接，但在自定义密钥存储中创建 KMS 密钥或在加密操作中使用现有 KMS 密钥的所有尝试都将失败。此操作可以阻止用户存储和访问敏感数据。

本主题介绍如何[断开 AWS CloudHSM 密钥库的连接并以身份登录](#login-kmsuser-1)`kmsuser`、运行 AWS CloudHSM 命令行工具，以及如何[注销和重新连接 AWS CloudHSM 密钥库](#login-kmsuser-2)。

**Topics**
+ [如何断开和登录](#login-kmsuser-1)
+ [如何注销并重新连接](#login-kmsuser-2)

### 如何断开和登录
<a name="login-kmsuser-1"></a>

每当需要以 `kmsuser` 加密用户身份登录到关联的集群时，请使用以下过程。

**注意**  
以下过程使用 AWS CloudHSM 客户端 SDK 5 命令行工具 [CloudHSM C](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli.html) LI。CloudHSM CLI 将 `key-handle` 替换为 `key-reference`。  
2025 年 1 月 1 日， AWS CloudHSM 将终止对客户端 SDK 3 命令行工具、CloudHSM 管理实用程序 (CMU) 和密钥管理实用程序 (KMU) 的支持。有关客户端 SDK 3 命令行工具和客户端 SDK 5 命令行工具之间区别的更多信息，请参阅《AWS CloudHSM 用户指南》**中的[从客户端 SDK 3 CMU 和 KMU 迁移到客户端 SDK 5 CloudHSM CLI](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-migrate-from-kmu-cmu.html)。

1. 如果 AWS CloudHSM 密钥存储尚未断开连接，请断开其连接。您可以使用 AWS KMS 控制台或 AWS KMS API。

   连接 AWS CloudHSM 密钥后 AWS KMS ，将以身份登录`kmsuser`。这将防止您以 `kmsuser` 身份登录或更改 `kmsuser` 密码。

   例如，此命令用于断开示例密钥存储的连接。[DisconnectCustomKeyStore](https://docs.aws.amazon.com/kms/latest/APIReference/API_DisconnectCustomKeyStore.html)将示例 AWS CloudHSM 密钥库 ID 替换为有效的密钥库 ID。

   ```
   $ aws kms disconnect-custom-key-store --custom-key-store-id cks-1234567890abcdef0
   ```

1. 使用 **login** 命令并以管理员身份登录。使用《AWS CloudHSM 用户指南》**的[使用 CloudHSM CLI](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-getting-started.html#w17aac19c11c13b7) 部分中描述的步骤。

   ```
   aws-cloudhsm > login --username admin --role admin
             Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "admin",
       "role": "admin"
     }
   }
   ```

1. 使用 CloudHSM CLI 中的[https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-user-change-password.html)命令将账户密码更改为你知道`kmsuser`的密码。 （连接 AWS CloudHSM 密钥库时AWS KMS 轮换密码。） 密码必须由 7 到 32 个字母数字字符组成。它区分大小写，并且不能包含任何特殊字符。

1. 使用您设置的密码以 `kmsuser` 身份登录。有关详细说明，请参阅《AWS CloudHSM 用户指南》**中的[使用 CloudHSM CLI](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-getting-started.html#w17aac19c11c13b7) 部分。

   ```
   aws-cloudhsm > login --username kmsuser --role crypto-user
             Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "kmsuser",
       "role": "crypto-user"
     }
   }
   ```

### 如何注销并重新连接
<a name="login-kmsuser-2"></a>

每次需要以 `kmsuser` 加密用户身份注销并重新连接密钥存储时，请按以下步骤操作。

**注意**  
以下过程使用 AWS CloudHSM 客户端 SDK 5 命令行工具 [CloudHSM C](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli.html) LI。CloudHSM CLI 将 `key-handle` 替换为 `key-reference`。  
2025 年 1 月 1 日， AWS CloudHSM 将终止对客户端 SDK 3 命令行工具、CloudHSM 管理实用程序 (CMU) 和密钥管理实用程序 (KMU) 的支持。有关客户端 SDK 3 命令行工具和客户端 SDK 5 命令行工具之间区别的更多信息，请参阅《AWS CloudHSM 用户指南》**中的[从客户端 SDK 3 CMU 和 KMU 迁移到客户端 SDK 5 CloudHSM CLI](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-migrate-from-kmu-cmu.html)。

1. 执行任务，然后使用 CloudHSM CLI 中的 [https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-logout.html](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-logout.html) 命令注销。如果您不注销，重新连接 AWS CloudHSM 密钥库的尝试将失败。

   ```
   aws-cloudhsm  logout
   {
     "error_code": 0,
     "data": "Logout successful"
   }
   ```

1. 为自定义密钥存储[编辑 `kmsuser` 密码设置](update-keystore.md)。

   这 AWS KMS 会告诉集群`kmsuser`中的当前密码。如果您省略此步骤， AWS KMS 将无法以身份登录集群`kmsuser`，并且所有重新连接您的自定义密钥存储的尝试都将失败。您可以使用 AWS KMS 控制台或[UpdateCustomKeyStore](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateCustomKeyStore.html)操作的`KeyStorePassword`参数。

   例如，此命令 AWS KMS 告诉当前密码是`tempPassword`。将示例密码替换为实际密码。

   ```
   $ aws kms update-custom-key-store --custom-key-store-id cks-1234567890abcdef0 --key-store-password tempPassword
   ```

1. 将 AWS KMS 密钥库重新连接到其 AWS CloudHSM 集群。将示例 AWS CloudHSM 密钥库 ID 替换为有效的密钥库 ID。在连接过程中，将`kmsuser`密码 AWS KMS 更改为只有它知道的值。

   [ConnectCustomKeyStore](https://docs.aws.amazon.com/kms/latest/APIReference/API_ConnectCustomKeyStore.html)操作很快就会恢复，但连接过程可能需要很长时间。初始响应不指示连接过程是否成功。

   ```
   $ aws kms connect-custom-key-store --custom-key-store-id cks-1234567890abcdef0
   ```

1. 使用该[DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html)操作验证 AWS CloudHSM 密钥库是否已连接。将示例 AWS CloudHSM 密钥库 ID 替换为有效的密钥库 ID。

   在此示例中，连接状态字段显示 AWS CloudHSM 密钥库现已连接。

   ```
   $ aws kms describe-custom-key-stores --custom-key-store-id cks-1234567890abcdef0
   {
      "CustomKeyStores": [
         "CustomKeyStoreId": "cks-1234567890abcdef0",
         "CustomKeyStoreName": "ExampleKeyStore",
         "CloudHsmClusterId": "cluster-1a23b4cdefg",
         "TrustAnchorCertificate": "<certificate string appears here>",
         "CreationDate": "1.499288695918E9",
         "ConnectionState": "CONNECTED"
      ],
   }
   ```