AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

对自定义密钥存储进行故障排除

自定义密钥存储被设计为可用且有弹性。但是,存在一些错误情况,您可能必须修复它们才能让自定义密钥存储正常运行。

如何修复不可用的 CMK

自定义密钥存储中的客户主密钥 (CMK) 的密钥状态通常为 Enabled。与所有 CMK 相似,当您禁用自定义密钥存储中的 CMK 时或者计划删除它们时,密钥状态会发生变化。但是,与其他 CMK 不同,自定义密钥存储中的 CMK 还可具有密钥状态 Unavailable

密钥状态 Unavailable 表示 CMK 位于被故意从其 AWS CloudHSM 集群断开并尝试重新连接该集群(如果有,失败)的自定义密钥存储中。当某个 CMK 不可用时,您可以查看和管理该 CMK,但不能将其用于加密操作。

要查找 CMK 的密钥状态,请在 Customer managed keys (客户托管密钥) 页面上,查看 CMK 的 Status (状态) 字段。或者,使用 DescribeKey 操作并查看响应中的 KeyState 元素。有关详细信息,请参阅 查看密钥

已断开的自定义密钥存储中的 CMK 的密钥状态将为 UnavailablePendingDeletion。计划从自定义密钥存储中删除的 CMK 的密钥状态为 Pending Deletion,即使在自定义密钥存储与其 AWS CloudHSM 集群断开后也是如此。这使您可以取消计划的密钥删除而无需重新连接自定义密钥存储。

要修复不可用的 CMK,请重新连接自定义密钥存储。重新连接自定义密钥存储后,自定义密钥存储中的 CMK 的密钥状态将自动还原到之前的状态,例如 EnabledDisabled。待删除的 CMK 将保持 PendingDeletion 状态。但是,当问题仍然存在时,启用和禁用不可用的 CMK 不会更改其密钥状态。仅当密钥变得可用时,启用或禁用操作才会生效。

如需帮助解决失败的连接,请参阅如何修复连接故障

如何修复失败的 CMK

在自定义密钥存储中创建和使用 CMK 的问题可能由自定义密钥存储、其关联的 AWS CloudHSM 集群、CMK 或其密钥材料导致。

当某个自定义密钥存储从其 AWS CloudHSM 集群断开时,该自定义密钥存储中的 CMK 的密钥状态为 Unavailable。在断开的自定义密钥存储中创建 CMK 的所有请求都将返回 CustomKeyStoreInvalidStateException 异常。所有加密、解密、重新加密或生成数据密钥的请求都将返回 KMSInvalidStateException 异常。要修复该问题,请重新连接自定义密钥存储

但是,您使用自定义密钥存储 CMK 进行加密操作的尝试可能会失败,即使其密钥状态为 Enabled 并且自定义密钥存储的连接状态为 Connected 也是如此。这可能由以下任一情况导致。

如何修复连接故障

如果您尝试连接自定义密钥存储到其 AWS CloudHSM 集群,但操作失败,则自定义密钥存储的连接状态将更改为 FAILED。要查找自定义密钥存储的状态,请查看 AWS 管理控制台中的自定义密钥存储的 Status (状态) 列或查看 DescribeCustomKeyStores 响应中的 ConnectionState 元素。

另外,由于容易检测到集群配置错误,一些连接尝试会很快失败。在此情况下,Status (状态)ConnectionState 仍为 DISCONNECTED。这些失败将返回错误消息或例外来说明尝试失败的原因。查看例外描述和集群要求,纠正问题,更新自定义密钥存储(如有必要)并尝试重新连接。

当连接状态为 FAILED 时,运行 DescribeCustomKeyStores 操作并查看响应中的 ConnectionErrorCode 元素。

注意

当自定义密钥存储的连接状态为 FAILED 时,您必须在先断开自定义密钥存储,然后再尝试重新连接它。您无法连接具有 FAILED 连接状态的自定义密钥存储。

如何修复无效的 kmsuser 凭证

当您连接自定义密钥存储时,AWS KMS 将以 kmsuser 加密用户 (CU) 身份登录到关联的 AWS CloudHSM 集群。在自定义密钥存储断开之前,它将保持登录状态。

如果您断开自定义密钥存储并更改 kmsuser 密码,AWS KMS 将无法使用 kmsuser CU 账户的凭证登录到 AWS CloudHSM 集群。因此,所有连接自定义密钥存储的尝试都将失败。DescribeCustomKeyStores 响应将显示 ConnectionState FAILEDConnectionErrorCodeINVALID_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 将锁定用户账户。要登录到集群,您必须更改账户密码。

