2016-11-30 3 views
3

Я использую PackageDigitalSignatureManager для подписания Zip-файла и его содержимого. Мой код работает отлично, пока я не обновлен до .Net 4.6.2 вдруг я получаю следующее expection:RSACryptoServiceProvider «Ключ не существует» на .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/ Они упоминают изменение сертификата и код подписи, но я не уверен, что именно сломалось.

Есть ли у кого-нибудь идеи, как я могу это исправить? Может ли быть способ запуска моего приложения обратно совместимым способом?

+0

Я не думаю, что у вас есть минимальный репро? Это обновление должно исключать исключения, а не добавлять их ... – bartonjs

+0

Это то, о чем думает, но это не похоже на то, по крайней мере, в моем случае использования. В настоящее время код полностью поддерживается с другим кодом, который я не могу дать, я попытаюсь отделить его больше в ближайшие дни. – Bluuu

ответ

6

При создании экземпляра RSACryptoServiceProvider вам нужно указать CspParameters объект с указанным KeyContainerName:

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

Holy Sh *** t. Это действительно сработало! – Bluuu

+0

У меня был только новый RSACryptoServiceProvider(); без параметра before. – Bluuu

Смежные вопросы