Що саме відбувається, коли я встановив 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)що дозволяє уникнути запису приватного ключа в магазин і не вимагає адміністративних привілеїв на сервері.
Нейт

Відповіді:


117

Я маю на увазі, якщо це "гарна" річ, то чому вона за замовчуванням не "включена" і чому вона все-таки є?

IIS 6 ніколи не завантажував профілі користувачів. Я б припустив, що це за замовчуванням вимкнено, щоб поведінка була послідовною, і адміністратор повинен відмовитися від неї.

Я намагався включити LoadUserProfile для пулу додатків, і він працює зараз.

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

Що саме відбувається, коли я встановлюю LoadUserProfile в пулі IIS

Ну а профіль користувача завантажений. Сюди входить їх криптографічний магазин, змінні середовища, такі як% TEMP%, та інші.

Що в кінцевому підсумку зводиться, LoadUserProfileназивається IIS при запуску AppPool.

які негативні наслідки це може мати?

Це може порушити сумісність із додатком, який працює на IIS 6, який не завантажував профіль користувача. Завантажуються змінні середовища. Наприклад, коли Завантажити профіль користувача вірно, змінна середовища% TEMP% є C:\Users\AccountName\AppData\Local\Temp(наприклад). Коли помилково, це так C:\WINDOWS\Temp.


1
+1 Для мережі NETWORK SERVICE як ідентичності пулу додатків, але 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"
Муралі Муругесан

Муралі Муругесан - ви коли-небудь отримували відповідь на це питання? У мене те саме питання. Я хочу, щоб каталог за замовчуванням змінився.
VBAHole

1
Я зіткнувся з цим роками тому, будуючи сервіс бек-енду, який закликав віддалений веб-сервіс, захищений автентифікацією сертифікату клієнта X509. Оскільки особисті сертифікати зберігаються в профілі користувача, під час встановлення послуги мені довелося увійти на цільовий сервер як обліковий запис для входу в службу, який створює профіль користувача, а потім встановити сертифікат клієнта в сховище сертифікатів облікового запису входу. Після цього сертифікат клієнта завантажиться під час виконання.
Крейг Боланд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.