【问题标题】:RSACryptoServiceProvider "Key does not exist" on .Net 4.6.2.Net 4.6.2 上的 RSACryptoServiceProvider“密钥不存在”
【发布时间】:2016-11-30 17:27:15
【问题描述】:

我正在使用 PackageDigitalSignatureManager 对 Zip 文件及其内容进行签名。 我的代码运行良好,直到我更新到 .Net 4.6.2 突然我得到以下期望:

System.Security.Cryptography.CryptographicException: Key does not exist 
bei System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
bei System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
bei System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] rgbHash, Int32 calgHash)
bei System.Security.Cryptography.RSAPKCS1SignatureFormatter.CreateSignature(Byte[] rgbHash)
bei System.Security.Cryptography.AsymmetricSignatureFormatter.CreateSignature(HashAlgorithm hash)
bei System.Security.Cryptography.Xml.SignedXml.ComputeSignature()
bei MS.Internal.IO.Packaging.XmlDigitalSignatureProcessor.Sign(IEnumerable`1 parts, IEnumerable`1 relationshipSelectors, X509Certificate2 signer, String signatureId, Boolean embedCertificate, IEnumerable`1 signatureObjects, IEnumerable`1 objectReferences)
bei System.IO.Packaging.PackageDigitalSignatureManager.Sign(IEnumerable`1 parts, X509Certificate certificate, IEnumerable`1 relationshipSelectors, String signatureId, IEnumerable`1 signatureObjects, IEnumerable`1 objectReferences)
bei System.IO.Packaging.PackageDigitalSignatureManager.Sign(IEnumerable`1 parts, X509Certificate certificate, IEnumerable`1 relationshipSelectors, String signatureId)
bei System.IO.Packaging.PackageDigitalSignatureManager.Sign(IEnumerable`1 parts, X509Certificate certificate, IEnumerable`1 relationshipSelectors)

我使用的证书和私钥以及我使用的签名代码在过去几个月中根本没有改变。 唯一的变化是切换到 .Net 4.6.2。

在找到这篇文章之前,我不确定发生了什么:https://blogs.msdn.microsoft.com/dotnet/2016/08/02/announcing-net-framework-4-6-2/ 他们提到更改证书和签名代码,但我不确定到底是什么坏了。

有人知道我该如何解决这个问题吗? 有没有办法以向后兼容的方式运行我的应用程序?

【问题讨论】:

  • 我不认为你有一个最小的复制?该升级应该消除异常,而不是添加它们......
  • 这也是一个想法,但似乎不是这样,至少在我的用例中是这样。目前该代码与我无法提供的其他代码相当支持,我将在未来几天尝试将其更多地分开。

标签: c# x509certificate2 rsacryptoserviceprovider


【解决方案1】:

创建 RSACryptoServiceProvider 的实例时,您需要使用指定的 KeyContainerName 指定 CspParameters 对象:

var cp = new CspParameters();
cp.KeyContainerName = "WhateverKeyContainerName";
var privateKey = new RSACryptoServiceProvider(cp);

【讨论】:

  • 我刚刚有了新的 RSACryptoServiceProvider();之前没有参数。
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 2021-10-24
  • 2020-12-26
  • 2016-05-28
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多