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 я изменил заголовок экспортированного файла. Хотя я сомневаюсь в его влиянии на проблему, я бы предпочел упомянуть ее.
Ответы
Ответ 1
Вы установили следующее в пуле приложений в IIS?
- Перейдите в диспетчер IIS
- Перейти к экземпляру пула приложений
- Нажмите дополнительные настройки
- В разделе "Модель процесса" установите "Загрузить профиль пользователя" на "истина"
См. этот вопрос в стеке для дальнейшего чтения: Что именно происходит, когда я устанавливаю LoadUserProfile пула IIS?
Ответ 2
Для тех из вас, кто получил криптографическое исключение при попытке импортировать X509Certificate2 с использованием метода импорта, я обнаружил, что использование параметра Enum для MachineKeySet обошли необходимость создания userContext в IIS и, следовательно, его проще реализовать.
X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase,
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
Ответ 3
Поскольку этот вопрос имеет высокий рейтинг поиска, я хотел бы представить способ представления X509Certificate2 с абсолютным путем (который он принимает) только к относительно расположенному ключевому файлу pxf в приложении ASP.net.
string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx";
X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
Ответ 4
Передав CspParameters с флагом csdMachineKeyKeyStore, IIS может обойти ограничение, которое выдает исключение.
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams);
Я нашел решение здесь:
Ссылка на информационный ресурс
Ответ 5
Вам нужно указать абсолютный путь вместо относительного пути.
AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"