2020 m. lapkričio kaupiamojo naujinimo peržiūros, skirtos Windows 10 2004 ir naujesnėms versijoms, taip pat 2021 m. sausio mėn. saugos ir kokybės naujinimų paketo leidime, skirtame .NET Framework 4.8", išleistas pakeitimas, skirtas pagerinti X509Certificate2 sertifikatų valymo procesą. Toliau pateikiame papildomų paaiškinimų apie privačiojo rakto galiojimo laiką sistemoje "Windows".
Kadangi .NET Framework 2.0", sertifikatą ir su juo susijusį privatųjį raktą iš PKCS#12 PFX failo galima įkelti dviem skirtingais būdais: kaip vieną sertifikato objektą per narius X509Certificate2 klasėje arba kaip visus sertifikatus, esančius PFX naudojant X509Certificate2Collection.Import metodus.
Numatytasis veikimas yra toks, kad privatusis raktas įkeliamas į pastovų (pavadintą) raktą per vieną iš sistemos kriptografijos bibliotekų, kurios netiesiogiai įrašo failą į diską. Dauguma skambinančiųjų, įkeliančių PFX, sertifikato objektą naudoja tik laikinai, todėl kai .NET išleidžia vietinius išteklius, susietus su sertifikatu, jis taip pat panaikina privatųjį raktą. Pagrindinės šio veikimo išimtys yra
-
Vėliavėlė X509KeyStorageFlags.PersistKeySet, dėl kurios failas įrašomas, bet nepanaikinamas,
-
Vėliavėlė X509KeyStorageFlags.EphemeralKetSet, dėl kurios privatusis raktas įkeliamas į atmintį be atsarginės kopijos failo,
-
Neįprastas proceso nutraukimas, kuris gali įvykti, kai laukiama rakto panaikinimo.
Counterintuitively, du skirtingi būdai įkelti sertifikatus visada naudojo skirtingus sekimo mechanizmus, kai reikia laiko panaikinti privatųjį raktą. Įkeliant vieną sertifikatą per X509Certificate2 klasę naudojamas žymeklis, matomas tik .NET vykdyklei ir taikomas tik vienai objekto nuorodai. Įkeliant PFX per X509Certificate2Collection.Import naudojamas pirminio sertifikato objekto žymeklis, todėl "naikinimo atsakomybė" bendrinama visuose valdomuose objektuose, kurie atitinka tą patį vietinį sertifikatą. Tai reiškia, kad naujas X509Certificate2(otherCert.Handle). Jei "Dispose()" buvo įkeltas iš PFX per X509Certificate2Collection.Import, iškviečiant "Dispose()", privataus rakto failas bus ištrintas, bet ne tada, kai jis buvo įkeltas iš PFX per X509Certificate2 klasės narius. Kai kurios .NET dalys viduje sukuria naujus valdomus X509Certificate2 objektus iš pirminių sertifikato sisteminių nuorodų, pvz., X509Chain klasę ir X509Certificate2Collection.Find metodą. Šios sistemos dalys ir bet kurios dalys, kurios jas tiesiogiai ar netiesiogiai naudoja, gali lemti ankstyvą raktų ištrynimą, nes jų kuriami objektai surenkami šiukšlės.
Klaida buvo įvesta pradiniame .NET Framework 4.8" leidime, todėl buvo gautas X509Certificate2Collection.Importas, kad nebūtų taikomas naikinimo žymeklis, net jei nebuvo nurodyta nei PersistKeySet, nei EphemeralKeySet. .NET išleido šios klaidos pataisą 2021 m. sausio mėn. saugos ir kokybės naujinimų pakete , kad būtų išvengta netyčinio apleistų privačiųjų raktų failų kaupimo. Šios pataisos paveikti skambinantieji gali nurodyti žymę PersistKeySet, kad grįžtų į (netyčia skirtingą) .NET Framework 4.8 RTM veikimą, tačiau tai padarius, bus kaupiasi failai, į kuriuos reikia kreiptis naudojant pasirinktinę valymo logiką.
X509Certificate2Collection.Importuoja ".NET Core", skirtą "Windows" ir ".NET 5+", skirtą "Windows", veikia taip pat, kaip .NET Framework 2.0-4.7.2 (ir .NET Framework 4.8 su pritaikytais visais naujinimais). .NET komanda ketina pereiti prie patobulinto ".NET 6" (arba būsimų versijų) dizaino, tačiau šis dizaino naujinimas nebus taikomas .NET Framework, ".NET Core" arba ".NET 5".