如何在HSM中包装Microsoft RSA密钥blob

时间:2013-02-11 23:43:29

标签: rsa pkcs#11 hsm nshield

我需要在HSM中包装RSAPrivateKey,以便可以将其发送到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中有一些功能我忽略了允许我这样做?任何见解都将不胜感激。

3 个答案:

答案 0 :(得分:2)

我同意这看起来像是nShield HSM不支持的数据格式(尽管可能值得用support team仔细检查)。

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

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

我建议您就此问题与支持小组联系。你甚至可以找到一些友好的顾问,咳嗽,谁可以帮助你。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

如果这是不受支持的专有格式,您可能必须在HSM中运行专有代码才能实现此目的。许多HSM允许您运行专有代码,但您需要HSM提供商的支持才能首先加载代码。此外,在HSM中运行您自己的代码可能会破坏安全认证(FIPS或Common Criteria)。

否则,您必须从HSM检索私钥,在安全环境中将其置于正确的格式,并使用HSM的常规加密功能将其包装。这当然会在HSM之外公开私钥。

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