Apa yang sebenarnya terjadi ketika saya menetapkan LoadUserProfile dari kumpulan IIS?

103

Saya menghadapi masalah berikut.

Saya menjalankan kode berikut

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

dalam dua proses. Salah satu proses berjalan di bawah LOCAL_SYSTEMdan di sana kode ini berhasil. Yang lain berjalan di dalam IIS di bawah akun pengguna lokal milik grup lokal "Pengguna" dan di sana saya mendapatkan pengecualian berikut:

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

Jadi saya mencari di Google sedikit dan menemukan jawaban ini untuk pertanyaan serupa. Saya mencoba mengaktifkan LoadUserProfileuntuk pool aplikasi dan berfungsi sekarang.

Masalahnya adalah saya tidak mengerti apa yang sebenarnya terjadi ketika saya menetapkan LoadUserProfiledan konsekuensi apa yang mungkin terjadi. Maksud saya, jika itu adalah hal yang "baik" lalu mengapa tidak "aktif" secara default dan mengapa itu tetap ada?

Apa yang sebenarnya terjadi ketika saya mengatur LoadUserProfiledi kumpulan IIS dan apa konsekuensi negatif yang dapat ditimbulkannya?

gigi tajam
sumber
6
Sekadar renungan, jika memuat profil pengguna merupakan masalah bagi Anda, Anda dapat mengubah pemuatan sertifikat new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)menjadi profil pengguna tidak diperlukan.
vcsjones
1
Jika berjalan sebagai ApplicationPoolIdentity, Anda akan ingin menggunakan new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)yang menghindari penulisan kunci pribadi ke penyimpanan dan tidak memerlukan hak akses administratif di server.
Nate

Jawaban:

117

Maksud saya, jika itu adalah hal yang "baik" lalu mengapa tidak "aktif" secara default dan mengapa itu tetap ada?

IIS 6 tidak pernah memuat profil pengguna. Saya akan menganggap ini dinonaktifkan secara default untuk menjaga perilaku konsisten, dan administrator harus memilih untuk itu.

Saya mencoba mengaktifkan LoadUserProfile untuk pool aplikasi dan berfungsi sekarang.

Hal ini kemungkinan besar karena Penyedia Layanan Kriptografik Windows mencoba menyimpan atau memuat kunci untuk sertifikat Anda di penyimpanan pengguna, dan karena profil tidak tersedia, konteks kriptografik tidak tersedia. Perhatikan bahwa Load User Profilepengaturan hanya berlaku untuk akun pengguna. Akun Layanan seperti NETWORK SERVICE dan ApplicationPoolIdentity memiliki penanganan khusus.

Apa yang sebenarnya terjadi ketika saya menetapkan LoadUserProfile di pool IIS

Nah, profil pengguna sudah dimuat. Ini termasuk penyimpanan kriptografi mereka, variabel lingkungan seperti% TEMP%, dan lainnya.

Apa intinya LoadUserProfiledisebut oleh IIS ketika AppPool dimulai.

konsekuensi negatif apa yang ditimbulkannya?

Ini dapat merusak kompatibilitas mundur dengan aplikasi yang berjalan di IIS 6, yang tidak memuat profil pengguna. Variabel lingkungan dimuat. Misalnya, saat Muat Profil Pengguna benar, variabel lingkungan% TEMP% adalah C:\Users\AccountName\AppData\Local\Temp(misalnya). Ketika salah, itu C:\WINDOWS\Temp.

vcsjones.dll
sumber
1
+1 Untuk LAYANAN JARINGAN sebagai identitas kumpulan aplikasi, tetapi ApplicationPoolIdentity tidak berhasil untuk saya.
David d C e Freitas
3
"Ini dapat merusak kompatibilitas mundur dengan aplikasi yang berjalan di IIS 6, yang tidak memuat profil pengguna." Saya kira itu juga memiliki kinerja (profil harus benar-benar dimuat; ini berarti, misalnya, memuat kumpulan registri HKCU) dan implikasi keamanan (vektor potensial yang lebih besar).
Sören Kuklau
1
Apakah mungkin untuk mengatur LoadUserProfile=truedi IIS dan mengubah lokasi folder temp default% TEMP% dari C:\Users\C:\Users\AccountName\AppData\Local\Tempke tempat lain? contoh "D: \ AppTempData"
Murali Murugesan
Murali Murugesan - apakah Anda pernah mendapatkan jawaban untuk pertanyaan ini? Saya memiliki masalah yang sama. Saya ingin direktori Temp default berubah.
VBAHole
1
Saya mengalami ini bertahun-tahun yang lalu membangun layanan back-end yang memanggil ke layanan web jarak jauh yang dilindungi oleh otentikasi Sertifikat Klien X509. Karena sertifikat pribadi disimpan di profil pengguna, ketika menginstal layanan, saya harus logon ke server target sebagai akun logon layanan, yang membuat profil pengguna, kemudian menginstal sertifikat klien ke penyimpanan sertifikat akun logon. Setelah itu, sertifikat klien akan dimuat saat dijalankan.
Craig Boland