如何将 3DES 密钥从 FIPS 迁移到非 FIPS 的 AWS CloudHSM 集群
关键要点
在此文章中,我们将介绍如何安全迁移 3DESTriple Data Encryption Standard密钥,从 FIPS 模式的 CloudHSM 集群迁移到非 FIPS 模式的新 CloudHSM 集群。本文的关键点包括: 了解最新的 AWS CloudHSM 硬件安全模块实例类型 hsm2 的新特性。 按照步骤正确迁移 3DES 密钥,并确保密钥安全性。 注意密钥属性和合规性的影响。
在 2024 年 8 月 20 日,AWS 宣布了新的 AWS CloudHSM 硬件安全模块HSM实例类型 hsm2mmedium 的一般可用性。该类型相较于之前的 hsm1medium 类型,提供了更多附加功能,包括: 支持联邦信息处理标准FIPS1403第3级 运行 CloudHSM 集群的非 FIPS 模式 增加了 16666 个密钥的存储容量 支持 CloudHSM 客户端 SDK 与 CloudHSM 集群之间的互信传输层安全mTLS
以下是如何在不使用备份的情况下,将 3DES 密钥从 hsm1 CloudHSM 集群迁移到非 FIPS 模式的 hsm2 集群的步骤。
CloudHSM 和 3DES 密钥
美国国家标准与技术研究院NIST于 2024 年 1 月 1 日撤回了 特刊 80067 第2版,这意味着 3DES 不再是 FIPS 认证的区块密码,无法用于加密保护即加密、密钥包裹和消息认证码MAC的生成。
小熊加速器最新版本建议使用 3DES 的客户: 将工作负载迁移到被 FIPS 认证的现代对称区块密码高级加密标准AES 如果在支付处理中使用 3DES,考虑将工作负载迁移到 AWS Payment Cryptography 服务
然而,如果迁移到不同的加密算法或加密服务不切实际,并且您打算继续使用 3DES,您可以使用运行在非 FIPS 模式的 hsm2 集群来管理您的 3DES 密钥,并利用新 hsm2 的好处。
请注意,迁移到非 FIPS CloudHSM 集群可能会影响您的合规性。如果某个监管标准或认证要求您使用符合 FIPS 的加密模块,这可能会影响您。创建非 FIPS 集群时,底层的 FIPS 认证 HSM 将配置为运行在非 FIPS 模式。请在迁移到非 FIPS CloudHSM 集群之前仔细考虑这些问题。有关 hsm1 和 hsm2 的认证及合规要求,请参见 AWS CloudHSM 集群模式和 HSM 类型。
通常,您可以通过使用现有备份从 CloudHSM 集群迁移密钥。但您无法通过 hsm1 集群备份将密钥迁移到非 FIPS hsm2 集群。这是因为 CloudHSM 不允许您将合规模式从 FIPS 更改为非 FIPS。然而,存在一种替代方法可以在不使用备份的情况下迁移密钥。接下来的解决方案指导将向您展示如何使用 RSAAES 包裹机制,迁移密钥而不将密钥材料以明文形式暴露在 CloudHSM 边界外。RSAAES 机制提供了迁移大尺寸密钥的优势,同时避免通常与非对称 RSA 密钥对相关的有效负载大小限制。
解决方案概述
此解决方案使用 CloudHSM CLI 执行密钥迁移命令,针对源和目标 CloudHSM 集群。以下是解决方案涉及的步骤概述。
工作流程如下:1 在 CloudHSM hsm2 中生成 RSA 包裹密钥对。2 将 RSA 公钥导出到 hsm2 CloudHSM 客户端实例。3 将 RSA 公钥移至 CloudHSM hsm1 客户端实例。4 将 RSA 公钥导入到 CloudHSM hsm1。5 使用导入的 RSA 公钥包裹指定密钥。6 将包裹密钥移动到 CloudHSM hsm2 客户端实例。7 使用 RSA 私钥在 hsm2 中解包密钥。

