我使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了一个 RSA 公私钥对。我想导出密钥对。我使用 Findobject API 来获取密钥,API 返回一个 ObjectHandle ,在使用 GetAttributeValue API 读取属性时,我无法读取密钥的值。当我将密钥的属性设置为 CKA_EXTRACTABLE 为 true 时,我无法完全生成密钥。
我还需要在 HSM 中导入外部提供的密钥对。
非常感谢任何帮助。
我使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了一个 RSA 公私钥对。我想导出密钥对。我使用 Findobject API 来获取密钥,API 返回一个 ObjectHandle ,在使用 GetAttributeValue API 读取属性时,我无法读取密钥的值。当我将密钥的属性设置为 CKA_EXTRACTABLE 为 true 时,我无法完全生成密钥。
我还需要在 HSM 中导入外部提供的密钥对。
非常感谢任何帮助。
insecure
在 HSM 世界中考虑您正在尝试做的事情。它违背了拥有 HSM 的目的。
但是,能做到吗?是的。前提是 HSM 供应商应该支持它。
HSM 供应商决定在 HSM 上生成的密钥是否可以提取,或者是否可以将由任何软件(在 HSM 之外)生成的任何密钥导入硬件。PKCS#11 只是您与 HSM 交互的接口。如果 HSM 不支持某个操作,它会引发一个异常,该异常最终由 PKCS11 api 引发。
这就是您的提取和导入操作所发生的情况。您尝试执行这些操作的 HSM 可能不支持它。因此,您需要与 HSM 供应商核实如何在他们的产品上执行这些操作。
PS:Thales nShield 应该/可能有一个配置文件,您可以通过它在不安全模式下运行 HSM。
注意:提取Key/Key Pair
在 HSM 上生成的(或)导入在 HSM 之外生成的任何密钥/密钥对在现实世界中不被视为不安全的操作。
我认为您使用的是 Safenet HSM,因为 Thales HSM 没有 GetAttributeValue、ObjectHandle 等功能。
CKA_EXTRACTABLE 表示您可以在另一个密钥下提取您的密钥,这并不意味着 您可以读取密钥数据。如果仅使用密钥句柄就可以获取密钥数据,那应该是完全不安全的。
即使在功能模块 (FM) 中也无法使用 ObjectHandle 读取关键数据。FM 是仅在 Safenet HSM 本身中运行的专有软件,它是运行 HSM 硬件的嵌入式软件。您可以使用 ObjectHandle 调用特定的 HSM 函数,如 FM 中的加密、解密。只有在另一个密钥下才能提取密钥。
您可以使用 Safenet HSM 函数调用来导入您的密钥。
RSA 私钥可以通过正确的属性设置导出(当然这种情况必须由 HSM 供应商提供的非托管 PKCS#11 库支持),但您需要读取多个属性(参见PKCS#11 v2的第 12.1.3 章.20 规范)提取其部分,然后自行创建密钥的 ASN.1 结构。
您需要的 ASN.1 结构的特定类型取决于您使用的密钥类型(在您的情况下是 RSA)以及将使用密钥的目标系统的功能,即加密应用程序通常使用与电子邮件代理等不同的格式. 我相信你可以从PKCS#1RSAPrivateKey
中定义的结构开始。