适用于 AWS CloudHSM 的 JCE SDK 的已知问题
以下问题会影响适用于 AWS CloudHSM 的 JCE SDK。
主题
问题:当使用非对称密钥对时,即使未显式创建或导入密钥,也会看到占用密钥容量
-
影响:此问题可能导致 HSM 意外地耗尽密钥空间,并且当您的应用程序使用标准 JCE 密钥对象进行加密操作而不是
CaviumKey
对象时,会发生此问题。当您使用标准 JCE 密钥对象时,CaviumProvider
会将该密钥作为会话密钥隐式导入 HSM 中,并且在应用程序退出之前不会删除此密钥。因此,密钥会在应用程序运行时累积,并可能导致 HSM 耗尽空闲密钥空间,从而导致应用程序不响应。 -
解决方法:当使用
CaviumSignature
类、CaviumCipher
类、CaviumMac
类或CaviumKeyAgreement
类时,您应提供CaviumKey
密钥而不是标准 JCE 密钥作为对象。您可以使用
ImportKey
类将普通密钥手动转换为 CaviumKey
,并在之后可在操作完成后手动删除该密钥。 -
解决状态:我们正在更新
CaviumProvider
以正确管理隐式导入。当该修复可用时,将在版本历史记录页面中公布。
问题:JCE 密钥库为只读
-
影响:您目前无法将 HSM 不支持的对象类型存储在 JCE 密钥库中。具体来说,您不能在密钥存储中存储证书。这会阻止与 jarsigner 之类的工具的互操作性,这些工具预期在密钥库中查找证书。
-
解决方法:您可以修改您的代码,以从本地文件或 S3 存储桶位置中加载证书,而不是从密钥存储中加载。
-
解决状态:我们正在增加在密钥存储中存储证书的支持。当该功能可用时,将在版本历史记录页面中公布。
问题:要进行 AES-GCM 加密的缓冲区不能超过 16,000 字节
此外,多部分 AES-GCM 加密不受支持。
-
影响:您不能使用 AES-GCM 加密大于 16,000 字节的数据。
-
解决方法:您可以使用一个替代机制(如 AES-CBC),也可以将数据拆分为多个部分并为各个部分分别加密。如果您拆分了数据,则必须管理已拆分的密文及其解密内容。由于 FIPS 要求在 HSM 上生成 AES-GCM 的初始化向量 (IV),因此每个 AES-GCM 加密的数据片段的 IV 将有所不同。
-
解决状态:我们正在修复开发工具包,以在数据缓冲区过大时显式失败。我们正在评估支持较大的缓冲区而不依靠多部分加密的替代方法。将在 AWS CloudHSM 论坛和版本历史记录页面中公布更新。
问题:在 HSM 内部分执行椭圆曲线迪菲-赫尔曼 (ECDH, Elliptic-curve Diffie-Hellman) 密钥派生
您的 EC 私有密钥始终保留在 HSM 中,但密钥派生过程分多步执行。因此,客户端上可以提供每个步骤的中间结果。Java 代码示例中提供了 ECDH 密钥派生示例。
-
影响:Client SDK 3 为 JCE 增加了 ECDH 功能。当您使用
KeyAgreement
类派生 SecretKey 时,它首先在客户端上可用,然后导入到 HSM 中。密钥句柄随后会返回到您的应用程序。 -
解决办法:如果要在 AWS CloudHSM 中实施 SSL/TLS 分载,此限制可能不是问题。如果您的应用程序需要将您的密钥始终保持在 FIPS 边界内,请考虑使用不依赖 ECDH 密钥派生的替代协议。
-
解决状态:我们正在开发完全在 HSM 内部执行 ECDH 密钥派生的选项。如果可用,我们将在版本历史记录页面上公布更新的实现。
问题:KeyGenerator 和 KeyAttribute 错误地将密钥大小参数解释为字节数而不是比特位数
使用 KeyGenerator classinit
函数或 AWS CloudHSM KeyAttribute enum 的 SIZE
属性生成密钥时,API 错误地预期参数为密钥字节数,但该参数应为密钥比特位数。
-
影响: 客户端软件开发工具包版本 5.4.0 至 5.4.2 错误地预期以字节形式提供给指定 API 的密钥大小。
-
变通方法:如果使用客户端软件开发工具包版本 5.4.0 到 5.4.2,则在使用 AWS CloudHSM JCE 提供程序通过 KeyGenerator class 或 KeyAttribute enum 生成密钥之前,请将密钥大小从比特位转换为字节。
-
解决状态:将您的客户端软件开发工具包版本升级到 5.5.0 或更高版本,其中包括一项修复,以在使用 KeyGenerator class 或 KeyAttribute enum 生成密钥时正确预期密钥大小。
问题:客户端软件开发工具包 5 抛出警告“发生了非法的反射访问操作”
在 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 ```
这些警告没有任何影响。我们已经意识到这个问题,并正在努力解决它。无需任何解决方案或变通办法。
问题:JCE 会话池已用尽
影响:看到以下消息后,您可能无法在 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 操作,然后才能丢失对该操作的引用。
注意
根据操作的不同,可能需要一种完成方法。
操作 完成方法 密码 在加密或解密模式下的
doFinal()
在包装模式下的
wrap()
在解包模式下的
unwrap()
KeyAgreement generateSecret()
或generateSecret(String)
KeyPairGenerator generateKeyPair()
、genKeyPair()
或reset()
KeyStore 无需任何方法 MAC doFinal()
或reset()
MessageDigest digest()
或reset()
SecretKeyFactory 无需任何方法 SecureRandom 无需任何方法 签名 在签名模式下的
sign()
在验证模式下的
verify()
解决状态:我们已经在客户端软件开发工具包 5.9.0 及更高版本中解决了此问题。要修复此问题,请将您的客户端软件开发工具包升级到其中一个版本。
问题:Client SDK 5 因 getKey 操作而发生内存泄漏
-
影响:在 Client SDK 版本 5.10.0 及更早版本中,API
getKey
操作在 JCE 中存在内存泄漏。如果您在应用程序中多次使用getKey
API,则会导致内存增长增加,从而增加应用程序中的内存占用量。随着时间推移,这可能会导致节流错误或需要重启应用程序。 -
解决办法:我们建议升级到 Client SDK 5.11.0。如果无法做到这一点,我们建议不要在应用程序中多次调用
getKey
API。相反,应尽可能重复使用先前getKey
操作中返回的密钥。 -
解决状态:将您的 Client SDK 版本升级到 5.11.0 或更高版本,其中包括针对此问题的修复。