RSACryptoServiceProvider Система CryptographicException не может найти файл, указанный в ASP.NET

У меня есть приложение, которое использует RSACryptoServiceProvider для дешифрования некоторых данных с использованием известного закрытого ключа (хранится в переменной).

Когда пул приложений IIS настроен на использование сетевой службы, все работает нормально.

Однако, когда мы настраиваем пул приложений IIS для запуска кода под другим удостоверением, мы получаем следующее:

System.Security.Cryptography.CryptographicException: The system cannot find the file specified.

   at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters parameters)
   at System.Security.Cryptography.RSA.FromXmlString(String xmlString)

Код выглядит примерно так:

byte[] input; 
byte[] output; 
string private_key_xml; 

var provider = new System.Cryptography.RSACryptoServiceProvider(this.m_key.Key_Size);
provider.FromXmlString(private_key_xml); // Fails Here when Application Pool Identity != Network Service

ouput = provider.Decrypt(input, false); // False = Use PKCS#1 v1.5 Padding

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

Среда: IIS 6.0, Windows Server 2003 R2, .NET 3.5 SP1

Ответы на вопрос(4)

Попробуйте установить

System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;

EDIT: Тогда попробуйте использовать

var provider = new System.Security.Cryptography.RSACryptoServiceProvider();

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

 07 апр. 2014 г., 15:37
Это также исправило мою ошибку «Доступ запрещен» при создании экземпляра RSACryptoServiceProvider.
 17 авг. 2009 г., 22:31
это ничего не изменило.
 06 сент. 2010 г., 11:12
Это работало для меня на IIS7 с идентификатором apppool по умолчанию.
 08 окт. 2010 г., 11:39
Похоже, что вы также можете вызвать «новый RSACryptoServiceProvider (новые CspParameters {Flags = CspProviderFlags.UseMachineKeyStore})» & quot; если вы не хотите включать флаг в глобальном масштабе.

Загрузить профиль пользователя & quot; в значение True (было неверно) в разделе «Дополнительные параметры / Модель процесса пула приложений».

Приложение отлично работало на Server 2003 R2 / IIS 6, и проблема возникла, когда я настраивал его на нашем новом сервере 2008 R2.

Есть идея попробовать это на:

http://social.msdn.microsoft.com/forums/en-US/clr/thread/7ea48fd0-8d6b-43ed-b272-1a0249ae490f/

YMMV

 26 июн. 2014 г., 09:59
Спасибо! Была эта проблема только на производстве, и это исправило ее.
 14 июн. 2012 г., 00:11
Это потому, что ключи хранятся в DPAPIsecurity.stackexchange.com/q/1771/396
 15 июл. 2013 г., 18:22
Спасибо, у меня работало на сервере, но не локально, бродить почему. Я прочитал, что эта функция пытается получить доступ к хранилищу ключей и завершается неудачей из-за разрешений, даже если код не использует хранилище ключей.
 10 апр. 2012 г., 00:18
Это сработало для меня, спасибо! :)
 16 июл. 2013 г., 12:44
Хорошо, я выяснил, почему это не сработало на моей машине. Это потому, что я использовал пул приложений, который уже использовался и для других приложений. Я не совсем уверен, почему это вызвало проблему, но когда я установил выделенный пул приложений, это сработало!
Решение Вопроса

CspParameters _cpsParameter;
RSACryptoServiceProvider RSAProvider;

_cpsParameter = new CspParameters();
_cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore;

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

Следующие пользователи должны иметь доступ к папке: C: \ Documents and Settings \ All Users \ Данные приложения \ Microsoft \ Crypto \ RSA \ MachineKeys

IIS user account (anonymmous) The user account you use to impersonate your application in the web.config settings.

Так что теперь это работает нормально для меня.

 25 авг. 2009 г., 14:24
Спасибо за ответ - у меня еще не было возможности проверить это. Знаете ли вы, если новые учетные записи по умолчанию (чистая установка Windows) уже имеют доступ к этому? Мы стараемся избегать слишком больших модификаций - и это кажется странной проблемой для чего-то, что должно работать при низком / среднем доверии.
 16 сент. 2009 г., 18:26
Буду, я не уверен! Эта конкретная проблема произошла только с моей машиной. Я попробовал другую машину разработчика, и все работает как положено. На сервере наши системы работают в другом пользовательском контексте, поэтому у меня тоже не было проблем.

Я просто хотел прокомментировать, что решение Расмуса Фабера сработало для меня (с одним незначительным редактированием):

System.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
RSACryptoServiceProvider provider = new System.Cryptography.RSACryptoServiceProvider();

Я пытался заставить MailBee.net подписать исходящее сообщение, используя DKIM, и получил то же сообщение, которое получил ОП. Конечно, все было в порядке на моем компьютере разработчика, но при загрузке на мой клиентский веб-хост, я столкнулся с этой проблемой. Как я уже сказал, вышеупомянутое решение сработало для меня, в то время как другие, которые я нашел в Интернете (включая ссылку на форум msdn выше), не сработали.

(Я поддерживаю и комментирую, но у меня недостаточно представителей, чтобы сделать это.: P)

Спасибо Расмус Фабер!

Ваш ответ на вопрос