首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用存储在由用户密码通过Pkcs11Interop或CNG保护的HSM上的私钥?

如何使用存储在由用户密码通过Pkcs11Interop或CNG保护的HSM上的私钥?
EN

Stack Overflow用户
提问于 2019-08-02 10:29:40
回答 1查看 906关注 0票数 1

摘要

使用CNG或Pkcs11Interop或任何其他选项登录HSM,搜索私钥,然后将其传递给第三方应用程序以供使用。无法从HSM中提取密钥或将其存储在内存中。

第三方应用程序需要使用存储在硬件安全模块(HSM)上的私钥。我研究了CNG和Pkcs11Interop两种方法。

代码需要完成以下工作:

1-验证和建立与HSM的会话。

2-搜索密钥

3-使用RSACryptoServiceProvider或其他方法将私钥传递给第三方。

重要的:密钥不能从HSM中提取或直接访问(为安全目的而设计)。

下面是我为CNG和PKCS11Interop收集的两个样本

问题:

1-CNG我正在努力验证(如果可能的话)

2-PKCS11Interop -我已经能够登录,搜索密钥,但难以使用密钥。

我很高兴使用这两种方法中的任何一种,并欢迎任何援助、替代解决方案或建议。

CNG代码:此代码在HSM上禁用身份验证时工作。

Q.是否有一种使用密码进行身份验证的方法,在使用密钥之前打开会话?

代码语言:javascript
复制
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,I设法验证、搜索密钥并将其分配给句柄。

Q.如何将私钥传递给标准的.Net框架类型AsymmetricAlgorithm?同时记住它不能被出口?它能传递给RSACryptoServiceProvider吗?然后上AsymmetricAlgorithm?

代码语言:javascript
复制
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();

                    }
                }
EN

回答 1

Stack Overflow用户

发布于 2019-10-19 08:47:40

使用HSM,通过设计,您不能“将私钥传递给第三方应用程序”。

您也不能在进程之间传递密钥句柄(尽管这在某些实现中可能有效--键句柄应该是特定于PKCS11会话的)。

您的第三方应用程序需要通过使用可配置的密码库(如OpenSSL (或类似的))将密码操作卸载到HSM,或者如果它使用CNG,则应该允许您配置提供程序。

Q.是否有一种使用密码进行身份验证的方法,在使用密钥之前打开会话?

A.:对于使用CNG的应用程序,在配置完CNG密钥存储提供者(KSP)之后,您应该使用have中的CNG密钥存储提供者(KSP)。

HSM将提示输入密码,或者,如果您配置了提供者(使用来自HSM供应商的实用程序或配置文件)来存储密码/引脚,则它将只起作用。

使用eHSM示例代码NCryptNative:

代码语言:javascript
复制
    SafeNCryptProviderHandle handle;
    NCryptOpenStorageProvider(handle, "eHSM Key Storage Provider",0);
    ...

Q.如何将私钥传递给标准的.Net框架类型AsymmetricAlgorithm?同时记住它不能被出口?它能传递给RSACryptoServiceProvider吗?然后上AsymmetricAlgorithm?

A.:不,您不能传递关键材料,也不能将原始PKCS11句柄传递给CNG。您必须使用PKCS11Interop函数来执行所有加密操作,或者必须在CNG中完成所有操作(正确配置如下所示)。

要直接使用PKCS11接口,您可以使用键句柄继续调用PKCS11函数,即。

代码语言:javascript
复制
    // How do i go about using the privatekey handle here?

    // something like this
    session.SignInit(mechanism, privateKeyHandle);
    session.Sign(data, signature));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57324676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档