Я столкнулся со следующей проблемой.
Я запускаю следующий код
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 и какие негативные последствия это может иметь?
источник
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
так, чтобы профиль пользователя не требовался.new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
что позволяет избежать записи закрытого ключа в хранилище и не требует административных привилегий на сервере.Ответы:
IIS 6 никогда не загружал профили пользователей. Я предполагаю, что по умолчанию это отключено, чтобы поведение было согласованным, и администратор должен согласиться на это.
Скорее всего, это связано с тем, что поставщик службы криптографии Windows пытался сохранить или загрузить ключ для вашего сертификата в хранилище пользователей, а поскольку профиль был недоступен, криптографический контекст был недоступен. Обратите внимание, что этот
Load User Profile
параметр применяется только к учетным записям пользователей. Учетные записи служб, такие как NETWORK SERVICE и ApplicationPoolIdentity, имеют особую обработку.Что ж, профиль пользователя загружен. Это включает их криптографическое хранилище, переменные среды, такие как% TEMP%, и другие.
В конечном итоге это сводится к
LoadUserProfile
вызову IIS при запуске AppPool.Это может нарушить обратную совместимость с приложением, работающим в IIS 6, которое не загрузило профиль пользователя. Загружаются переменные среды. Например, если значение «Загрузить профиль пользователя» равно true, переменная среды% TEMP% имеет значение
C:\Users\AccountName\AppData\Local\Temp
(например). Когда ложно, этоC:\WINDOWS\Temp
.источник
LoadUserProfile=true
в IIS и изменить местоположение временной папки по умолчанию% TEMP%C:\Users\C:\Users\AccountName\AppData\Local\Temp
на другое место? пример "D: \ AppTempData"