本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将您的JCE提供商从 AWS CloudHSM 客户端 SDK 3 迁移到客户端 SDK 5
使用本主题将您的JCE提供商从 AWS CloudHSM 客户端 SDK 3 迁移到客户端 SDK 5。有关迁移的好处,请参阅AWS CloudHSM 客户 SDK 5 的好处。
在中 AWS CloudHSM,客户应用程序使用 AWS CloudHSM 客户端软件开发套件 (SDK) 执行加密操作。客户端 SDK 5 SDK 是继续添加新功能和平台支持的主要客户端。
Client SDK 3 JCE 提供程序使用自定义类APIs,这些类不属于标准JCE规范。JCE提供商的客户端 SDK 5 对JCE规格不满意,并且在某些方面与客户端 SDK 3 不兼容。在迁移到客户端 SDK 5 的过程中,可能需要对客户应用程序进行更改。本节概述成功迁移所需的更改。
要查看所有提供商的迁移说明,请参阅从 AWS CloudHSM 客户端 SDK 3 迁移到客户端 SDK 5。
通过解决重大变化做好准备
查看这些重大更改,并在开发环境中相应地更新您的应用程序。
提供程序的类和名称已更改
发生了什么变化 | 客户端 SDK 3 中的内容 | 客户端 SDK 5 中的内容 | 示例 |
---|---|---|---|
提供者类别和名称 |
客户端 SDK 3 中的JCE提供者类被调用 |
在客户端 SDK 5 中,调用提供者类 |
显式登录已更改,隐式登录未更改
发生了什么变化 | 客户端 SDK 3 中的内容 | 客户端 SDK 5 中的内容 | 示例 |
---|---|---|---|
显式登录 |
客户端 SDK 3 使用该 |
在客户端 SDK 5 中, |
有关如何在 Client SDK 5 上使用显式登录的示例,请参阅 AWSCloud LoginRunner HSM GitHub 示例存储库 |
隐式登录 |
对于隐式登录,无需进行任何更改。从客户端 SDK 3 迁移到客户端 SDK 5 时,相同的属性文件和所有环境变量将继续适用于隐式登录。 |
有关如何在 Client 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
。
从移动Cavium
KeyStore 到CloudHSM
KeyStore 需要更改 KeyStore 类型。此外,客户端 SDK 3 使用按键手柄来引用密钥,而客户端 SDK 5 使用按键标签。下面列出了由此产生的行为变化。
发生了什么变化 | 客户端 SDK 3 中的内容 | 客户端 SDK 5 中的内容 | 示例 |
---|---|---|---|
关键参考文献 |
在客户端 SDK 3 中,应用程序使用按键标签或按键手柄来引用中的密钥HSM。他们使用标签 KeyStore 来查找钥匙,或者他们使用手柄创建 |
在客户端 SDK 5 中,应用程序可以使用AWS CloudHSM KeyStore 客户端 SDK 5 的 Java 类按标签查找密钥。要按手柄查找按键,请 AWS CloudHSM |
|
查找多个条目 |
使用 |
使用 AWS CloudHSM |
|
找到所有钥匙 |
在客户端 SDK 3 中可以找到HSM使用中的所有密钥 |
通过使用该 |
AWS CloudHSM Github 示例存储库 |
删除密钥 |
客户端 SDK 3 |
客户端 SDK 5 中的 |
可以在 C loud HSM 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();
密码解包操作已更改,其他密码操作未更改
注意
Cipher encrypt/decrypt/wrap 操作无需进行任何更改。
Unwrap 操作要求将 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 目前不支持亚马逊 Linux、Ubuntu 16.04、Ubuntu 18.04 CentOS 6、CentOS 8 和 6。RHEL SDK如果您当前在客户端 SDK 3 上使用其中一个平台,则在迁移到客户端 SDK 5 时需要选择其他平台。
-
卸载客户端 SDK 3 的JCE提供程序。
-
卸载客户端 SDK 3 的客户端守护程序。
注意
需要再次启用自定义配置。
-
按照中的步骤安装客户端SDKJCE提供程序安装 AWS CloudHSM 客户端 SDK 5 的JCE提供程序。
-
客户端 SDK 5 引入了新的配置文件格式和命令行引导工具。要引导您的 Client SDK 5 JCE 提供商,请按照用户指南中列出的说明进行操作。引导客户端 SDK
-
在您的开发环境中,测试您的应用程序。在最终迁移之前,请更新现有代码以解决重大更改。