Система 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 ответов


действительно, вам нужно работать с таким кодом

CspParameters _cpsParameter;
RSACryptoServiceProvider RSAProvider;

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

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

следующие пользователи должны получить доступ к папке: C:\Documents и настройки\все пользователи\данные приложения\Microsoft\Crypto\RSA\MachineKeys

  1. учетная запись пользователя IIS (анонимная)
  2. учетная запись пользователя, используемая для олицетворения вашего приложения в интернете.настройки конфигурации.

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


я исправил это, установив" загрузить профиль пользователя " в True (было False) в разделе Расширенные настройки / модель процесса пула приложений.

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

есть идея попробовать at:

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

YMMV


попробуйте

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

EDIT: Затем попробуйте использовать

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

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


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

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

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

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

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