Bản xem trước Bản cập nhật Tích lũy tháng 11 năm 2020 cho Windows 10 phiên bản 2004trở xuống, cũng như bản phát hành Bản tổng hợp Bảo mật và Chất lượng tháng 1 năm 2021 cho .NET Framework 4.8 đã phát hành một thay đổi để cải thiện quy trình dọn dẹp cho chứng chỉ X509Certificate2. Bên dưới, chúng tôi cung cấp thêm thông tin làm rõ về thời hạn khóa riêng tư trên Windows.
Vì .NET Framework 2.0 đã có hai cách khác nhau để tải chứng chỉ và khóa riêng liên quan từ tệp PKCS#12 PFX: là một đối tượng chứng chỉ thông qua các thành viên trên lớp X509Certificate2 hoặc tất cả các chứng chỉ có trong PFX thông qua phương pháp X509Certificate2Collection.Import.
Hành vi mặc định là khóa riêng được tải vào một khóa tồn tại (được đặt tên) thông qua một trong các thư viện mã hóa hệ thống, gián tiếp ghi một tập tin vào đĩa. Hầu hết người gọi đang tải PFX chỉ sử dụng đối tượng chứng chỉ tạm thời, vì vậy khi .NET phát hành các tài nguyên riêng được liên kết với chứng chỉ, nó cũng xóa khóa riêng. Các ngoại lệ chính đối với hành vi này là
-
Cờ X509KeyStorageFlags.PersistKeySet dẫn đến tệp được ghi nhưng không bị xóa,
-
Cờ X509KeyStorageFlags.EphemeralKetSet, dẫn đến khóa riêng được tải vào bộ nhớ không có tệp sao lưu,
-
Chấm dứt quá trình bất thường, có thể xảy ra khi xóa khóa đang chờ xử lý.
Counterintuitively, hai cách khác nhau để tải chứng chỉ đã luôn luôn sử dụng cơ chế khác nhau để theo dõi khi đó là một thời gian thích hợp để xóa khóa riêng tư. Việc tải một chứng chỉ duy nhất thông qua lớp X509Certificate2 sử dụng dấu chỉ hiển thị cho thời gian chạy .NET và chỉ áp dụng cho tham chiếu đối tượng đó. Việc tải PFX qua X509Certificate2Collection.Import sử dụng một vạch dấu trên đối tượng có chứng chỉ gốc, dẫn đến việc chia sẻ "trách nhiệm giải trình xóa" trên mọi đối tượng được quản lý đại diện cho cùng một chứng chỉ gốc. Điều này có nghĩa là X509Certificate mới2(otherCert.Handle). Dispose() sẽ khiến tệp khóa riêng bị xóa trong cuộc gọi đến Dispose() nếu otherCert đã được tải từ PFX qua X509Certificate2Collection.Import, nhưng không được tải từ PFX thông qua bất kỳ thành viên lớp X509Certificate2 nào. Một số phần của .NET nội bộ tạo các đối tượng X509Certificate2 được quản lý mới từ núm điều khiển chứng chỉ gốc, chẳng hạn như lớp X509Chain và phương pháp X509Certificate2Collection.Find. Những phần này của khuôn khổ, và bất kỳ phần nào trực tiếp hoặc gián tiếp sử dụng chúng, có thể dẫn đến sự xóa khóa sớm khi các đối tượng mà chúng tạo ra được rác thu thập.
Lỗi đã được giới thiệu trong bản phát hành ban đầu của .NET Framework 4.8 dẫn đến X509Certificate2Collection.Import không áp dụng dấu xóa ngay cả khi không persistKeySet hay EphemeralKeySet được chỉ định. .NET đã phát hành bản sửa lỗi cho lỗi này trong Bản tổng hợp Chất lượng và Bảo mật tháng 1 năm 2021 để ngăn chặn sự tích lũy vô tình các tệp khóa riêng tư bị bỏ rơi. Người gọi bị ảnh hưởng bởi bản sửa lỗi này có thể chỉ định cờ PersistKeySet để quay lại hành vi .NET Framework 4.8 RTM (vô tình khác nhau), mặc dù làm như vậy sẽ dẫn đến sự tích lũy tệp cần được giải quyết bằng lô-gic dọn dẹp tùy chỉnh.
X509Certificate2Collection.Import on .NET Core for Windows and .NET 5+ for Windows behaves in the same way as .NET Framework 2.0-4.7.2 (and .NET Framework 4.8 with all updates applied). Nhóm .NET đang cân nhắc chuyển sang thiết kế được cải tiến trong .NET 6 (hoặc các phiên bản trong tương lai), nhưng bản cập nhật thiết kế này sẽ không áp dụng cho .NET Framework, .NET Core hoặc .NET 5.