Система CryptographicException RSACryptoServiceProvider не может найти файл, указанный в ASP.NET
У меня есть приложение, которое использует RSACryptoServiceProvider для расшифровки некоторых данных с использованием известного закрытого ключа (хранится в переменной).
Когда пул приложений IIS настроен на использование сетевой службы, все работает нормально.
Однако, когда мы настраиваем пул приложений IIS для запуска кода под другим удостоверением, мы получаем следующее:
System.Security.Cryptography.CryptographicException: система не может найти указанный файл. в System.Security.Cryptography.Utils.CreateProvHandle(параметры CspParameters, логический randomKeyContainer) в System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(параметры RSAParameters) в 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
5 ответов
На самом деле вам нужно работать такой код
CspParameters _cpsParameter;
RSACryptoServiceProvider RSAProvider;
_cpsParameter = new CspParameters();
_cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore;
RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter);
Следующим пользователям необходим доступ к папке: C:\Documents and Settings\ Все пользователи \ Данные приложения \Microsoft\Crypto\RSA\MachineKeys
- Учетная запись пользователя IIS (анонимно)
- Учетная запись пользователя, которую вы используете для олицетворения вашего приложения в настройках web.config.
Так что теперь это работает нормально для меня.
Я исправил это, установив для параметра "Загрузить профиль пользователя" значение "Истина" (было "Ложь") в разделе "Дополнительные параметры / Модель процесса пула приложений".
Приложение прекрасно работало на Server 2003 R2 / IIS 6, и проблема возникла, когда я настраивал его на нашем новом сервере 2008 R2.
Есть идея попробовать это на:
http://social.msdn.microsoft.com/forums/en-US/clr/thread/7ea48fd0-8d6b-43ed-b272-1a0249ae490f/
YMMV
Попробуйте установить
System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
РЕДАКТИРОВАТЬ: Затем попробуйте использовать
var provider = new System.Security.Cryptography.RSACryptoServiceProvider();
вместо конструктора с целочисленным параметром. Этот конструктор пытается сгенерировать ключ с заданной длиной ключа, и вы не сможете сделать это с вашими разрешениями.
Я просто хотел прокомментировать, что решение Расмуса Фабера работает для меня (с одним незначительным редактированием):
System.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
RSACryptoServiceProvider provider = new System.Cryptography.RSACryptoServiceProvider();
Я пытался заставить MailBee.net подписать исходящее сообщение, используя DKIM, и получил то же сообщение, которое получил ОП. Конечно, все было в порядке на моем компьютере разработчика, но при загрузке на мой клиентский веб-хост, я столкнулся с этой проблемой. Как я уже сказал, вышеупомянутое решение сработало для меня, в то время как другие, которые я нашел в Интернете (включая ссылку на форум msdn выше), не сработали.
(Я бы высказался и прокомментировал, но у меня недостаточно представителей, чтобы сделать это.:P)
Спасибо Расмус Фабер!
Только когда я добавляю
Флаги = CspProviderFlags.UseMachineKeyStore
Проблема решена для меня.
{
string keyName = "Secret***";
CspParameters parameters = new CspParameters()
{
KeyContainerName = keyName,
Flags = CspProviderFlags.UseMachineKeyStore
};
}