A 2020. novemberi összegző frissítés előzetes verziója Windows 10 2004-es és újabb verzióihoz, valamint a .NET-keretrendszer 4.8 2021. januári kumulatív frissítési kiadása módosította az X509Certificate2 tanúsítványok törlési folyamatát. Az alábbiakban további pontosításokat adunk a titkos kulcsok élettartamáról Windows rendszeren.

A .NET-keretrendszer 2.0 óta két különböző módon lehet betölteni egy tanúsítványt és a hozzá tartozó titkos kulcsot egy PKCS#12 PFX-fájlból: egy tanúsítványobjektumként az X509Certificate2 osztály tagjain keresztül, vagy mint a PFX-ben található összes tanúsítványt az X509Certificate2Collection.Import metódusokkal.

Az alapértelmezett viselkedés az, hogy a titkos kulcs egy megőrzött (elnevezett) kulcsba lesz betöltve az egyik rendszer-titkosítási kódtáron keresztül, amely közvetve ír egy fájlt a lemezre.  A PFX-et betöltő hívók többsége csak ideiglenesen használja a tanúsítványobjektumot, így amikor a .NET felszabadítja a tanúsítványhoz társított natív erőforrásokat, a titkos kulcsot is törli.  Ennek a viselkedésnek a fő kivételei a következők:

  1. Az X509KeyStorageFlags.PersistKeySet jelző, amely a fájl írását eredményezi, de nem törli,

  2. Az X509KeyStorageFlags.EphemeralKetSet jelző, amely azt eredményezi, hogy a titkos kulcs háttérfájl nélkül töltődik be a memóriába.

  3. A folyamat rendellenes leállítása, amely akkor fordulhat elő, ha a kulcs törlése függőben van.

Ezzel ellentétben a tanúsítványok betöltésének két különböző módja mindig különböző mechanizmusokat használt a nyomkövetéshez, amikor a titkos kulcs törlésének megfelelő ideje volt.  Egyetlen tanúsítvány betöltése az X509Certificate2 osztályon keresztül olyan jelölőt használ, amely csak a .NET-futtatókörnyezet számára látható, és csak az adott objektumhivatkozásra vonatkozik.  A PFX X509Certificate2Collection.Import használatával történő betöltésekor a natív tanúsítványobjektumon egy jelölő található, amely "törlési elszámoltathatóságot" eredményez az azonos natív tanúsítványt képviselő felügyelt objektumok között.  Ez azt jelenti, hogy az új X509Certificate2(otherCert.Handle). A Dispose() művelet hatására a titkos kulcsfájl törlődik a Dispose() hívása során, ha másCertet egy PFX-ről az X509Certificate2Collection.Import parancson keresztül töltöttek be, de nem, ha a PFX-ből az X509Certificate2 osztály bármely tagja keresztül betöltötte.  A .NET egyes részei belsőleg új, felügyelt X509Certificate2 objektumokat hoznak létre a natív tanúsítványleírókból, például az X509Chain osztályból és az X509Certificate2Collection.Find metódusból.  A keretrendszer ezen részei és a közvetlenül vagy közvetetten használt részek korai kulcstörléshez vezethetnek, mivel az általuk létrehozott objektumok szemétgyűjtést kapnak.

A .NET-keretrendszer 4.8 kezdeti kiadásában hiba lépett fel, amely miatt az X509Certificate2Collection.Import nem alkalmazta a törlési jelölőt, még akkor sem, ha sem a PersistKeySet, sem az EphemeralKeySet nem lett megadva. A .NET a 2021. januári biztonsági és minőségi összegző frissítésben kiadta a hiba javítását, hogy megakadályozza az elhagyatott titkoskulcs-fájlok véletlen felhalmozódását.  A javítás által érintett hívók megadhatják a PersistKeySet jelölőt, hogy visszatérjenek a (akaratlanul eltérő) .NET-keretrendszer 4.8 RTM-viselkedéshez, azonban ez a fájl felhalmozódását eredményezi, amelyet egyéni tisztítási logikával kell kezelni.

Az X509Certificate2Collection.Import a .NET Core for Windows és a .NET 5+ windowsos verzióján ugyanúgy viselkedik, mint a .NET-keretrendszer 2.0-4.7.2 (és .NET-keretrendszer 4.8 az összes frissítés alkalmazásával).  A .NET csapata azt fontolgatja, hogy a .NET 6 (vagy a jövőbeli verziók) továbbfejlesztett kialakítására fog áttérni, de ez a tervfrissítés nem vonatkozik a .NET-keretrendszer, a .NET Core vagy a .NET 5 rendszerekre.

További segítségre van szüksége?

További lehetőségeket szeretne?

Fedezze fel az előfizetés előnyeit, böngésszen az oktatóanyagok között, ismerje meg, hogyan teheti biztonságossá eszközét, és így tovább.