【问题标题】:How can I protect the rsacryptoserviceprovider privatekey with a password and add it in windows store如何使用密码保护 rsacryptoserviceprovider 私钥并将其添加到 Windows 商店
【发布时间】:2021-05-27 11:39:35
【问题描述】:

我有一个公钥证书和一个私钥。在添加到 x509store 之前,我想用密码保护私钥。

我的要求是,当我使用主题名称从商店中找到 x509certificate2 时,我应该使用私钥获取证书。但是私钥应该受到密码保护,没有任何 ui 提示。

创建 rsacryptoservice 提供程序时,我尝试将密钥密码附加到 csp 参数,我可以创建 rsacryptoserviceprovider 对象。我已将其附加到 x509certificate2 并添加到 Windows 商店。但是从存储私钥检索后抛出加密异常。

var cspParams = new CspParameters
{
    ProviderType = 1,
    Flags = CspProviderFlags.UseMachineKeyStore
};

string passphrase = "password";
char[] passPhrase = passphrase.ToCharArray();
SecureString keyPassword = new SecureString();

for (int i = 0; i < passPhrase.Length; i++)
{
    keyPassword.AppendChar(passPhrase[i]);
}

cspParams.KeyPassword = keyPassword;
using (RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams))
{
    rsaProvider.ImportParameters(rsaParam);
    rsaProvider.PersistKeyInCsp = true;
    X509Certificate2 x509Certificate = new X509Certificate2(Convert.FromBase64String(cryptoCertificate),
            "123",
            X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable |
            X509KeyStorageFlags.PersistKeySet)
        {PrivateKey = rsaProvider};
        store.Add(x509Certificate);
}

【问题讨论】:

  • 你得到了什么错误?
  • 只有我一个人,但代码清单包含两个重复的代码部分?
  • 对于 PrivateKey 字段,CspKeyContainerInfo、KeySize 和 PublicOnly 字段会抛出加密异常。
  • 你能发布完整的异常和堆栈跟踪吗?
  • '((System.Security.Cryptography.RSACryptoServiceProvider)certificate.PrivateKey).CspKeyContainerInfo' 引发了“System.Security.Cryptography.CryptographicException”类型的异常

标签: c# rsa private-key x509certificate2


【解决方案1】:

问题出在这里:

using (RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams))
{
    rsaProvider.ImportParameters(rsaParam);
    rsaProvider.PersistKeyInCsp = true;
    X509Certificate2 x509Certificate = new X509Certificate2(<...>)
        {PrivateKey = rsaProvider};
        <..>
}

您正在创建一个新的 RSA 非对称密钥对并尝试将其附加到证书。但是,此密钥对是全新的,与证书中存储的公钥不匹配。相反,您必须从X509Certificate2 对象获取私钥句柄并对其进行处理,不要创建新密钥,它将永远无法工作。

不要使用RSACryptoServiceProvider,它已经过时了。相反,您必须使用X509Certificate.GetRSAPrivateKey() 扩展方法来获取RSA 类的实例并从该RSA 对象中提取CSP 参数。

【讨论】:

  • 如果我从 CSPParameter 中删除了 keypassword 属性,它将对我正常工作。var cspParams = new CspParameters { ProviderType = 1, Flags = CspProviderFlags.UseMachineKeyStore,KeyContername= Guid.NewGuid().ToString( ).ToUpperInvariant() };使用此代码,我可以将私钥附加到 x509certificate 并能够将其添加到商店。添加到商店后,我也可以读取私钥。但我想用密码保护 iprivatekey。这就是我使用 KeyPassword 的原因.但不幸的是它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多