如果 AWS KMS 在尝试以 kmsuser CU 身份登录到集群时获得锁定响应,连接自定义密钥存储的请求将失败。DescribeCustomKeyStores 响应包含 ConnectionState FAILEDConnectionErrorCodeUSER_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. 断开自定义密钥存储

  2. 运行 DescribeCustomKeyStores 操作并查看响应中的 ConnectionErrorCode 元素的值。

    • 如果 ConnectionErrorCode 值为 INVALID_CREDENTIALS,请确定 kmsuser 账户的当前密码。必要时,请使用 cloudhsm_mgmt_util 中的 changePswd 命令将密码设置为已知值。

    • 如果 ConnectionErrorCode 值是 USER_LOCKED_OUT,您必须使用 cloudhsm_mgmt_util 中的 changePswd 命令更改 kmsuser 密码。

  3. 编辑 kmsuser 密码设置,使其与当前集群中的 kmsuser 密码匹配。此操作将告知 AWS KMS 要用来登录到集群的密码。它不会更改集群中的 kmsuser 密码。

  4. 连接自定义密钥存储

如何删除孤立密钥材料

在计划从自定义密钥存储中删除 CMK 后,您可能需要从关联的集群中手动删除对应的密钥材料。

当您在自定义密钥存储中创建 CMK 时,AWS KMS 将在 AWS KMS 中创建 CMK 元数据并在关联的 AWS CloudHSM 集群中生成密钥材料。当您计划在自定义密钥存储中删除 CMK 时,在等待期过后,AWS KMS 将删除 CMK 元数据。然后,AWS KMS 会尽可能从集群中删除对应的密钥材料。AWS KMS 不会尝试从集群备份中删除密钥材料。

如果 AWS KMS 无法删除密钥材料(例如在自定义密钥存储已断开时),AWS KMS 会将一个条目写入到您的 AWS CloudTrail 日志。该条目包含 CMK ID、AWS CloudHSM 集群 ID 和密钥材料的密钥句柄。

要从关联的 AWS CloudHSM 集群中删除密钥材料,请使类似于下面的过程。本示例使用 AWS CLI 和 AWS CloudHSM 命令行工具,但您可以使用 AWS 管理控制台而不是 CLI。

  1. 断开自定义密钥存储(如果尚未断开),然后登录到 key_mgmt_util,如如何断开和登录中所述。

  2. 使用 key_mgmt_util 中的 deleteKey 命令从集群内的 HSM 中删除密钥。

    例如,以下命令从集群内的 HSM 中删除密钥 262162。密钥句柄列在 CloudTrail 日志条目中。

    Command: deleteKey -k 262162 Cfm3DeleteKey returned: 0x00 : HSM Return: SUCCESS Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS Node id 1 and err state 0x00000000 : HSM Return: SUCCESS Node id 2 and err state 0x00000000 : HSM Return: SUCCESS
  3. 从 key_mgmt_util 注销并重新连接自定义密钥存储,如如何注销并重新连接中所述。

如何恢复 CMK 的已删除密钥材料

如果删除了客户主密钥的密钥材料,则 CMK 不可用,并且在 CMK 下加密的所有密文都无法解密。如果从关联的 AWS CloudHSM 中删除了自定义密钥存储中的 CMK 的密钥材料,则会出现这种情况。但是,可以恢复该密钥材料。

当您在自定义密钥存储中创建一个客户主密钥 (CMK) 时,AWS KMS 将登录到关联的 AWS CloudHSM 集群并为该 CMK 创建密钥材料。AWS KMS 还会将密码更改为只有它知道的值,并且只要连接了自定义密钥存储,它就会保持登录状态。由于只有密钥所有者(即创建密钥的 CU)才能删除密钥,因此不太可能意外地从 HSM 中删除密钥。

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

在某些情况下,您可以通过从包含密钥材料的备份创建集群来恢复已删除的密钥材料。仅当在密钥存在且未被删除的情况下创建了一个备份时,此策略才有效。

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

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

    使用 DescribeBackups API 列出集群的备份。然后,使用备份时间戳帮助您选择一个备份。要将输出限制为与自定义密钥存储关联的集群,请使用 Filters 参数,如以下示例所示。

    $ aws cloudhsmv2 describe-backups --filters clusterIds=<cluster ID> { "Backups": [ { "ClusterId": "cluster-1a23b4cdefg", "BackupId": "backup-9g87f6edcba", "CreateTimestamp": 1536667238.328, "BackupState": "READY" }, ... ] }
  2. 从所选备份创建集群。验证备份是否包含已删除的密钥以及集群所需的其他用户和密钥。

  3. 断开自定义密钥存储,使您可以编辑其属性。

  4. 编辑自定义密钥存储的集群 ID。输入您从备份创建的集群的集群 ID。由于该集群与原始集群共享备份历史记录,新集群 ID 应该是有效的。

  5. 重新连接自定义密钥存储

如何以 kmsuser 身份登录

为了创建和管理自定义密钥存储的 AWS CloudHSM 集群中的密钥材料,AWS KMS 使用了 kmsuser 加密用户 (CU) 账户。您在集群中创建 kmsuser CU 账户并在创建自定义密钥存储时将该账户的密码提供给 AWS KMS。

