Вопрос по asp.net, cryptography, .net, application-pool – RSACryptoServiceProvider Система CryptographicException не может найти файл, указанный в ASP.NET

15

У меня есть приложение, которое использует 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   ответа
31

Загрузить профиль пользователя & 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

Спасибо, у меня работало на сервере, но не локально, бродить почему. Я прочитал, что эта функция пытается получить доступ к хранилищу ключей и завершается неудачей из-за разрешений, даже если код не использует хранилище ключей.
Спасибо! Была эта проблема только на производстве, и это исправило ее.
Это сработало для меня, спасибо! :)
Хорошо, я выяснил, почему это не сработало на моей машине. Это потому, что я использовал пул приложений, который уже использовался и для других приложений. Я не совсем уверен, почему это вызвало проблему, но когда я установил выделенный пул приложений, это сработало!
Это потому, что ключи хранятся в DPAPIsecurity.stackexchange.com/q/1771/396
10

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.

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

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

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

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

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

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

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

8

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

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

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

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

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

Похоже, что вы также можете вызвать «новый RSACryptoServiceProvider (новые CspParameters {Flags = CspProviderFlags.UseMachineKeyStore})» & quot; если вы не хотите включать флаг в глобальном масштабе.
это ничего не изменило.
Это работало для меня на IIS7 с идентификатором apppool по умолчанию.
Это также исправило мою ошибку «Доступ запрещен» при создании экземпляра RSACryptoServiceProvider.

Похожие вопросы