

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

# AWS CloudHSM 应用程序集成最佳实践
<a name="bp-application-integration"></a>

按照本节中的最佳实践来优化您的应用程序与集群的 AWS CloudHSM 集成的方式。

## 客户端软件开发工具包 引导程序
<a name="bp-integration-bootstrapping"></a>

将您的客户端软件开发工具包连接至您的集群前，必须对其进行引导。将 IP 地址引导至您的集群时，我们建议尽可能使用 `--cluster-id` 参数。此方法使用集群中的所有 HSM IP 地址填充您的配置，无需追踪每个单独的地址。这样可以在 HSM 进行维护或可用区中断时，为您的应用程序初始化增加额外弹性。有关更多详细信息，请参阅[引导客户端软件开发工具包](cluster-connect.md#connect-how-to)。

## 进行身份验证，以执行操作
<a name="w2aab9c13b7"></a>

在中 AWS CloudHSM，您必须先对集群进行身份验证，然后才能执行大多数操作，例如加密操作。

**使用 CloudHSM CLI 进行身份验证**：您可使用[单命令模式](cloudhsm_cli-modes.md#cloudhsm_cli-mode-single-command) 或 [交互模式](cloudhsm_cli-modes.md#cloudhsm_cli-mode-interactive)，通过 CloudHSM CLI 进行身份验证。使用 [使用 CloudHSM CLI 登录 HSM](cloudhsm_cli-login.md) 命令在交互模式下进行身份验证。若要在单命令模式下进行身份验证，必须设置环境变量 `CLOUDHSM_ROLE` 和 `CLOUDHSM_PIN`。有关执行此操作的详细信息，请参阅 [单命令模式](cloudhsm_cli-modes.md#cloudhsm_cli-mode-single-command)。 AWS CloudHSM 建议在应用程序不使用您的 HSM 凭证时安全存储。

使用 **PKCS 进行身份验证 \#11**: 在 PKCS \#11 中，在使用 C\_ 打开会话后使用 C\_Login API 登录。OpenSession每个插槽（集群）只需要执行一项 C\_Login。成功登录后，您可以使用 C\_ 打开其他会话，OpenSession 而无需执行其他登录操作。有关向 PKCS \#11 进行身份验证的示例，请参阅 [适用于 AWS CloudHSM 客户端 SDK 5 的 PKCS \#11 库的代码示例](pkcs11-samples.md)。

使用 **JCE 进行身份验证**： AWS CloudHSM JCE 提供程序支持隐式登录和显式登录。选择哪种方法由使用案例而定。我们建议尽可能使用隐式登录，因为如果应用程序与集群断开连接并且需要重新进行身份验证，SDK 将自动处理身份验证。使用隐式登录后，当您使用不允许控制应用代码的集成项时，可为您的应用提供凭证。有关登录方法的更多信息，请参阅 [步骤 2：向 JCE 提供程序提供凭证](java-library-install_5.md#java-library-credentials_5)。

**使用 OpenSSL 身份验证**：您可利用 OpenSSL 动态引擎，通过环境变量提供凭证。当不适应时， AWS CloudHSM 建议您安全存储 HSM 凭证。如果可能，您应将环境配置为系统地检索和设置这些环境变量，无需手动输入。有关使用 OpenSSL 进行身份验证的详细信息，请参阅[安装适用于 AWS CloudHSM 客户端 SDK 的 OpenSSL 动态引擎 5](openssl5-install.md)。

**通过 KSP 进行身份验证**：可以使用 Windows 凭证管理器或环境变量通过密钥存储提供程序（KSP）进行身份验证，请参阅 [为 AWS CloudHSM 客户端 SDK 5 安装密钥存储提供程序 (KSP)](ksp-library-install.md)。

## 有效管理应用程序中的密钥
<a name="bp-manage-application"></a>

**使用密钥属性控制密钥可执行的操作**：生成密钥时，使用密钥属性定义一组权限，允许或拒绝对该密钥进行特定类型的操作。我们建议在生成密钥时使用最少属性完成任务。例如，也不应使用 AES 加密密钥包装 HSM 以外的密钥。有关更多信息，请参阅以下客户的属性页面 SDKs：
+ [PKCS \#11 密钥属性](pkcs11-attributes.md)
+ [JCE 密钥属性](java-lib-attributes_5.md)

**尽可能缓存密钥对象，以最大限度减少延迟**：密钥查找操作将查询集群中的每个 HSM。此操作成本高昂，并且无法随集群内的 HSM 数量扩展。
+ 您可通过 PKCS \#11，使用 `C_FindObjects` API 查找密钥。
+ 使用 JCE，您可以使用查找密钥。 KeyStore

为了获得最佳性能， AWS 建议您在应用程序启动期间仅使用一次键查找命令（如[使用 KM AWS CloudHSM U 按属性搜索密钥](key_mgmt_util-findKey.md)和[使用 CloudHSM CLI 列出用户的密钥](cloudhsm_cli-key-list.md)），并将返回的密钥对象缓存在应用程序内存中。如果您稍后需要此密钥对象，则应从缓存中检索该对象，而非为每个操作查询此对象，这将增加显著的性能开销。

## 使用多线程
<a name="w2aab9c13c11"></a>

AWS CloudHSM 支持多线程应用程序，但是对于多线程应用程序，需要注意一些事项。

**使用 PKCS \#11**时，您应该只初始化 PKCS \#11 库（调用`C_Initialize`）一次。应对每个线程分配自己的会话 (`C_OpenSession`)。不建议在多个线程中使用同一会话。

**使用 JCE** 时， AWS CloudHSM 提供程序只能初始化一次。不要跨线程共享 SPI 对象实例。例如，Cipher、Signature、Digest、Mac KeyFactory 或 KeyGenerator 对象只能在自己的线程上下文中使用。

## 处理节流错误
<a name="w2aab9c13c13"></a>

以下情况下，可能会出现 HSM 节流错误：
+ 您的集群未正确扩展，因此无法管理峰值流量。
+ 维护事件期间，您的集群大小没有 \+1 冗余。
+ 可用区中断会导致集群 HSMs 中的可用区域数量减少。

有关如何最好地处理这种情况的信息，请参阅 [HSM 节流](troubleshoot-hsm-throttling.md)。

为确保您的集群大小足够且不会受到限制， AWS 建议您在您的环境中使用预期的峰值流量进行负载测试。

## 集群操作的集成重试次数
<a name="w2aab9c13c15"></a>

AWS 可能会出于操作或维护原因更换您的 HSM。为了使您的应用程序能够应对此类情况， AWS 建议您对路由到集群的所有操作实施客户端重试逻辑。对于因替换而导致的操作失败，其后续重试有望成功。

## 实施灾难恢复策略
<a name="w2aab9c13c17"></a>

为了应对事件，可能需要将流量从整个集群或区域转移。以下各节描述了实现此任务的多种策略。

**使用 VPC 对等互连从其他账户或地区访问您的集群**：您可以利用 VPC 对等互连从其他账户或地区访问您的 AWS CloudHSM 集群。有关更多信息，请参阅 *VPC Peering Guide* 中的[什么是 VPC 对等连接？](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)。建立对等连接并正确配置安全组后，就可以像往常一样与 HSM IP 地址通信。

**从同一应用程序连接至多个集群**：Client SDK 5 中的 JCE 提供程序、PKCS \#11 库和 CloudHSM CLI 支持从同一应用程序连接到多个集群。例如，您可有两个活动集群，每个集群位于不同的区域，并且您的应用程序可以同时连接至这两个集群，并在两者之间进行负载平衡，这是正常操作的一部分。如果您的应用程序未使用客户端软件开发工具包 5 (最新 SDK)，则无法从同一个应用程序连接到多个集群。或者，您可以保持其他集群的正常运行，如果出现区域性中断，可以将流量转移之另一个集群，以最大限度地减少停机时间。详情请参见相应页面：
+ [使用 PKCS \#11 库进行多插槽配置 AWS CloudHSM](pkcs11-library-configs-multi-slot.md)
+ [使用 JCE 提供程序连接到多个 AWS CloudHSM 集群](java-lib-configs-multi.md)
+ [使用 CloudHSM CLI 连接到多个集群](cloudhsm_cli-configs-multi-cluster.md)

**恢复备份集群**：您可通过现有集群备份，创建新集群。有关更多信息，请参阅 [中的集群备份 AWS CloudHSM](manage-backups.md)。

## 错开应用程序部署
<a name="bp-stagger-deployment"></a>

针对客户端应用程序的部署和重启，遵循交错部署策略，例如基于波浪的渐进式部署、一体化部署和滚动部署。这种方法可以最大限度地减少变更的潜在影响，同时还能确保在部署期间有足够的容量为生产流量提供服务。