本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將您的 JCE 提供者從用戶端 SDK 3 遷移到用戶端 SDK 5
使用本主題可將您的 JCE 提供者從用戶端 SDK 3 遷移至用戶端 SDK 5。如需移轉的優點,請參閱用戶端 SDK 5 的優點 。
在中 AWS CloudHSM,客戶應用程式會使用用戶 AWS CloudHSM 端軟體開發套件 (SDK) 執行密碼編譯作業。客戶端 SDK 5 是繼續添加新功能和平台支持的主要 SDK。
用戶端 SDK 3 JCE 提供者使用不屬於標準 JCE 規格一部分的自訂類別和 API。JCE 提供商的客戶端 SDK 5 對 JCE 規範抱怨,並且在某些區域與客戶端 SDK 3 向後不兼容。在遷移至用戶端 SDK 5 時,客戶應用程式可能需要進行變更。本節概述成功移轉所需的變更。
若要檢閱所有提供者的移轉指示,請參閱從用戶端 SDK 3 遷移至用戶端 SDK 5。
通過解決突破性更改做好
檢閱這些重大變更,並相應地在開發環境中更新您的應用程式。
提供者類別和名稱已變更
發生了什麼變化 | 它在客戶端 SDK 3 中是什麼 | 它是什麼在客戶端 SDK 5 | 範例 |
---|---|---|---|
提供者類別和名稱 |
呼叫用戶端 SDK 3 中的 JCE 提供者類別, |
在用戶端 SDK 5 中,會呼叫「提供者」類別, |
顯式登錄已更改,隱式沒有
發生了什麼變化 | 它在客戶端 SDK 3 中是什麼 | 它是什麼在客戶端 SDK 5 | 範例 |
---|---|---|---|
明確登入 |
用戶端 SDK 3 會使用 |
在用戶端 SDK 5 中,提 |
如需如何透過用戶端開發套件 5 使用明確登入的範例,請參閱 AWS CloudHSM LoginRunner 範例儲存庫中的 GitHub 範 |
隱式登入 |
隱含登入不需要變更。從客戶端 SDK 3 遷移到客戶端 SDK 5 時,相同的屬性文件和所有環境變量將繼續適用於隱式登錄。 |
如需如何搭配用戶端 SDK 5 使用隱含登入的範例,請參閱LoginRunner 範 |
-
[1] 用戶端 SDK 3 程式碼片段:
LoginManager lm = LoginManager.getInstance(); lm.login(partition, user, pass);
-
[2] 客戶端 SDK 5 代碼片段:
// Construct or get the existing provider object AuthProvider provider = new CloudHsmProvider(); // Call login method on the CloudHsmProvider object // Here loginHandler is a CallbackHandler provider.login(null, loginHandler);
如需如何透過 Client SDK 5 使用明確登入的範例,請參閱LoginRunner 範
例存放庫中的 AWS CloudHSM GitHub 範例。
金鑰產生已變更
發生了什麼變化 | 它在客戶端 SDK 3 中是什麼 | 它是什麼在客戶端 SDK 5 | 範例 |
---|---|---|---|
金鑰產生 |
在用戶端 SDK 3 中,用 |
在用戶端 SDK 5 中,用 |
如需如何使用 |
產生金鑰配對 |
在用戶端 SDK 3 中,用 |
在用戶端 SDK 5 中, |
如需如何使用 |
-
[1] 用戶端 SDK 3 金鑰產生程式碼片段:
KeyGenerator keyGen = KeyGenerator.getInstance("AES", "Cavium"); CaviumAESKeyGenParameterSpec aesSpec = new CaviumAESKeyGenParameterSpec( keySizeInBits, keyLabel, isExtractable, isPersistent); keyGen.init(aesSpec); SecretKey aesKey = keyGen.generateKey();
-
[2] 客戶端 SDK 5 密鑰生成代碼片段:
KeyGenerator keyGen = KeyGenerator.getInstance("AES", CloudHsmProvider.PROVIDER_NAME); final KeyAttributesMap aesSpec = new KeyAttributesMap(); aesSpec.put(KeyAttribute.LABEL, keyLabel); aesSpec.put(KeyAttribute.SIZE, keySizeInBits); aesSpec.put(KeyAttribute.EXTRACTABLE, isExtractable); aesSpec.put(KeyAttribute.TOKEN, isPersistent); keyGen.init(aesSpec); SecretKey aesKey = keyGen.generateKey();
-
[3] 客戶端 SDK 3 key pair 生成代碼片段::
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("rsa", "Cavium"); CaviumRSAKeyGenParameterSpec spec = new CaviumRSAKeyGenParameterSpec( keySizeInBits, new BigInteger("65537"), label + ":public", label + ":private", isExtractable, isPersistent); keyPairGen.initialize(spec); keyPairGen.generateKeyPair();
-
[4] 客戶端 SDK 5 key pair 生成代碼片段:
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", providerName); // Set attributes for RSA public key final KeyAttributesMap publicKeyAttrsMap = new KeyAttributesMap(); publicKeyAttrsMap.putAll(additionalPublicKeyAttributes); publicKeyAttrsMap.put(KeyAttribute.LABEL, label + ":Public"); publicKeyAttrsMap.put(KeyAttribute.MODULUS_BITS, keySizeInBits); publicKeyAttrsMap.put(KeyAttribute.PUBLIC_EXPONENT, new BigInteger("65537").toByteArray()); // Set attributes for RSA private key final KeyAttributesMap privateKeyAttrsMap = new KeyAttributesMap(); privateKeyAttrsMap.putAll(additionalPrivateKeyAttributes); privateKeyAttrsMap.put(KeyAttribute.LABEL, label + ":Private"); // Create KeyPairAttributesMap and use that to initialize the // keyPair generator KeyPairAttributesMap keyPairSpec = new KeyPairAttributesMapBuilder() .withPublic(publicKeyAttrsMap) .withPrivate(privateKeyAttrsMap) .build(); keyPairGen.initialize(keyPairSpec); keyPairGen.generateKeyPair();
查找,刪除和引用鍵已更改
尋找已經產生的金鑰 AWS CloudHSM 需要使用 KeyStore. 用戶端 SDK 3 有兩 KeyStore 種類型:Cavium
和CloudHSM
. 用戶端 SDK 5 只有一 KeyStore 種類型:CloudHSM
。
從到移動CloudHSM
KeyStore 需Cavium
KeyStore 要變更類 KeyStore 型。此外,用戶端 SDK 3 會使用金鑰控制點來參考金鑰,而用戶端 SDK 5 則使用金鑰標籤。產生的行為變更如下所示。
發生了什麼變化 | 它在客戶端 SDK 3 中是什麼 | 它是什麼在客戶端 SDK 5 | 範例 |
---|---|---|---|
關鍵參考 |
在用戶端 SDK 3 中,應用程式會使用金鑰標籤或金鑰控制點來參考 HSM 中的金鑰。他們使用標籤 KeyStore 來查找鍵,或者他們使用控點和創建 |
在用戶端 SDK 5 中,應用程式可以如 AWS CloudHSM KeyStore 何使用 Java 類別使用按標籤尋找金鑰。若要依控制點尋找金鑰,請使用 AWS CloudHSM |
|
尋找多個項目 |
當使用 |
使用 AWS CloudHSM |
|
尋找所有金鑰 |
您可以在用 |
客戶端 SDK 5 使得通過使用 |
AWS CloudHSM Github 範例儲存庫中提供了使用 |
金鑰刪除 |
用戶端 SDK 3 用 |
客戶端 SDK 5 中的 |
您可以在 CloudHSM Github 範例儲存庫中找到顯示刪除金鑰功能的範 |
-
[1] 代碼片段如下所示:
KeyAttributesMap findSpec = new KeyAttributesMap(); findSpec.put(KeyAttribute.LABEL, label); findSpec.put(KeyAttribute.KEY_TYPE, keyType); KeyStoreWithAttributes keyStore = KeyStoreWithAttributes.getInstance("CloudHSM"); keyStore.load(null, null); keyStore.getKey(findSpec);
-
[2] 刪除客戶端 SDK 3 中的密鑰:
Util.deleteKey(key);
刪除客戶端 SDK 5 中的密鑰:
((Destroyable) key).destroy();
密碼解包操作已更改,其他密碼操作沒有
注意
無需更改密碼加密/解密/包裝操作。
解除換行作業需要將 Client SDK 3 CaviumUnwrapParameterSpec
類別取代為下列其中一個特定於密碼編譯作業的類別。
GCMUnwrapKeySpec
用於AES/GCM/NoPadding
展開IvUnwrapKeySpec
為AESWrap unwrap
和AES/CBC/NoPadding unwrap
適用於
RSA OAEP unwrap
的OAEPUnwrapKeySpec
示例代碼片段OAEPUnwrapkeySpec
:
OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec( "SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSpecified.DEFAULT); KeyAttributesMap keyAttributesMap = new KeyAttributesMap(KeyAttributePermissiveProfile.KEY_CREATION); keyAttributesMap.put(KeyAttribute.TOKEN, true); keyAttributesMap.put(KeyAttribute.EXTRACTABLE, false); OAEPUnwrapKeySpec spec = new OAEPUnwrapKeySpec(oaepParameterSpec, keyAttributesMap); Cipher hsmCipher = Cipher.getInstance( "RSA/ECB/OAEPPadding", CloudHsmProvider.PROVIDER_NAME); hsmCipher.init(Cipher.UNWRAP_MODE, key, spec);
簽章作業未變更
簽名操作不需要進行任何變更。
遷移至用戶端 SDK 5
請遵循本節中的指示,從用戶端 SDK 3 遷移至用戶端 SDK 5。
注意
用戶端軟體開發套件 5 目前不支援 Amazon Linux、Ubuntu 18.04 CentOS 6、CentOS 8 及 RHEL 6。如果您目前正在搭配用戶端 SDK 3 使用其中一個平台,則在移轉至用戶端 SDK 5 時,必須選擇不同的平台。
-
解除安裝用戶端 SDK 3 的 JCE 提供者。
-
解除安裝用戶端 SDK 3 的用戶端常駐程式。
注意
自訂組態需要再次啟用。
-
依照中安裝並使用用戶端 SDK 5 的 AWS CloudHSM JCE 提供者的步驟安裝用戶端 SDK JCE 提供者。
-
客戶端 SDK 5 引入了新的配置文件格式和命令行引導工具。若要啟動用戶端 SDK 5 JCE 提供者,請遵循使用者指南中列出的引導用戶端 SDK指示。
-
在您的開發環境中,測試您的應用程式。在最終移轉之前,更新現有程式碼以解決您的重大變更。