根据设计,使用HSM,您不能“将私钥传递给第三方应用程序。”
摘要
使用CNG或Pkcs11Interop或任何其他替代方法登录到HSM,搜索私钥,然后将其传递给第三方应用程序以供使用。无法从HSM提取密钥或将其存储在内存中。
第三方应用程序需要使用存储在硬件安全模块(HSM)上的私钥。我研究了CNG和Pkcs11Interop的两种方法。
代码需要完成以下工作:
1-认证并与HSM建立会话
2-搜索密钥
3-使用RSACryptoServiceProvider或其他方法将私钥传递给第三者。
重要:无法从HSM中提取密钥,也不能直接访问密钥(出于安全目的设计)。
下面是我为CNG和PKCS11Interop汇总的两个样本
问题:
1-CNG我正在努力进行身份验证(如果可能)
2-PKCS11Interop,我已经能够登录,搜索密钥,但仍在努力使用密钥。
很高兴使用这两种方法,欢迎您提供任何帮助,替代解决方案或建议。
CNG代码
:当在HSM上禁用身份验证时,此代码有效Q。是否可以使用密码进行身份验证,在使用密钥之前打开会话?
如何将私钥传递到标准.Net Framework类型的AsymmetricAlgorithm?同时牢记它不可导出?可以将其传递给RSACryptoServiceProvider吗?然后到AsymmetricAlgorithm?CngProvider provider = new CngProvider("CNGProvider"); const string KeyName = "somekey"; key = CngKey.Open(KeyName, provider); Console.WriteLine("found the key!"); var cngRsa = new RSACng(key); var privateSshKey = new SshPrivateKey(cngRsa);
PKCS11Interop
,我设法进行身份验证,搜索密钥并将其分配给一个句柄。Q。
using (IPkcs11Library pkcs11Library = Settings.Factories.Pkcs11LibraryFactory.LoadPkcs11Library(Settings.Factories, Settings.Pkcs11LibraryPath, Settings.AppType)) { ISlot slot = Helpers.GetUsableSlot(pkcs11Library); using (ISession session = slot.OpenSession(SessionType.ReadWrite)) { //search for key try { const string keyname = "somekey"; // Login as normal user session.Login(CKU.CKU_USER, Settings.NormalUserPin); IObjectHandle publicKeyHandle = Helpers.CreateDataObject(session); IObjectHandle privateKeyHandle = Helpers.CreateDataObject(session); // Prepare attribute template that defines search criteria List<IObjectAttribute> privateKeyAttributes = new List<IObjectAttribute>(); privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY)); privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_KEY_TYPE, CKK.CKK_RSA)); privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_LABEL, keyname)); List<IObjectHandle> foundPrivateKeys = session.FindAllObjects(privateKeyAttributes); if (foundPrivateKeys == null || foundPrivateKeys.Count != 1) throw new Exception("Unable to find private key"); // Use found object handles privateKeyHandle = foundPrivateKeys[0]; session.FindObjectsFinal(); // How do i go about using the privatekey handle here? session.DestroyObject(privateKeyHandle); session.Logout(); } catch (Exception ex) { Console.WriteLine("Crypto error: " + ex.Message); } Console.WriteLine("done!"); System.Console.Write("[Hit Enter to Continue]"); System.Console.ReadLine(); } }
摘要使用CNG或Pkcs11Interop或任何其他替代方法登录到HSM,搜索私钥,然后将其传递给第三方应用程序以供使用。无法从HSM或...
根据设计,使用HSM,您不能“将私钥传递给第三方应用程序。”
您也不能在进程之间传递密钥handle
(尽管在某些实现中此might您的第三方应用程序需要通过使用可配置的加密库(例如OpenSSL(或类似的库),或者如果使用的是CNG,应允许您配置提供程序。)将加密操作卸载到HSM。
Q。是否可以使用密码进行身份验证,在使用密钥之前打开会话?
A。
:对于使用CNG的应用程序,您应该在配置它之后使用HSM供应商的CNG密钥存储提供程序(KSP)。然后,HSM供应商KSP会提示您输入密码,或者,如果您配置了提供程序(使用HSM供应商提供的实用程序或配置文件
)来存储密码/密码,它将可以正常工作。使用NCryptNative的eHSM示例代码:
:不,您不能传递密钥材料,也不能将原始PKCS11句柄传递给CNG框架。您要么必须使用PKCS11Interop函数来执行所有加密操作,要么必须在CNG中进行所有操作(按上述正确配置)。SafeNCryptProviderHandle handle; NCryptOpenStorageProvider(handle, "eHSM Key Storage Provider",0); ...
Q。
如何将私钥传递到标准.Net Framework类型的AsymmetricAlgorithm?同时牢记它不可导出?可以将其传递给RSACryptoServiceProvider吗?然后到AsymmetricAlgorithm?A。
要直接使用PKCS11接口,请继续使用键句柄(即,)调用PKCS11函数。
// How do i go about using the privatekey handle here?
// something like this
session.SignInit(mechanism, privateKeyHandle);
session.Sign(data, signature));
根据设计,使用HSM,您不能“将私钥传递给第三方应用程序。”