【发布时间】:2018-12-12 11:14:24
【问题描述】:
我们正在尝试将使用 C# 和 PKCS#11 的 RSA 密钥对导入我们的 HSM。使用以下方式导入私钥:
var privateKeyAttributes = new List<ObjectAttribute>();
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, ckaId));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SENSITIVE, true));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_DECRYPT, true));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN, true));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_SIGN_RECOVER, true));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_UNWRAP, true));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_MODULUS, privateKeyParams.Modulus));
privateKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE_EXPONENT, privateKeyParams.D));
var privateKeyHandle = session.CreateObject(privateKeyAttributes);
失败,错误代码CKR_TEMPLATE_INCONSISTENT。不幸的是,它没有说明不一致的地方。我尝试了各种其他属性组合,但总是失败:-(
如何通过PKCS#11正确导入私钥?
注意:使用非常相似的代码导入公钥:
var publicKeyAttributes = new List<ObjectAttribute>();
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ID, ckaId));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, ckaId));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PUBLIC_KEY));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PRIVATE, true));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_ENCRYPT, true));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY, true));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_VERIFY_RECOVER, true));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_WRAP, true));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_MODULUS, publicKeyParams.Modulus));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_PUBLIC_EXPONENT, publicKeyParams.Exponent));
var publicKeyHandle = session.CreateObject(publicKeyAttributes);
【问题讨论】:
-
真的不能像这样直接导入私钥,而必须对其进行包装/解包吗?
-
这取决于 HSM 供应商。但是,是的,大多数供应商不允许将密钥(秘密/私有)从软件直接导入 HSM。它必须被包装和打开。
-
你知道如何导入 RSA 私钥吗?我只找到了导入密钥(只是一个字节 blob)的示例。一个 RSA 私钥由多个 blob 组成,我不知道如何将其解包到 HSM 上。
-
私钥也可以提取为单个 blob。你需要看看如何在 c# 中做到这一点。
-
是的,但是 PKCS#11 需要哪种格式来解开密钥?
标签: c# rsa pkcs#11 pkcs11interop