

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

# 适用于 JCE 开发工具包的已知问题 AWS CloudHSM
<a name="ki-jce-sdk"></a>

以下问题会影响适用的 JCE 开发工具包。 AWS CloudHSM

**Topics**
+ [问题：当使用非对称密钥对时，即使未显式创建或导入密钥，也会看到占用密钥容量](#ki-jce-1)
+ [问题：JCE KeyStore 是只读的](#ki-jce-3)
+ [问题：要进行 AES-GCM 加密的缓冲区不能超过 16,000 字节](#ki-jce-4)
+ [问题：在 HSM 内部分执行椭圆曲线迪菲-赫尔曼 (ECDH, Elliptic-curve Diffie-Hellman) 密钥派生](#ki-jce-5)
+ [问题： KeyGenerator 并且 KeyAttribute 错误地将密钥大小参数解释为字节数而不是位](#ki-jce-6)
+ [问题：客户端软件开发工具包 5 抛出警告“发生了非法的反射访问操作”](#ki-jce-7)
+ [问题：JCE 会话池已用尽](#ki-jce-8)
+ [问题：Client SDK 5 因 getKey 操作而发生内存泄漏](#ki-jce-9)

## 问题：当使用非对称密钥对时，即使未显式创建或导入密钥，也会看到占用密钥容量
<a name="ki-jce-1"></a>
+ **影响：**此问题可能会 HSMs 导致您的密钥空间意外耗尽，当您的应用程序使用标准 JCE 密钥对象而不是对象进行加密操作时，就会发生此问题。`CaviumKey`当您使用标准 JCE 密钥对象时，`CaviumProvider` 会将该密钥作为会话密钥隐式导入 HSM 中，并且在应用程序退出之前不会删除此密钥。因此，密钥会在应用程序运行时积累，并可能 HSMs 导致您的可用密钥空间耗尽，从而冻结您的应用程序。
+ **解决方法：**当使用 `CaviumSignature` 类、 `CaviumCipher` 类、 `CaviumMac` 类或 `CaviumKeyAgreement` 类时，您应提供 `CaviumKey` 密钥而不是标准 JCE 密钥作为对象。

  您可以使用 [https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/KeyUtilitiesRunner.java](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/KeyUtilitiesRunner.java) 类将普通密钥手动转换为 `CaviumKey`，并在之后可在操作完成后手动删除该密钥。
+ **解决状态：**我们正在更新 `CaviumProvider` 以正确管理隐式导入。当该修复可用时，将在版本历史记录页面中公布。

## 问题：JCE KeyStore 是只读的
<a name="ki-jce-3"></a>
+ **影响：**您目前无法将 HSM 不支持的对象类型存储在 JCE 密钥库中。具体来说，您不能在密钥存储中存储证书。这会阻止与 jarsigner 之类的工具的互操作性，这些工具预期在密钥库中查找证书。
+ **解决方法：**您可以修改您的代码，以从本地文件或 S3 存储桶位置中加载证书，而不是从密钥存储中加载。
+ **解析状态：**您可以使用 AWS CloudHSM 密钥库来存储证书。

## 问题：要进行 AES-GCM 加密的缓冲区不能超过 16,000 字节
<a name="ki-jce-4"></a>

此外，多部分 AES-GCM 加密不受支持。
+ **影响：**您不能使用 AES-GCM 加密大于 16,000 字节的数据。
+ **解决方法：**您可以使用一个替代机制（如 AES-CBC），也可以将数据拆分为多个部分并为各个部分分别加密。如果您拆分了数据，则必须管理已拆分的密文及其解密内容。由于 FIPS 要求在 HSM 上生成 AES-GCM 的初始化向量 (IV)，因此 AES-GCM-encrypted每条数据的 IV 会有所不同。
+ **解决状态：**我们正在修复开发工具包，以在数据缓冲区过大时显式失败。我们正在评估支持较大的缓冲区而不依靠多部分加密的替代方法。将在 AWS CloudHSM 论坛和版本历史记录页面中公布更新。

## 问题：在 HSM 内部分执行椭圆曲线迪菲-赫尔曼 (ECDH, Elliptic-curve Diffie-Hellman) 密钥派生
<a name="ki-jce-5"></a>

您的 EC 私有密钥始终保留在 HSM 中，但密钥派生过程分多步执行。因此，客户端上可以提供每个步骤的中间结果。[Java 代码示例](java-samples_3.md)中提供了 ECDH 密钥派生示例。
+ **影响：**Client SDK 3 为 JCE 增加了 ECDH 功能。使用该`KeyAgreement`类派生 a 时 SecretKey，它首先在客户端上可用，然后导入到 HSM 中。密钥句柄随后会返回到您的应用程序。
+ **解决办法：**如果您在中实现 SSL/TLS Offload AWS CloudHSM，则此限制可能不是问题。如果您的应用程序需要将您的密钥始终保持在 FIPS 边界内，请考虑使用不依赖 ECDH 密钥派生的替代协议。
+ **解决状态：**SDK 5.16 现在支持带密钥派生的 ECDH，该密钥派生完全在 HSM 中执行。

## 问题： KeyGenerator 并且 KeyAttribute 错误地将密钥大小参数解释为字节数而不是位
<a name="ki-jce-6"></a>

当使用[KeyGenerator 类](https://docs.oracle.com/javase/8/docs/api/javax/crypto/KeyGenerator.html#init-int-)的`init`函数或[AWS CloudHSM KeyAttribute 枚举](java-lib-attributes_5.md)的`SIZE`属性生成密钥时，API 错误地期望参数为密钥字节数，而应改为密钥位数。
+ **影响：**客户端 SDK 版本 5.4.0 至 5.4.2 错误地期望将密钥大小提供给指定的字节 APIs 。
+ **解决办法：**如果使用客户端 SDK 版本 5.4.0 到 5.4.2，则在使用 KeyGenerator 类或 KeyAttribute 枚举使用 AWS CloudHSM JCE 提供程序生成密钥之前，请将密钥大小从位转换为字节。
+ **解析状态：**将您的客户端 SDK 版本升级到 5.5.0 或更高版本，其中包括在使用 KeyGenerator 类或 KeyAttribute 枚举生成密钥时正确预期以位为单位的密钥大小的修复程序。

## 问题：客户端软件开发工具包 5 抛出警告“发生了非法的反射访问操作”
<a name="ki-jce-7"></a>

在 Java 11 中使用客户端软件开发工具包 5 时，CloudHSM 会抛出以下 Java 警告：

```
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.amazonaws.cloudhsm.jce.provider.CloudHsmKeyStore (file:/opt/cloudhsm/java/cloudhsm-jce-5.6.0.jar) to field java.security .KeyStore.keyStoreSpi
WARNING: Please consider reporting this to the maintainers of com.amazonaws.cloudhsm.jce.provider.CloudHsmKeyStore
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
```

此问题已在 Client SDK 版本 5.8 以及更高版本中得到修复。

## 问题：JCE 会话池已用尽
<a name="ki-jce-8"></a>

**影响：**看到以下消息后，您可能无法在 JCE 中执行操作：

```
com.amazonaws.cloudhsm.jce.jni.exception.InternalException: There are too many operations 
happening at the same time: Reached max number of sessions in session pool: 1000
```

**解决方法：**
+ 如果您受到影响，请重新启动 JCE 应用程序。
+ 执行操作时，可能需要先完成 JCE 操作，然后才能丢失对该操作的引用。
**注意**  
根据操作的不同，可能需要一种完成方法。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/ki-jce-sdk.html)

**解决状态：**我们已经在客户端软件开发工具包 5.9.0 及更高版本中解决了此问题。要修复此问题，请将您的客户端软件开发工具包升级到其中一个版本。

## 问题：Client SDK 5 因 getKey 操作而发生内存泄漏
<a name="ki-jce-9"></a>
+ **影响：**在 Client SDK 版本 5.10.0 及更早版本中，API `getKey` 操作在 JCE 中存在内存泄漏。如果您在应用程序中多次使用 `getKey` API，则会导致内存增长增加，从而增加应用程序中的内存占用量。随着时间推移，这可能会导致节流错误或需要重启应用程序。
+ **解决办法：**我们建议升级到 Client SDK 5.11.0。如果无法做到这一点，我们建议不要在应用程序中多次调用 `getKey` API。相反，应尽可能重复使用先前 `getKey` 操作中返回的密钥。
+ **解决状态：**将您的 Client SDK 版本升级到 5.11.0 或更高版本，其中包括针对此问题的修复。