

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 適用於 的 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 中橢圓曲線 Diffie-Hellman (ECDH) 金鑰衍生只會部分執行。](#ki-jce-5)
+ [問題：KeyGenerator 和 KeyAttribute 錯誤地將金鑰大小參數解釋為位元組數而非位元數](#ki-jce-6)
+ [問題：用戶端 SDK 5 會發出警告「發生了非法的反射式存取作業」](#ki-jce-7)
+ [問題：JCE 工作階段集區已用盡](#ki-jce-8)
+ [問題：用戶端 SDK 5 記憶體流失搭配 getKey 操作](#ki-jce-9)

## 問題：使用非對稱金鑰對時，即使未明確建立或匯入金鑰，仍會看到已佔用的金鑰容量
<a name="ki-jce-1"></a>
+ **影響：**此問題可能導致 HSM 意外用盡金鑰空間，並在您的應用程式使用標準 JCE 金鑰物件 (而非 `CaviumKey` 物件) 進行加密操作時發生。當您使用標準 JCE 金鑰物件時，`CaviumProvider` 會隱含地將該金鑰匯入 HSM 做為工作階段金鑰，且不會刪除此金鑰，直到應用程式結束為止。因此，金鑰會在應用程式執行時不斷累積，可能導致您的 HSM 用盡可用的金鑰空間，進而凍結您的應用程式。
+ **因應措施：**使用 `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 規定 AES-GCM 的初始化向量 (IV) 要在 HSM 上產生，AES-GCM 加密之每個資料片段的 IV 都不同。
+ **解決狀態：**我們正在進行修復，讓程式庫在資料緩衝區過大時明確失敗。我們正在評估支援較大緩衝區、而不需要仰賴分段加密的替代做法。更新會公告於 AWS CloudHSM 論壇和版本歷史頁面中。

## 問題：在 HSM 中橢圓曲線 Diffie-Hellman (ECDH) 金鑰衍生只會部分執行。
<a name="ki-jce-5"></a>

您的 EC 私有金鑰仍一律保留在 HSM 中，但金鑰衍生程序會分成多個步驟執行。因此，在用戶端會有每個步驟產生的中繼結果。您可在 [Java 程式碼範例](java-samples_3.md)中查看 ECDH 金鑰衍生範例。
+ **影響：**用戶端 SDK 3 將 ECDH 功能新增至 JCE。當您使用 `KeyAgreement`類別衍生 SecretKey 時，它首先可在用戶端上使用，然後匯入 HSM。然後將金鑰控制代碼傳回給到您的應用程式。
+ **解決方法：**如果您在 中實作 SSL/TLS 卸載 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 錯誤地預期金鑰大小會以位元組形式提供給指定的 API。
+ **解決方法：**在使用用戶端 SDK 5.4.0 到 5.4.2 版 AWS CloudHSM 時，使用 KeyGenerator 類別或 KeyAttribute 列舉來產生金鑰之前，請先將金鑰大小從位元轉換為位元組。
+ **解析狀態：**升級您的用戶端 SDK 版本到 5.5.0 或更高版本，其中包括使用 KeyGenerator 類別或 KeyAttribute 列舉產生金鑰時正確期望金鑰大小的位元修正。

## 問題：用戶端 SDK 5 會發出警告「發生了非法的反射式存取作業」
<a name="ki-jce-7"></a>

當您將用戶端 SDK 5 與 Java 11 搭配使用時，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
```

此問題已在用戶端 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_tw/cloudhsm/latest/userguide/ki-jce-sdk.html)

**解決狀態：**我們已在用戶端 SDK 5.9.0 及更新版本中解決此問題。若要修正此問題，請將用戶端 SDK 升級至其中一個版本。

## 問題：用戶端 SDK 5 記憶體流失搭配 getKey 操作
<a name="ki-jce-9"></a>
+ **影響：**API `getKey`操作在用戶端 SDK 5.10.0 版和更早版本中的 JCE 中存在記憶體流失。如果您在應用程式中多次使用 `getKey` API，這將導致記憶體成長增加，進而增加應用程式中的記憶體使用量。隨著時間的推移，這可能會導致限流錯誤或需要重新啟動應用程式。
+ **解決方法：**我們建議您升級至用戶端 SDK 5.11.0。如果無法這麼做，建議您不要在應用程式中多次呼叫 `getKey` API。相反地，請盡可能重複使用先前`getKey`操作中先前傳回的金鑰。
+ **解決狀態：**將您的用戶端 SDK 版本升級至 5.11.0 或更新版本，其中包含此問題的修正。