一般而言,AWS KMS 将管理 kmsuser 账户。但是,对于某些任务,您需要断开自定义密钥存储,以 kmsuser CU 身份登录到集群,并使用 cloudhsm_mgmt_util 和 key_mgmt_util 命令行工具。

注意

自定义密钥存储断开连接时,在自定义密钥存储中创建客户主密钥 (CMK) 或者在加密操作中使用现有 CMK 的所有尝试将失败。此操作可以防止用户存储和访问敏感数据。

本主题介绍了如何断开自定义密钥存储并以 kmsuser 身份登录,运行 AWS CloudHSM 命令行工具,然后注销并重新连接自定义密钥存储

如何断开和登录

每当需要以 kmsuser CU 身份登录到关联的集群时,请使用以下过程。

  1. 断开自定义密钥存储(如果尚未断开)。您可以使用 AWS 管理控制台或 AWS KMS API。

    当您的自定义密钥已连接时,您便已经以 kmsuser 身份登录 AWS KMS。这将防止您以 kmsuser 身份登录或更改 kmsuser 密码。

    例如,此命令使用 DisconnectCustomKeyStore 断开示例密钥存储。将示例自定义密钥存储 ID 替换为有效的 ID。

    $ aws kms disconnect-custom-key-store --custom-key-store-id cks-1234567890abcdef0
  2. 启动 cloudhsm_mgmt_util。使用 AWS CloudHSM User Guide准备运行 cloudhsm_mgmt_util 部分中所述的过程。

  3. 在 AWS CloudHSM 集群上以加密管理者 (CO) 身份登录到 cloudhsm_mgmt_util。

    例如,以下命令以名为 admin 的 CO 的身份进行登录。将示例 CO 用户名和密码替换为有效值。

    aws-cloudhsm>loginHSM CO admin <password> loginHSM success on server 0(10.0.2.9) loginHSM success on server 1(10.0.3.11) loginHSM success on server 2(10.0.1.12)
  4. 使用 changePswd 命令将 kmsuser 账户的密码更改为您知道的值。(AWS KMS 将在您连接自定义密钥存储时轮换密码)。 密码必须由 7 到 32 个字母数字字符组成。它区分大小写,并且不能包含任何特殊字符。

    例如,此命令会将 kmsuser 密码更改为 tempPassword

    aws-cloudhsm>changePswd CU kmsuser tempPassword *************************CAUTION******************************** This is a CRITICAL operation, should be done on all nodes in the cluster. Cav server does NOT synchronize these changes with the nodes on which this operation is not executed or failed, please ensure this operation is executed on all nodes in the cluster. **************************************************************** Do you want to continue(y/n)?y Changing password for kmsuser(CU) on 3 nodes
  5. 使用您设置的密码以 kmsuser 身份登录到 key_mgmt_util 或 cloudhsm_mgmt_util。有关详细说明,请参阅 cloudhsm_mgmt_util 入门key_mgmt_util 入门。您使用的工具取决于任务。

    例如,以下命令将登录到 key_mgmt_util。

    Command: loginHSM -u CU -s kmsuser -p tempPassword Cfm3LoginHSM returned: 0x00 : HSM Return: SUCCESS Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS Node id 1 and err state 0x00000000 : HSM Return: SUCCESS Node id 2 and err state 0x00000000 : HSM Return: SUCCESS

如何注销并重新连接

  1. 执行任务,然后从命令行工具注销。如果您不注销,重新连接自定义密钥存储的尝试将失败。

    Command: logoutHSM Cfm3LogoutHSM returned: 0x00 : HSM Return: SUCCESS Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS Node id 1 and err state 0x00000000 : HSM Return: SUCCESS
  2. 为自定义密钥存储编辑 kmsuser 密码设置

    这将告知 AWS KMS 集群中的 kmsuser 的当前密码。如果忽略此步骤,AWS KMS 将无法以 kmsuser 身份登录到集群,并且重新连接自定义密钥存储的所有尝试都将失败。您可以使用 AWS 管理控制台或 UpdateCustomKeyStore 操作的 KeyStorePassword 参数。

    例如,以下命令将告知 AWS KMS 当前密码为 tempPassword。将示例密码替换为实际密码。

    $ aws kms update-custom-key-store --custom-key-store-id cks-1234567890abcdef0 --key-store-password tempPassword
  3. 将自定义密钥存储重新连接到 AWS KMS。将示例自定义密钥存储 ID 替换为有效的 ID。在连接过程中,AWS KMS 会将 kmsuser 密码更改为只有它知道的值。

    ConnectCustomKeyStore 操作将快速返回,但连接过程可能需要更长时间。初始响应不指示连接过程是否成功。

    $ aws kms connect-custom-key-store --custom-key-store-id cks-1234567890abcdef0
  4. 使用 DescribeCustomKeyStores 操作验证自定义密钥存储是否已连接。将示例自定义密钥存储 ID 替换为有效的 ID。

    在本示例中,连接状态字段显示自定义密钥存储现已连接。

    $ 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" ], }