Ошибка ‘Не удается найти запрошенный объект’ при загрузке * закрытого ключа * в X509Certificate2 в .Net Core

#.net-core #x509certificate2

#.net-core #x509certificate2

Вопрос:

Мы используем систему.Безопасность.Компонент Cryptography.X509Certificates в приложении .Net Core и запуск этой ошибки при попытке загрузить закрытый ключ. Единственная функциональность, которая нам нужна для сертификата, — это расшифровать строку и проверить значение notAfter. Строка кода, в которой возникает ошибка, является:

 var cert = new X509Certificate2(privateKeyByteArr);
  

Исключение:

     Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException
  HResult=0x80092009
  Message=Cannot find the requested object
 Source=System.Security.Cryptography.X509Certificates  Cannot find the requested object
  StackTrace:
   at Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(Byte[] rawData, String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData)
   at Telematics.CommonUtilities.Services.RSACryptoService.DecryptKey(String key, Byte[] privateKeyByteArr) in D:UsersI25266SourceReposcommon utils feature btelematics.commonutilitiesTelematics.CommonUtilitiesServicesRSACryptoService.cs:line 383
  

Тот же подход отлично работает с открытым ключом, и этот же закрытый ключ может быть успешно использован с BouncyCastle. Я также пробовал метод импорта X509Certificate2Collection() — та же ошибка. Несмотря на то, что у нас есть обходной путь, я бы хотел использовать собственные компоненты .Net.

Любые предложения или объяснения были бы очень желательны.

Комментарии:

1. X509Certificate2(Byte[]) конструктор ожидает открытый сертификат, а не закрытый ключ. Вы пытались прочитать документацию: learn.microsoft.com/en-us/dotnet/api /… ?

2. Спасибо Crypt32 за ответ и разъяснения — я признаю, что в моем понимании есть пробел. Я заинтересован в использовании компонентов фреймворка вместо BouncyCastle для расшифровки с помощью закрытого ключа (массива байтов, загруженного из внешнего хранилища, а не файла). Документация (включая ту, на которую вы ссылаетесь) и сообщения, которые я прочитал, не указывают на краткий подход к выполнению этого. У вас есть какие-либо предложения?