CryptographicException не было обработано: система не может найти указанный файл

Я пытаюсь постичь тайны связи SSL и нашел отличное руководство по этот сайт. Я пытался проверить свой сертификат. Используя Visual Studio 2012, я просто добавил существующий файл (мой сертификат в формате .pfx), а затем изменил параметры «сертификат» и «пароль» в app.config. Однако при попытке запустить я получил ошибку:

CryptographicException не было обработано: система не может найти указанный файл

Затем я попробовал то же самое в своем веб-сервисе. Там я получил более подробную информацию об ошибке:

System.Security.Cryptography.CryptographicException: System cannot find specified file.

   at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
   v System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   v TestServer.DataService.LoadSoap() v c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TestServer\TestServer\DataService.asmx.cs:line 48

Я написал этот вопрос автору статьи, но, поскольку его последний ответ был в марте 2012 года, я не уверен, ответит ли он. Если бы кто-нибудь мог мне помочь с этой проблемой, я был бы очень признателен.

P.S .: При экспорте сертификата из .cer в .pfx я изменил название экспортируемого файла. Хотя я сомневаюсь, что это повлияет на проблему, я лучше упомяну об этом.


person Storm    schedule 24.07.2013    source источник
comment
Вы указываете полный путь к файлу?   -  person gtrig    schedule 24.07.2013
comment
Вау ... теперь я чувствую себя полным идиотом. После указания полного пути он работает ... ну, клиент говорит, что сертификат недействителен, но это, вероятно, потому, что он был выпущен для моего старого компьютера. Итак, спасибо ... Думаю, эту тему можно закрыть как неконструктивную.   -  person Storm    schedule 24.07.2013


Ответы (5)


Вы установили следующее в пуле приложений в IIS?

  1. Перейти к диспетчеру IIS
  2. Перейти к экземпляру пула приложений
  3. Нажмите расширенные настройки
  4. В разделе «Модель процесса» установите для параметра «Загрузить профиль пользователя» значение «истина».

См. Этот вопрос о стеке для дальнейшего чтения: Что именно происходит, когда Я установил LoadUserProfile для пула IIS?

person nologo    schedule 02.12.2014
comment
stackoverflow.com/questions/17149132/ - person nologo; 10.03.2016
comment
Спасибо, сэр! Я много месяцев боролся с этой ошибкой. Необходимость перезапуска сервера или перезапуска IIS, чтобы «успеть» до того, как ошибка снова начала появляться. - person Miquel Coll; 14.03.2016
comment
О мой Бог. Какая абсурдная ошибка !! Я попробовал проверить и проверить и не нашел ничего неправильного в имени файла. *** t исключение криптографии, говорящее о неправильном пути к файлу, хотя на самом деле это не так - person Hoàng Long; 15.03.2016
comment
если это не сработает для вас, просто дважды проверьте, что вы устанавливаете для него значение true в правом пуле приложений. (сначала проверьте, какой пул приложений назначен вашему приложению) - person Iman; 07.05.2019
comment
var key = CngKey.Import(Convert.FromBase64String(secretKey), CngKeyBlobFormat.Pkcs8PrivateBlob); Я загружал закрытый ключ (из строки base64, без пути) и получил эту ошибку. Ответ спас мне дни !! Спасибо - person Matteo Gaggiano; 10.09.2020
comment
В Azure: используйте настройки приложения - ›Добавьте WEBSITE_LOAD_USER_PROFILE со значением 1. - person hanzolo; 30.09.2020

Для тех из вас, кто получил Cryptographic Exception при попытке импортировать X509Certificate2 с помощью метода Import, я обнаружил, что использование параметра Enum для MachineKeySet обошло необходимость создания userContext в IIS и, следовательно, его проще реализовать.

X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase, 
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
person Salomon Arias    schedule 12.01.2018
comment
Просто сделай это и будь счастлив. Тверкинг с IIS у меня не работал в Windows 10 2004. Я пробовал все возможные комбинации. Это сработало как шарм - person Daniel Dolz; 22.08.2020

Передав CspParameters с флагом csdMachineKeyKeyStore, IIS может обойти ограничение, вызывающее исключение.

CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams);

Я нашел здесь решение:

Ссылка на информационный ресурс

person Alejandro PC    schedule 20.05.2017
comment
У меня недостаточно слов, чтобы описать благодарность, которую я испытываю к вам за это простое решение! Спасибо!! В моем случае все работало нормально локально, но на лазурном я получал сообщение об ошибке .. не могу найти указанный файл. Это исправило это - person Reath; 19.11.2018

Поскольку этот вопрос имеет высокий рейтинг поиска, я хотел бы представить способ представления X509Certificate2 с абсолютным путем (который он принимает только) к относительно расположенному ключевому файлу pxf в приложении ASP.net.

    string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx";

    X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
person m12lrpv    schedule 15.09.2015
comment
Эпический улов. Оказывается, вся причина, по которой я получил эту ошибку, заключалась в том, что мой путь к моему сертификату был немного сбит. - person Suamere; 04.01.2018

Вам нужно указать абсолютный путь вместо относительного пути.

AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"
person Community    schedule 26.06.2019