尽管本帖中使用的步骤是特定于 CloudHSM CLI,但相同的过程也可以与其他 CloudHSM SDK 一起使用,例如 Java 密码库JCE和 PKCS #11 库。
重要注意事项
在迁移加密密钥时需要考虑的一些重要事项包括: 可导出密钥 该解决方案仅适用于 可导出 密钥将属性 extractable 设置为“true”的密钥。如果需要迁移不可提取的密钥,您必须进行轮换:在 CloudHSM hsm2 集群中生成新密钥,使用来自 hsm1 的旧密钥解密数据,然后使用 hsm2 中的新密钥重新加密数据。如果可能,请使用 AES 等高级密钥进行重新加密。 密钥拥有权 当密钥迁移到新集群时,解包密钥的加密用户将成为密钥的拥有者。您需要确保适当的加密用户正在迁移密钥,并确保依赖这些密钥的应用程序使用的是正确的加密用户凭据。您还可以在迁移后 共享 解包的密钥与适当的加密用户,以防止由于密钥迁移而影响应用程序的可用性。您可以使用以下任一策略管理迁移过程中的密钥拥有权: 推荐的策略是首先在 hsm2 集群中使用 CloudHSM CLI 创建 所需的 加密用户,然后每个用户使用自己在 hsm1 中拥有的密钥迁移所需的密钥。您可以为每个加密用户创建单独的包裹密钥对,或者使用与所需加密用户共享的一个包裹密钥对进行迁移。 另一种策略是让一个加密用户迁移所需的密钥,然后在迁移后 共享 已迁移的密钥给适当的加密用户。请注意,已共享密钥存在 限制,例如接收的加密用户无法修改或共享密钥。 密钥属性 当密钥迁移时,只有在解包操作期间指定的属性才会设置在密钥上。请确保确认来自 hsm1 的密钥属性,并在 hsm2 中解包时设置这些属性。请注意,有些属性如 extractable只能在密钥创建或解包时设置,但其他属性可以在创建后通过 key setattribute 设置。有关属性的列表以及何时可以设置它们,请参见 CloudHSM CLI 的密钥属性。您可以使用 CloudHSM CLI key list 命令和 verbose 参数列出加密用户拥有的密钥及其属性。 HSM 备份 建议在确认所有必需的密钥已迁移到 hsm2 之前,保留 hsm1 的备份。您可以配置 CloudHSM 备份保留策略来管理备份。请注意,CloudHSM 不会删除集群的最后一个备份。有关更多信息,请参见 配置 AWS CloudHSM 备份保留策略。您还可以按照 共享备份中所述将 CloudHSM 备份与其他 AWS 账户共享。
前提条件
要实施解决方案,您需要具备以下前提条件:1 一个活动的 CloudHSM hsm1 集群,至少有一个活动 HSM。2 hsm1 中密钥拥有者的 加密用户 凭据。3 一台安装了 CloudHSM CLI 并配置为连接到 CloudHSM 集群的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。有关如何配置并连接客户端实例的说明,请参见 AWS CloudHSM 入门。4 一个活动的 CloudHSM hsm2 集群,至少有一个活动 HSM 和有效的 加密用户。如前所述,在 密钥拥有权 的说明中,确保在 hsm2 中创建加密用户并拥有迁移后的密钥。5 另一个安装了 CloudHSM CLI 的 EC2 实例,并配置为连接到 hsm2 集群。有关如何配置并连接客户端实例的说明,请参见 AWS CloudHSM 入门。6 一个希望从 hsm1 迁移的可导出密钥列表及其属性。您可以使用 key list 命令和 verbose 参数来列出加密用户拥有的密钥。输出将包含密钥属性,如 label、extractable 和 keytype。您还可以将 filter 参数传递给命令,以按 label 或 keytype 列出特定密钥,例如 3des。列出 3DES 密钥及其属性的 CloudHSM CLI 命令如下:
bashkey list filter attrkeytype=3des verbose
如前所述,某些属性如 extractable只能在密钥创建或解包时设置,而其他属性则可以在创建后使用 key setattribute 命令设置。
请注意: 您可以配置 CloudHSM CLI 以 连接到多个集群。您可以使用带有 CloudHSM CLI 的单个 EC2 实例从一个集群迁移密钥到另一个集群,只要您能够从客户端实例设置一个网络路径到两个集群。 您可以通过以 交互模式 运行命令的 bash 脚本或类似方式来运行 CloudHSM CLI 命令。
步骤 1 在 hsm2 中生成 RSA 包裹密钥对
解决方案的第一步是在新的 CloudHSM hsm2 集群中使用 CloudHSM CLI 创建包裹密钥对。密钥对中的公钥将用于包裹,私钥将用于解包。请相应地为密钥对命名并记录其标签。
注意:如前所述,在 密钥拥有权 的说明中,选择合适的密钥迁移策略。生成包裹密钥对的加密用户或与之共享此密钥对的用户将在最后一步中解包密钥。
生成 RSA 包裹密钥对的步骤:1 登录到安装了 CloudHSM CLI 的 hsm2 客户端实例。运行以下命令以交互模式使用 CloudHSM CLI,如 CloudHSM 命令行界面入门 中所述:
bash/opt/cloudhsm/bin/cloudhsmcli interactive
使用您的加密用户凭据登录。确保将 ltCryptoUserNamegt 替换为您自己的信息,并在提示时提供密码。bashlogin username ltCryptoUserNamegt role cryptouser
运行以下 key generateasymmetricpair rsa 命令创建 RSA 密钥对。确保将 ltrsawrappingkeylabelgt 和 ltrsaunwrappingkeylabelgt 替换为您用于生成的公钥和私钥的标签。记录下公钥和私钥的标签,因为后续步骤需要此数据。bashkey generateasymmetricpair rsa publiclabel ltrsawrappingkeylabelgt privatelabel ltrsaunwrappingkeylabelgt modulussizebits 2048 publicexponent 65537 publicattributes wrap=true privateattributes unwrap=true
可选您可以使用标签过滤列出密钥,如 使用 CloudHSM CLI 过滤密钥 中所述:bashkey list filter attrlabel=ltrsaunwrappingkeygt
步骤 2 将 RSA 公钥导出到 hsm2 客户端实例
在此步骤中,您将从 hsm2 导出 RSA 公钥到 EC2 实例文件系统。
将 RSA 公钥导出到 hsm2 客户端实例的步骤:1 运行以下 key generatefile 命令以导出您在上一步中创建的 RSA 公钥。确保将 ltfilepathgt 和 ltrsawrappingkeylabelgt 替换为您自己的数据。导出的 RSA 公钥字节将以 PEM 格式写入您提供的 ltfilepathgt 中。
bashkey generatefile encoding pem path ltfilepathgt filter attrlabel=ltrsawrappingkeylabelgt
步骤 3 将 RSA 公钥移至 hsm1 客户端实例
现在,您需要将导出的公钥 PEM 文件从 hsm2 客户端实例复制到 hsm1 客户端实例。您可以使用企业文件传输解决方案或安全复制协议SCP。但是,如果您已配置 CloudHSM CLI 使用 连接到多个集群 特性连接到 hsm1 和 hsm2 集群,则可以跳过此步骤。
步骤 4 将 RSA 公钥导入到 hsm1
在此步骤中,您将导入复制到 hsm1 客户端实例的 RSA 公钥到 hsm1 集群。
在 hsm1 客户端实例中,作为加密用户登录 CloudHSM CLI。运行以下 key import pem 命令以导入公钥。将 ltfilepathgt 和 ltrsawrappingkeylabelgt 替换为您自己公钥 PEM 文件的路径和标签。
bashkey import pem path ltfilepathgt label ltrsawrappingkeylabelgt keytypeclass rsapublic attributes wrap=true
步骤 5 使用导入的 RSA 公钥包裹密钥
在此步骤中,您将包裹在 hsm1 中标识的密钥。请注意,只有拥有该密钥的加密用户才能解包。因此,您需要以该加密用户身份登录 hsm1 的 CloudHSM CLI。
运行以下 [key wrap rsaaes](https//docsawsamazoncom/cloudhsm/latest/userguide/cloud