จะเกิดอะไรขึ้นเมื่อฉันตั้งค่า LoadUserProfile ของ IIS pool


104

ฉันประสบปัญหาต่อไปนี้

ฉันเรียกใช้รหัสต่อไปนี้

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

ดังนั้นฉันจึง Googled เล็กน้อยและพบคำตอบสำหรับคำถามที่คล้ายกันนี้ ฉันพยายามเปิดใช้งานLoadUserProfileสำหรับพูลแอปพลิเคชันและใช้งานได้ในขณะนี้

ปัญหาคือฉันไม่เข้าใจว่าจะเกิดอะไรขึ้นเมื่อตั้งค่าไว้LoadUserProfileและผลที่ตามมาที่อาจเกิดขึ้น ฉันหมายความว่าถ้ามันเป็นสิ่งที่ "ดี" แล้วทำไมมันถึงไม่ "เปิด" โดยปริยายแล้วทำไมมันถึงอยู่ที่นั่นล่ะ?

จะเกิดอะไรขึ้นเมื่อฉันตั้งค่าLoadUserProfileในกลุ่ม IIS และจะมีผลเสียอะไรบ้าง


6
ในภายหลังหากการโหลดโปรไฟล์ผู้ใช้เป็นปัญหาสำหรับคุณคุณสามารถเปลี่ยนการโหลดใบรับรองเพื่อnew X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)ให้ไม่จำเป็นต้องใช้โปรไฟล์ผู้ใช้
vcsjones

1
หากรันเป็น ApplicationPoolIdentity คุณจะต้องใช้new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)ซึ่งหลีกเลี่ยงการเขียนไพรเวตคีย์ลงในสโตร์และไม่ต้องการสิทธิ์ระดับผู้ดูแลระบบบนเซิร์ฟเวอร์
เนท

คำตอบ:


118

ฉันหมายความว่าถ้ามันเป็นสิ่งที่ "ดี" แล้วทำไมมันถึงไม่ "เปิด" โดยปริยายแล้วทำไมมันถึงอยู่ที่นั่นล่ะ?

IIS 6 ไม่เคยโหลดโปรไฟล์ผู้ใช้ ฉันจะถือว่าสิ่งนี้ถูกปิดโดยค่าเริ่มต้นเพื่อให้พฤติกรรมสอดคล้องกันและผู้ดูแลระบบจะต้องเลือกใช้มัน

ฉันพยายามเปิดใช้ LoadUserProfile สำหรับพูลแอปพลิเคชันและใช้งานได้ในขณะนี้

นี้มีแนวโน้มมากที่สุดเพราะผู้ให้บริการการเข้ารหัสลับของ Windows ได้พยายามที่จะเก็บหรือโหลดที่สำคัญสำหรับใบรับรองของคุณในการจัดเก็บผู้ใช้และตั้งแต่รายละเอียดก็ไม่สามารถใช้ได้เป็นบริบทการเข้ารหัสลับก็ไม่สามารถใช้ได้ โปรดทราบว่าการLoad User Profileตั้งค่านี้ใช้กับบัญชีผู้ใช้เท่านั้น บัญชีบริการเช่น NETWORK SERVICE และ ApplicationPoolIdentity มีการจัดการพิเศษ

จะเกิดอะไรขึ้นเมื่อฉันตั้งค่า LoadUserProfile ใน IIS pool

โหลดโปรไฟล์ผู้ใช้เรียบร้อยแล้ว ซึ่งรวมถึงที่เก็บการเข้ารหัสตัวแปรสภาพแวดล้อมเช่น% TEMP% และตัวแปรอื่น ๆ

สิ่งที่เดือดลงในที่สุดLoadUserProfileเรียกโดย IIS เมื่อ AppPool เริ่มทำงาน

มันจะมีผลเสียอะไรบ้าง?

อาจทำลายความเข้ากันได้แบบย้อนหลังกับแอปที่ทำงานบน IIS 6 ซึ่งไม่ได้โหลดโปรไฟล์ผู้ใช้ มีการโหลดตัวแปรสภาพแวดล้อม ตัวอย่างเช่นเมื่อ Load User Profile เป็นจริงตัวแปรสภาพแวดล้อม% 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% TEMP% จากC:\Users\C:\Users\AccountName\AppData\Local\Tempไปที่อื่น ตัวอย่าง "D: \ AppTempData"
Murali Murugesan

Murali Murugesan - คุณเคยได้รับคำตอบสำหรับคำถามนี้หรือไม่? ฉันมีปัญหาเดียวกัน ฉันต้องการเปลี่ยนไดเร็กทอรี Temp เริ่มต้น
VBAHole

1
เมื่อหลายปีก่อนฉันได้สร้างบริการส่วนหลังที่เรียกเข้าสู่บริการเว็บระยะไกลที่ได้รับการปกป้องโดยการรับรองความถูกต้องของใบรับรองไคลเอ็นต์ X509 เนื่องจากใบรับรองส่วนบุคคลถูกเก็บไว้ในโปรไฟล์ของผู้ใช้เมื่อติดตั้งบริการฉันจึงต้องเข้าสู่ระบบเซิร์ฟเวอร์เป้าหมายเป็นบัญชีเข้าสู่ระบบของบริการซึ่งจะสร้างโปรไฟล์ผู้ใช้จากนั้นติดตั้งใบรับรองไคลเอ็นต์ลงในที่เก็บใบรับรองของบัญชีการเข้าสู่ระบบ หลังจากนั้นใบรับรองไคลเอ็นต์จะโหลดในขณะทำงาน
Craig Boland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.