Что именно происходит, когда я устанавливаю LoadUserProfile пула IIS?

103

Я столкнулся со следующей проблемой.

Я запускаю следующий код

var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);

в двух процессах. Один из процессов запускается, LOCAL_SYSTEMи этот код завершается успешно. Другой работает внутри IIS под локальной учетной записью пользователя, принадлежащей локальной группе «Пользователи», и я получаю следующее исключение:

System.Security.Cryptography.CryptographicException
Object was not found.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password)
//my code here

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

Проблема в том, что я не понимаю, что именно происходит, когда я устанавливаю, LoadUserProfileи какие последствия это может иметь. Я имею в виду, что если это «хорошо», то почему по умолчанию он не включен и почему все-таки там?

Что именно происходит, когда я устанавливаю LoadUserProfileпул IIS и какие негативные последствия это может иметь?

острый зуб
источник
6
Вспомним, если загрузка профиля пользователя является для вас проблемой, вы можете изменить загрузку сертификата new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)так, чтобы профиль пользователя не требовался.
vcsjones
1
Если вы работаете как ApplicationPoolIdentity, вы захотите использовать, new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)что позволяет избежать записи закрытого ключа в хранилище и не требует административных привилегий на сервере.
Nate

Ответы:

117

Я имею в виду, что если это «хорошо», то почему по умолчанию он не включен и почему все-таки там?

IIS 6 никогда не загружал профили пользователей. Я предполагаю, что по умолчанию это отключено, чтобы поведение было согласованным, и администратор должен согласиться на это.

Я попытался включить LoadUserProfile для пула приложений, и теперь он работает.

Скорее всего, это связано с тем, что поставщик службы криптографии Windows пытался сохранить или загрузить ключ для вашего сертификата в хранилище пользователей, а поскольку профиль был недоступен, криптографический контекст был недоступен. Обратите внимание, что этот Load User Profileпараметр применяется только к учетным записям пользователей. Учетные записи служб, такие как NETWORK SERVICE и ApplicationPoolIdentity, имеют особую обработку.

Что именно происходит, когда я устанавливаю LoadUserProfile в пуле IIS

Что ж, профиль пользователя загружен. Это включает их криптографическое хранилище, переменные среды, такие как% TEMP%, и другие.

В конечном итоге это сводится к LoadUserProfileвызову IIS при запуске AppPool.

какие негативные последствия это может иметь?

Это может нарушить обратную совместимость с приложением, работающим в IIS 6, которое не загрузило профиль пользователя. Загружаются переменные среды. Например, если значение «Загрузить профиль пользователя» равно true, переменная среды% TEMP% имеет значение C:\Users\AccountName\AppData\Local\Temp(например). Когда ложно, это C:\WINDOWS\Temp.

vcsjones
источник
1
+1 Для СЕТЕВОЙ СЛУЖБЫ в качестве удостоверения пула приложений, но ApplicationPoolIdentity не удалось мне.
David d C e Freitas
3
«Это может нарушить обратную совместимость с приложением, работающим на IIS 6, которое не загрузило профиль пользователя». Я предполагаю, что это также имеет последствия для производительности (профиль должен быть загружен; это означает, например, загрузку куста реестра HKCU) и безопасности (больший потенциальный вектор).
Sören Kuklau
1
Можно ли установить LoadUserProfile=trueв IIS и изменить местоположение временной папки по умолчанию% TEMP% C:\Users\C:\Users\AccountName\AppData\Local\Tempна другое место? пример "D: \ AppTempData"
Murali Murugesan
Мурали Муругесан - Вы когда-нибудь получали ответ на этот вопрос? У меня такая же проблема. Я хочу изменить каталог Temp по умолчанию.
VBAHole
1
Я столкнулся с этим много лет назад, создавая серверную службу, которая вызывала удаленную веб-службу, защищенную аутентификацией сертификата клиента X509. Поскольку личные сертификаты хранятся в профиле пользователя, при установке службы мне пришлось войти на целевой сервер в качестве учетной записи для входа в службу, которая создает профиль пользователя, а затем установить сертификат клиента в хранилище сертификатов учетной записи для входа. После этого сертификат клиента загрузится во время выполнения.
Craig Boland