RSACryptoServiceProvider Система CryptographicException не может найти файл, указанный в ASP.NET
У меня есть приложение, которое использует RSACryptoServiceProvider для дешифрования некоторых данных с помощью известного закрытого ключа (хранящегося в переменной).
Когда пул приложений IIS настроен на использование Network Service, все работает нормально.
Однако, когда мы настраиваем пул приложений 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
Ответы
Ответ 1
Действительно, вам нужно работать с таким кодом
CspParameters _cpsParameter;
RSACryptoServiceProvider RSAProvider;
_cpsParameter = new CspParameters();
_cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore;
RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter);
Следующие пользователи нуждаются в доступе к папке: C:\Documents and Settings\All Users\Application data\Microsoft\Crypto\RSA\MachineKeys
- Учетная запись пользователя IIS (анонимно)
- Учетная запись пользователя, используемая для олицетворения вашего приложения в настройках web.config.
Итак, теперь он отлично работает для меня.
Ответ 2
Я исправил это, установив для параметра "Загрузить профиль пользователя" значение "Истина" (было False) в разделе "Дополнительные параметры/моделирование пула приложений".
Приложение отлично работало на Server 2003 R2/IIS 6, и проблема возникла, когда я настраивал ее на нашем новом сервере 2008 R2.
Появилась идея попробовать:
http://social.msdn.microsoft.com/forums/en-US/clr/thread/7ea48fd0-8d6b-43ed-b272-1a0249ae490f/
YMMV
Ответ 3
Попробуйте установить
System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
EDIT:
Затем попробуйте использовать
var provider = new System.Security.Cryptography.RSACryptoServiceProvider();
вместо конструктора с целым параметром. Этот конструктор пытается сгенерировать ключ с указанной длиной ключа, и вы не сможете сделать это с вашими разрешениями.
Ответ 4
Я просто хотел прокомментировать, что решение Rasmus Faber работало для меня (с одним незначительным редактированием):
System.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
RSACryptoServiceProvider provider = new System.Cryptography.RSACryptoServiceProvider();
Я пытался заставить MailBee.net подписать исходящее сообщение с использованием DKIM и получил то же сообщение, что и OP. Конечно, все было хорошо на моей машине dev, но при загрузке на моем веб-хосте клиентов я столкнулся с этой проблемой. Как я уже сказал, решение выше работало для меня, а другие, которые я нашел в Интернете (включая ссылку на msdn forum выше), не сделали.
(Я бы поднял и прокомментировал, но мне не хватает репутации для этого: P)
Спасибо Rasmus Faber!