หมาย เหตุ: แก้ไขเมื่อวันที่ 22 มิถุนายน 2023 เพื่ออัปเดตการแก้ปัญหาและการแก้ไขปัญหาชั่วคราว
หมาย เหตุ: แก้ไขเมื่อวันที่ 15 มิถุนายน 2023 เพื่ออัปเดตตัวเลือกชั่วคราว 4 และ 5
พื้น หลัง
ในวันที่ 13 มิถุนายน 2023 Microsoft ได้เผยแพร่การอัปเดตความปลอดภัยให้กับ .NET Framework และ .NET ซึ่งส่งผลต่อวิธีการนําเข้าใบรับรอง X.509 ในรันไทม์ การเปลี่ยนแปลงเหล่านี้อาจทําให้การนําเข้าใบรับรอง X.509 ส่ง CryptographicException ในสถานการณ์ที่การนําเข้าจะสําเร็จก่อนการอัปเดต
เอกสารนี้อธิบายการเปลี่ยนแปลงและวิธีแก้ไขปัญหาชั่วคราวที่พร้อมใช้งานสําหรับแอปพลิเคชันที่ได้รับผลกระทบ
ซอฟต์แวร์ที่ได้รับผลกระทบ
-
.NET Framework 2.0
-
.NET Framework 4.6.2, 4.7, 4.7.1, 4.7.2
-
.NET Framework 4.8
-
.NET Framework 4.8.1
-
.NET 6.0
-
.NET 7.0
API ที่ได้รับผลกระทบ
คําอธิบายเกี่ยวกับการเปลี่ยนแปลง
ก่อนวันที่ 13 มิถุนายน 2023 การเปลี่ยนแปลง เมื่อ.NET Framework และ .NET แสดงพร้อมกับ blob ใบรับรองไบนารีสําหรับการนําเข้า โดยทั่วไปแล้ว .NET Framework และ .NET จะมอบสิทธิ์การตรวจสอบและนําเข้า blob ไปยังระบบปฏิบัติการพื้นฐาน ตัวอย่างเช่น ใน Windows โดยทั่วไปแล้ว .NET Framework และ .NET จะใช้ PFXImportCertStore API สําหรับการตรวจสอบความถูกต้องและการนําเข้า
ตั้งแต่วันที่ 13 มิถุนายน 2023 การเปลี่ยนแปลง เมื่อ.NET Framework และ .NET แสดงพร้อมกับ blob ใบรับรองไบนารีสําหรับการนําเข้า .NET Framework และ .NET จะดําเนินการตรวจสอบความถูกต้องเพิ่มเติมก่อนส่ง blob ไปยังระบบปฏิบัติการพื้นฐาน การตรวจสอบความถูกต้องเพิ่มเติมนี้จะดําเนินการตรวจสอบปัญหาต่างๆ เพื่อพิจารณาว่าใบรับรองขาเข้าจะใช้ทรัพยากรหมดขณะนําเข้าหรือไม่ เนื่องจากการตรวจสอบความถูกต้อง เพิ่มเติม นอกเหนือจากระบบปฏิบัติการพื้นฐานที่จะดําเนินการตามปกติ จึงอาจบล็อก blobs ใบรับรองซึ่งจะนําเข้าสําเร็จก่อนวันที่ 13 มิถุนายน 2023 เปลี่ยนแปลง
การถดถอยที่ทราบ
-
หากใบรับรอง X.509 ถูกส่งออกเป็น blob PFX โดยใช้จํานวนการวนซ้ําของรหัสผ่านสูงอย่างไม่เป็นทางการ ขณะนี้ใบรับรองอาจไม่สามารถนําเข้าได้ สิ่งอํานวยความสะดวกการส่งออกใบรับรองส่วนใหญ่ใช้จํานวนการวนซ้ําอยู่ระหว่าง 2,000 - 10,000 หลังจากนําการปรับปรุงความปลอดภัยไปใช้ การนําเข้าจะล้มเหลวสําหรับใบรับรองที่มีจํานวนครั้งของการวนซ้ํามากกว่า 600,000 รายการ
-
หากมีการส่งออกใบรับรอง X.509 โดยใช้รหัสผ่านที่เป็น null [เช่น ผ่านX509Certificate.Export(X509ContentType.Pfx, (string)null)หรือX509Certificate.Export(X509ContentType.Pfx)]ที่ไม่มีรหัสผ่าน ใบรับรองนั้นอาจไม่สามารถนําเข้าได้
หมายเหตุ: การถดถอยข้างต้นได้รับการแก้ไขแล้วในการอัปเดตของวันที่ 22 มิถุนายน 2023 ที่กล่าวถึงใน KB5028608
-
หากใบรับรอง X.509 ถูกส่งออกเป็น blob PFX โดยใช้ความสามารถของ Windows ในการป้องกันคีย์ส่วนตัวไปยัง SID ใบรับรองนั้นอาจไม่สามารถนําเข้าได้ในขณะนี้ ซึ่งจะส่งผลกระทบต่อ Blob PFX ที่สร้างขึ้นในลักษณะต่อไปนี้:
-
ผ่าน ตัวช่วยสร้างการส่งออกใบรับรอง ของ Windows และระบุในตัวช่วยสร้างว่าคีย์ส่วนตัวควรได้รับการป้องกันสําหรับผู้ใช้โดเมน หรือ
-
ผ่าน cmdlet Export-PfxCertificate ของ PowerShell ซึ่งมีอาร์กิวเมนต์ -ProtectTo ที่ชัดเจน หรือ
-
ผ่านโปรแกรมอรรถประโยชน์ certutil ที่มีอาร์กิวเมนต์ -protectto อย่างชัดเจน หรือ
-
ผ่านทาง PFXExportCertStoreEx API ที่มีธง PKCS12_PROTECT_TO_DOMAIN_SIDS ให้ไว้
-
วิธีแก้ไขปัญหาชั่วคราว&
มีวิธีแก้ไขปัญหาต่างๆ อยู่ โดยขึ้นอยู่กับว่าคุณต้องการทําการเปลี่ยนแปลงที่กําหนดเป้าหมายที่ไซต์การโทรแต่ละไซต์ภายในโค้ดของคุณ หรือคุณต้องการเปลี่ยนลักษณะการทํางานของแอปพลิเคชันเดียว หรือคุณต้องการทําการเปลี่ยนแปลงทั้งเครื่อง
ตัวเลือกที่ 1 (ต้องการ) - ติดตั้งโปรแกรมแก้ไขที่อัปเดต
หมายเหตุ: นี่เป็นตัวเลือกที่ต้องการเนื่องจากจะจัดการการถดถอยของลูกค้าที่รายงานโดยทั่วไป และไม่จําเป็นต้องมีการเปลี่ยนแปลงรหัสใดๆ ในแอปพลิเคชัน
การใช้งาน: ตัวเลือกนี้จะนําไปใช้กับเวอร์ชันทั้งหมดของ .NET Framework และ .NET
ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตวันที่ 22 มิถุนายน 2023 ที่กล่าวถึงใน KB5028608
Microsoft ขอแนะนําให้ลูกค้าที่ประสบปัญหาถดถอยซึ่งเริ่มนํามาใช้ภายในวันที่ 13 มิถุนายน 2023 ให้ลองติดตั้งโปรแกรมแก้ไขที่อัปเดตแล้วนี้ก่อนที่จะพยายามแก้ไขปัญหาชั่วคราวที่ระบุไว้ในเอกสารนี้ในภายหลัง
ตัวเลือกที่ 2 - การปรับเปลี่ยนไซต์การโทร
การใช้งาน: ตัวเลือกนี้จะนําไปใช้กับเวอร์ชันทั้งหมดของ .NET Framework และ .NET
พิจารณาว่า blob ที่คุณกําลังนําเข้านั้นน่าเชื่อถือหรือไม่ ตัวอย่างเช่น Blob ได้รับจากตําแหน่งที่ตั้งที่เชื่อถือได้ เช่น ฐานข้อมูลหรือไฟล์การกําหนดค่าภายใต้ตัวควบคุมของคุณ หรือมีการจัดเตรียมไว้ผ่านการร้องขอเครือข่ายที่ดําเนินการโดยไคลเอ็นต์ที่ไม่ผ่านการตรวจสอบสิทธิ์หรือไม่มีสิทธิ์ใช่หรือไม่
Microsoft ขอแนะนําอย่างยิ่งให้คุณไม่นําเข้า Blob PFX ที่จัดหาให้คุณโดยไคลเอ็นต์ที่ไม่มีการตรวจสอบสิทธิ์หรือไม่มีสิทธิ์ เนื่องจาก Blob เหล่านี้อาจมีลักษณะการทํางานของทรัพยากรที่เป็นอันตรายได้
ถ้าคุณจําเป็นต้องนําเข้า blob ใบรับรองคีย์สาธารณะที่คุณได้รับโดยฝ่ายที่ไม่น่าเชื่อถือ คุณสามารถใช้รหัสต่อไปนี้เพื่อนําเข้า blob ดังกล่าวอย่างปลอดภัย รหัสตัวอย่างนี้ใช้วิธีการ GetCertContentType เพื่อกําหนดชนิดของ blob ใบรับรองพื้นฐาน และจะปฏิเสธ Blob PFX ในกรณีที่คุณคาดว่าจะนําเข้า blob ใบรับรองคีย์สาธารณะเท่านั้น ตัวสร้างX509Certificate2(byte[]) มีความปลอดภัยสําหรับการใช้งานเมื่อให้ blobs ที่ไม่ใช่ PFX ที่ไม่น่าเชื่อถือ
using System.Security.Cryptography.X509Certificates;
public static X509Certificate2 ImportPublicCertificateBlob(byte[] blob)
{
if (X509Certificate2.GetCertContentType(blob) == X509ContentType.Pfx)
{
throw new Exception("PFX blobs are disallowed.");
}
else
{
// Import only after we have confirmed it's not a PFX.
return new X509Certificate2(blob);
}
}
ถ้าคุณจําเป็นต้องนําเข้า blob ใบรับรองคีย์ส่วนตัวแบบไม่มีรหัสผ่าน และคุณได้พิจารณาแล้วว่า blob น่าเชื่อถือ คุณสามารถระงับการตรวจสอบความถูกต้องเพิ่มเติมที่ดําเนินการภายในวันที่ 13 มิถุนายน 2023 การเผยแพร่ความปลอดภัยโดยการเรียกตัวสร้างอื่นที่มีโอเวอร์โหลด ตัวอย่างเช่น คุณสามารถเรียกตัวสร้างโอเวอร์โหลดซึ่งยอมรับอาร์กิวเมนต์รหัสผ่านสตริงและส่งผ่าน null สําหรับค่าอาร์กิวเมนต์
byte[] blobToImport = GetBlobToImport(); // fetch this from a database, config, etc.
// REGRESSION - byte[] ctor performs additional security checks X509Certificate2 certA = new X509Certificate2(blobToImport);
// RECOMMENDED WORKAROUND - different ctor overload suppresses additional security checks X509Certificate2 certB = new X509Certificate2(blobToImport, (string)null);
ตัวเลือกที่ 3 - ปรับเปลี่ยนหรือระงับการตรวจสอบความถูกต้องเพิ่มเติมโดยใช้ตัวแปรสภาพแวดล้อม
การนําไปใช้ได้: ตัวเลือกนี้จะนําไปใช้กับ.NET Framework ทุกเวอร์ชันเท่านั้น ซึ่งไม่สามารถใช้ได้กับ .NET 6.0+
ในขณะที่.NET Framework การดําเนินการนําเข้าขีดจํากัดเริ่มต้นเพื่อใช้การวนซ้ําของรหัสผ่านไม่เกิน 600,000 ครั้ง ขีดจํากัดนี้สามารถกําหนดค่าบนทั้งแอปหรือทั้งเครื่องได้โดยใช้ตัวแปรสภาพแวดล้อม ขีดจํากัดใหม่นี้จะนําไปใช้กับการเรียกใช้ API ที่ได้รับผลกระทบทั้งหมดที่แสดงอยู่ด้านบน
เมื่อต้องการเปลี่ยนขีดจํากัด ให้ตั้งค่าตัวแปรสภาพแวดล้อมCOMPlus_Pkcs12UnspecifiedPasswordIterationLimitเป็นค่าของขีดจํากัดใหม่ที่ควรเป็น ตัวอย่างเช่น หากต้องการตั้งค่าขีดจํากัดการวนซ้ํา 1,000,000 ครั้ง (หนึ่งล้าน) ให้ตั้งค่าตัวแปรสภาพแวดล้อมตามที่แสดงด้านล่าง
-
ตัวเลขนี้จะควบคุมขีดจํากัดการคํานวณซ้ํา ทั้งหมด ซึ่งเป็นผลรวมของจํานวนการวนซ้ําของ MAC เนื้อหาที่ปลอดภัยที่เข้ารหัส ลับ และจํานวนการวนซ้ําของถุงที่หด ถ้าคุณส่งออก PFX ด้วยตนเองโดยใช้การนับซ้ําที่ชัดแจ้ง<iter_count> (เช่น ผ่าน openssl pkcs12 -export -iter <iter_count>) และต้องการนําเข้า blob PFX ให้ตั้งค่าตัวแปรสภาพแวดล้อมนี้เป็นค่าที่มากที่สุดเท่าที่ผลรวมของการคํานวณซ้ําทั้งหมดที่คาดไว้ ในทางปฏิบัติ .NET Framework และ .NET อาจอนุญาตให้จํานวนการคํานวณซ้ําทั้งหมดเกินขีดจํากัดที่ชัดเจนใดๆ ที่กําหนดค่าไว้ที่นี่เล็กน้อย
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000
เมื่อต้องการระงับการตรวจสอบเพิ่มเติมทั้งหมด ให้ตั้งค่าตัวแปรสภาพแวดล้อมเป็นค่า sentinel พิเศษ -1 ตามที่แสดงด้านล่าง
-
⚠️ คําเตือน: ตั้งค่าตัวแปรสภาพแวดล้อมเป็น -1 เท่านั้น ถ้าคุณแน่ใจว่าแอปพลิเคชันเป้าหมายไม่จัดการการป้อนใบรับรองที่ไม่น่าเชื่อถือ
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1
ตัวเลือกที่ 4 - การปรับเปลี่ยนหรือระงับการตรวจสอบความถูกต้องเพิ่มเติมโดยใช้ AppContext
การนําไปใช้: ตัวเลือกนี้ใช้กับ .NET 6.0+เท่านั้น ไม่สามารถใช้ได้กับ.NET Framework
ในขณะที่ .NET ตามค่าเริ่มต้น จํากัดการดําเนินการนําเข้าเพื่อใช้เวลาไม่เกิน 600,000 ครั้งของรหัสผ่าน ขีดจํากัดนี้สามารถกําหนดค่าทั่วทั้งแอปพลิเคชันโดยใช้สวิตช์ AppContext ขีดจํากัดใหม่นี้จะนําไปใช้กับการเรียกใช้ API ที่ได้รับผลกระทบทั้งหมดที่แสดงอยู่ด้านบน
เมื่อต้องการเปลี่ยนขีดจํากัด ให้ตั้งค่าสวิตช์ AppContext System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit เป็นค่าของขีดจํากัดใหม่ที่ควรเป็น ตัวอย่างเช่น หากต้องการตั้งค่าการวนซ้ําเป็น 1,000,000 (หนึ่งล้าน) ให้ตั้งค่าสวิตช์ตามที่แสดงด้านล่าง
-
ตัวเลขนี้จะควบคุมขีดจํากัดการคํานวณซ้ําทั้งหมด ซึ่งเป็นผลรวมของจํานวนการวนซ้ําของ MAC เนื้อหาที่ปลอดภัยที่เข้ารหัส ลับ และจํานวนการวนซ้ําของถุงที่หด ถ้าคุณส่งออก PFX ด้วยตนเองโดยใช้การนับซ้ําที่ชัดแจ้ง<iter_count> (เช่น ผ่าน openssl pkcs12 -export -iter <iter_count>) และต้องการนําเข้า blob PFX ให้ตั้งค่าตัวแปรสภาพแวดล้อมนี้เป็นค่าที่มากที่สุดเท่าที่ผลรวมของการคํานวณซ้ําทั้งหมดที่คาดไว้ ในทางปฏิบัติ .NET อาจอนุญาตให้จํานวนครั้งของการคํานวณซ้ําทั้งหมดเกินขีดจํากัดที่ชัดแจ้งใดๆ ที่กําหนดค่าไว้ที่นี่เล็กน้อย
เมื่อต้องการตั้งค่าสวิตช์ภายในไฟล์โครงการของแอปพลิเคชัน (.csproj หรือ .vbproj):
<!--
- This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="1000000" />
</ItemGroup>
อีกวิธีหนึ่งคือ คุณสามารถวางไฟล์ที่ชื่อ runtimeconfig.template.json กับเนื้อหาต่อไปนี้ในไดเรกทอรีเดียวกันซึ่งประกอบด้วยไฟล์โครงการของแอปพลิเคชันของคุณ:
{
"configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": 1000000
}
}
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงการตั้งค่าการกําหนดค่ารันไทม์ของ .NET โปรดดูหน้าเอกสารของการตั้งค่าการกําหนดค่ารันไทม์ของ .NET Runtime
เมื่อต้องการระงับการตรวจสอบเพิ่มเติมทั้งหมด ให้ตั้งค่าสวิตช์การกําหนดค่าเซนติเนลพิเศษ -1 ตามที่แสดงด้านล่าง
⚠️ คําเตือน: ตั้งค่าสวิตช์ AppContext เป็น -1 เท่านั้น ถ้าคุณแน่ใจว่าแอปพลิเคชันเป้าหมายไม่จัดการการป้อนใบรับรองที่ไม่น่าเชื่อถือ
ภายในไฟล์โครงการของแอปพลิเคชัน (.csproj หรือ .vbproj):
<!--
- This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="-1" />
</ItemGroup>
หรือภายในไฟล์ runtimeconfig.template.json:
{
- "configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1
}
}
ตัวเลือกที่ 5 - การปรับเปลี่ยนหรือระงับการตรวจสอบความถูกต้องเพิ่มเติมบนเครื่องผ่านรีจิสทรี (Windows สําหรับ.NET Framework เท่านั้น)
การนําไปใช้ได้: ตัวเลือกนี้จะนําไปใช้กับ.NET Framework ทุกเวอร์ชันเท่านั้น ซึ่งไม่สามารถใช้ได้กับ .NET 6.0+
ในขณะที่.NET Framework การดําเนินการนําเข้าขีดจํากัดเริ่มต้นเพื่อใช้การวนซ้ําของรหัสผ่านไม่เกิน 600,000 ครั้ง ขีดจํากัดนี้สามารถกําหนดค่าบนเครื่องได้โดยใช้รีจิสทรี HKLM ขีดจํากัดใหม่นี้จะนําไปใช้กับการเรียกใช้ API ที่ได้รับผลกระทบทั้งหมดที่แสดงอยู่ด้านบน
เมื่อต้องการเปลี่ยนขีดจํากัด ภายใต้รีจิสทรีคีย์HKLM\Software\Microsoft\.NETFrameworkให้ตั้งค่าPkcs12UnspecifiedPasswordIterationLimitขีดจํากัดใหม่ ตัวอย่างเช่น เมื่อต้องการตั้งค่าขีดจํากัดการวนซ้ําเป็น 1,000,000 (หนึ่งล้าน) ให้เรียกใช้คําสั่งตามที่แสดงด้านล่างจากพร้อมท์คําสั่งด้วยสิทธิ์ผู้ดูแล
-
ตัวเลขนี้จะควบคุมขีดจํากัดการคํานวณซ้ํา ทั้งหมด ซึ่งเป็นผลรวมของจํานวนการวนซ้ําของ MAC เนื้อหาที่ปลอดภัยที่เข้ารหัส ลับ และจํานวนการวนซ้ําของถุงที่หด หากคุณส่งออก PFX ด้วยตนเองโดยใช้การนับซ้ําที่ชัดแจ้ง<iter_count> (เช่น ผ่าน openssl pkcs12 -export -iter <iter_count>) และต้องการนําเข้า PFX blob นั้น ให้ตั้งค่ารีจิสทรีนี้เป็นค่าที่มีขนาดใหญ่เป็นผลรวมของการคํานวณซ้ําทั้งหมดที่คาดไว้เป็นอย่างน้อย ในทางปฏิบัติ .NET Framework อาจอนุญาตให้จํานวนการคํานวณซ้ําทั้งหมดเกินขีดจํากัดที่ชัดแจ้งใดๆ ที่กําหนดค่าไว้ที่นี่เล็กน้อย
-
การตั้งค่ารีจิสทรีจะขึ้นอยู่กับสถาปัตยกรรม เพื่อให้แน่ใจว่าแอปพลิเคชันสังเกตค่าที่กําหนดค่าของคุณโดยไม่คํานึงถึงสถาปัตยกรรมเป้าหมาย โปรดอย่าลืมปรับเปลี่ยนทั้งรีจิสทรี 32 บิตและ 64 บิต ตามที่แสดงด้านล่าง
reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:32 reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:64
เมื่อต้องการระงับการตรวจสอบเพิ่มเติมทั้งหมด ให้ตั้งค่ารีจิสทรีเป็น -1 จากพร้อมท์คําสั่งด้วยสิทธิ์ผู้ดูแล ดังที่แสดงด้านล่างนี้
-
⚠️ คําเตือน: ตั้งค่ารีจิสทรีเป็น -1 เท่านั้น ถ้าคุณแน่ใจว่าบริการที่ทํางานบนเครื่องเป้าหมายไม่จัดการการป้อนใบรับรองที่ไม่น่าเชื่อถือ
-
เมื่อต้องการตั้งค่า sentinel -1 ให้ใช้ชนิด REG_SZ แทนชนิด REG_DWORD การตั้งค่ารีจิสทรีจะขึ้นอยู่กับสถาปัตยกรรม เพื่อให้แน่ใจว่าแอปพลิเคชันสังเกตค่าที่กําหนดค่าของคุณโดยไม่คํานึงถึงสถาปัตยกรรมเป้าหมาย โปรดอย่าลืมปรับเปลี่ยนทั้งรีจิสทรี 32 บิตและ 64 บิต ตามที่แสดงด้านล่าง
reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:32 reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:64
เมื่อต้องการแปลงกลับการเปลี่ยนแปลงรีจิสทรี ให้ลบค่ารีจิสทรี Pkcs12UnspecifiedPasswordIterationLimit reg ออกจากพร้อมท์คําสั่งด้วยสิทธิ์ผู้ดูแล
reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:32 reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:64
บันทึกย่อเฉพาะของ Windows
บน Windows .NET Framework นําเข้าใบรับรองผ่านฟังก์ชัน PFXImportCertStore ฟังก์ชันนี้ทําการตรวจสอบความถูกต้องของตนเอง รวมถึงการวางขีดจํากัดของตัวเองไว้ในจํานวนการวนซ้ําสูงสุดที่อนุญาตของ PFX การตรวจสอบเหล่านี้จะยังคงเกิดขึ้นเมื่อนําเข้า PFX ตัวแปรสภาพแวดล้อมเฉพาะของ NET และรีจิสทรีคีย์ที่อธิบายไว้ข้างต้นไม่ส่งผลกระทบต่อวิธีที่ PFXImportCertStore ทําการตรวจสอบเหล่านี้