3

我需要将 RSAPrivateKey 包装在 HSM 中,以便可以将其发送到 Microsoft CA 进行密钥存档,但我不确定要采取什么方法。

问题是 Microsoft RSA 密钥格式是专有的,似乎不受 pkcs11 或我公司使用的 nCipher HSM 的支持。

http://msdn.microsoft.com/en-us/library/cc250013.aspx

如果这只是一个 RSAPrivateKey,则可以直接在 HSM 中生成密钥对,在 HSM 中加载包装密钥,包装 RSAPrivateKey 并提取包装的密钥字节。显然,由于不支持这种密钥 blob 格式,我需要采取不同的方法。

我的第一个想法是扩展 RSAPrivateKey 并覆盖 getEncoded() 方法以返回此专有密钥格式。我正在使用 IAIK pkcs11 包装器,它为 Java 中的 pkcs11 提供高级 API,并且支持创建供应商定义的密钥类型。但是,供应商定义的密钥接口似乎只是为了方便扩展客户端代码中的内置密钥类型而存在,实际上并不允许修改 HSM 中的密钥编码。

第二个想法是使用 pkcs11 数据对象并将其简单地视为密钥 blob,然后使用包装密钥对其进行加密。这里同样的问题是,为了将私钥字节复制到数据对象中,似乎我需要将私钥字节提取到应用程序代码中,然后从那里创建数据对象,这违背了拥有的全部意义HSM 中的密钥。

我正在寻找这些方法的替代品,或者我忽略了 pkcs11 中的某些功能可以让我这样做?任何见解将不胜感激。

4

3 回答 3

2

我同意这看起来像是 nShield HSM 不支持的数据格式(尽管可能值得与支持团队再次检查)。

假设是这种情况,只有一种方法可以安全地执行此操作 - 必须使用更低级别的 API 来加载私钥并将其传递给在 HSM 中运行的一些定制代码(利用 CodeSafe 技术) ,这将公开密钥材料,将其转换为必要的格式并用包装密钥包装它。

任何其他方法都会导致主机上的密钥暴露。另外,如果您已生成具有合理(默认)权限的密钥,则无论如何都无法在不编写使用管理员卡集的定制代码的情况下公开密钥。

我建议您就该问题联系支持团队。你甚至可以联系到一些友好的顾问,咳咳,他们可以帮助你解决这个问题。

于 2013-02-12T08:25:06.017 回答
0

如果这是一种不受支持的专有格式,您可能必须在 HSM 中运行专有代码才能完成此操作。许多 HSM 允许您运行专有代码,但您需要 HSM 提供者的支持才能首先加载代码。此外,在 HSM 中运行您自己的代码可能会破坏安全认证(FIPS 或通用标准)。

否则,您将不得不从 HSM 检索私钥,将其放入安全环境中的正确格式,并使用 HSM 的常规加密工具对其进行包装。这当然会将私钥暴露在 HSM 之外。

您也可以询问微软是否有首选的解决方案。

于 2013-05-09T11:04:47.160 回答
0

您可能想要做的是使用 PKCS#11 包装器。我有点困惑您是否从 Java 中与 HSM 交互(因为您提到 IAIK 或 .Net,因为您想导出到 Microsoft RSAPrivateKey)。无论如何,PKCS11 包装器(Java 的 IAIK,.Net 的 NCryptoki)将允许您使用PKCS#11 v2.30与 HSM 进行通信,请确保检查包装器和 HSM 规范中支持的版本,因为版本之间可能存在不兼容性。

PKCS#11 允许您使用 C_GenerateKeyPair 函数在 HSM 中生成 RSA 密钥对。您必须指定一个机制 (RSA_PKCS_KEY_PAIR_GEN) 并提供两个模板,一个用于私钥,一个用于公钥。确保私钥的 CKA_WRAP 属性设置为 true。

要在 HSM 中加载包装密钥,可以将函数 C_CreateObject 与模板结合使用。

然后,您可以使用 C_WrapKey 函数将私有 RSA 密钥与您导入 HSM 的密钥一起包装。首先使用 C_FindObjectsInit、C_FindObjects 和 C_FindObjectsFinal 检索要包装的键和包装键的句柄。然后使用适当的 Mechanism 和两个句柄调用 C_WrapKey 函数。

于 2013-02-14T10:49:53.523 回答