JCE 开发工具包的已知问题 - AWS CloudHSM

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

JCE 开发工具包的已知问题

问题:当使用非对称密钥对时,即使未显式创建或导入密钥,也会看到占用密钥容量

  • 影响:此问题可能导致 HSM 意外地耗尽密钥空间,并且当您的应用程序使用标准 JCE 密钥对象进行加密操作而不是 CaviumKey 对象时,会发生此问题。当您使用标准 JCE 密钥对象时,CaviumProvider 会将该密钥作为会话密钥隐式导入 HSM 中,并且在应用程序退出之前不会删除此密钥。因此,密钥会在应用程序运行时累积,并可能导致 HSM 耗尽空闲密钥空间,从而导致应用程序不响应。

  • 解决方法:当使用 CaviumSignature 类、 CaviumCipher 类、 CaviumMac 类或 CaviumKeyAgreement 类时,您应提供 CaviumKey 密钥而不是标准 JCE 密钥作为对象。

    您可以使用 ImportKey 类将普通密钥手动转换为 CaviumKey,并在之后可在操作完成后手动删除该密钥。

  • 解决状态:我们正在更新 CaviumProvider 以正确管理隐式导入。当该修复可用时,将在版本历史记录页面中公布。

问题:JCE KeyStore 是只读的

  • 影响:您目前无法将 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 密钥派生示例。

  • 影响:客户端 SDK 3 为 JCE 增加了 ECDH 功能。使用该KeyAgreement类派生 a 时 SecretKey,它首先在客户端上可用,然后导入到 HSM 中。密钥句柄随后会返回到您的应用程序。

  • 解决办法:如果您在中实现 SSL/TLS 卸载 AWS CloudHSM,则此限制可能不是问题。如果您的应用程序需要将您的密钥始终保持在 FIPS 边界内,请考虑使用不依赖 ECDH 密钥派生的替代协议。

  • 解决状态:我们正在开发完全在 HSM 内部执行 ECDH 密钥派生的选项。如果可用,我们将在版本历史记录页面上公布更新的实现。

问题: KeyGenerator 并且 KeyAttribute 错误地将密钥大小参数解释为字节数而不是位

当使用KeyGenerator 类init函数或AWS CloudHSM KeyAttribute 枚举SIZE属性生成密钥时,API 错误地期望参数为密钥字节数,而应改为密钥位数。

  • 影响: 客户端软件开发工具包版本 5.4.0 至 5.4.2 错误地预期以字节形式提供给指定 API 的密钥大小。

  • 解决办法:如果使用客户端 SDK 版本 5.4.0 到 5.4.2,则在使用 KeyGenerator 类或 KeyAttribute 枚举使用 AWS CloudHSM JCE 提供程序生成密钥之前,请将密钥大小从位转换为字节。

  • 解析状态:将您的客户端 SDK 版本升级到 5.5.0 或更高版本,其中包括在使用 KeyGenerator 类或 KeyAttribute 枚举生成密钥时正确预期以位为单位的密钥大小的修复程序。

问题:客户端软件开发工具包 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 及更高版本中解决了此问题。要修复此问题,请将您的客户端软件开发工具包升级到其中一个版本。

问题:GetKey 操作导致客户端 SDK 5 内存泄漏

  • 影响:在客户端 SDK 版本 5.10.0 及更早版本中,API getKey 操作在 JCE 中存在内存泄漏。如果您在应用程序中多次使用 getKey API,则会导致内存增长增加,从而增加应用程序中的内存占用量。随着时间的推移,这可能会导致限制错误或需要重新启动应用程序。

  • 解决办法:我们建议升级到客户端 SDK 5.11.0。如果无法做到这一点,我们建议不要在您的应用程序中多次调用 getKey API。相反,应尽可能重复使用先前getKey操作中返回的密钥。

  • 解决状态:将您的客户端 SDK 版本升级到 5.11.0 或更高版本,其中包括此问题的修复程序。