Marraskuun 2020 kumulatiivisen päivityksen esiversio Windows 10:n versiolle 2004 ja sitä vanhemmille versioille sekä tammikuun 2021 suojaus- ja laatukoontiversio .NET Framework 4.8:lle julkaisi muutoksen, joka parantaa X509Certificate2-varmenteiden puhdistusprosessia. Alla annamme lisäselvityksiä yksityisen avaimen käyttöiästä Windowsissa.
.NET Framework 2.0:n jälkeen on ollut kaksi eri tapaa ladata varmenne ja siihen liittyvä yksityinen avain PKCS#12 PFX -tiedostosta: yhtenä varmenneobjektina X509Certificate2-luokan jäsenten kautta tai kaikkien PFX:n varmenteina X509Certificate2Collection.Import-menetelmien avulla.
Oletustoiminta on, että yksityinen avain ladataan pysyvään (nimettyyn) avaimeen jonkin järjestelmän salauskirjaston kautta, joka epäsuorasti kirjoittaa tiedoston levylle. Useimmat PFX:ää lataavat soittajat käyttävät varmenneobjektia vain tilapäisesti, joten kun .NET vapauttaa varmenteeseen liittyviä alkuperäisiä resursseja, se poistaa myös yksityisen avaimen. Tärkeimmät poikkeukset tähän toimintaan ovat
- X509KeyStorageFlags.PersistKeySet-merkintä, jonka tuloksena tiedosto kirjoitetaan, mutta ei poisteta,
- X509KeyStorageFlags.EphemeralKetSet-merkintä, jonka seurauksena yksityinen avain ladataan muistiin ilman varmuuskopiotiedostoa,
- Epänormaali prosessin päättyminen, joka voi tapahtua, kun avaimen poisto odottaa.
Kaksi eri tapaa ladata varmenteet ovat aina käyttäneet erilaisia mekanismeja sen seuraamiseen, milloin on sopiva aika poistaa yksityinen avain. Yksittäisen varmenteen lataaminen X509Certificate2-luokan kautta käyttää merkintää, joka näkyy vain suorituksenaikaisessa .NET-versiossa ja koskee vain tätä yhtä objektiviittausta. PFX:n lataaminen X509Certificate2Collection.Import-toiminnon kautta käyttää alkuperäisen varmenneobjektin merkintää, jonka tuloksena "poistovastuu" jaetaan kaikkien hallittujen objektien kesken, jotka edustavat samaa alkuperäistä varmennetta. Tämä tarkoittaa, että new X509Certificate2(otherCert.Handle). Dispose() aiheuttaa yksityisen avaintiedoston poistamisen Dispose()-kutsun aikana, jos otherCert ladattiin PFX:stä X509Certificate2Collection.Import-toiminnon kautta, mutta ei, jos se ladattiin PFX:stä jonkin X509Certificate2-luokan jäsenen kautta. Jotkin .NET:n osat luovat sisäisesti uusia hallittuja X509Certificate2-objekteja alkuperäisistä varmennekahvoista, kuten X509Chain-luokasta ja X509Certificate2Collection.Find-menetelmästä. Nämä kehyksen osat ja kaikki niitä suoraan tai epäsuorasti käyttävät osat voivat johtaa ennenaikaiseen avainten poistamiseen, kun niiden luomiin objekteihin kerätään roskia.
.NET Framework 4.8:n ensimmäisessä versiossa ilmeni virhe, jonka seurauksena X509Certificate2Collection.Import ei käyttänyt poistomerkkiä, vaikka PersistKeySet tai EphemeralKeySet ei ollut määritetty. .NET julkaisi tähän virheeseen korjauksen tammikuun 2021 suojaus- ja laatukoonnissa , jonka tarkoituksena on estää hylättyjen yksityisten avaintiedostojen tahattoman kerääntymisen. Kutsujat, joihin tämä korjaus vaikuttaa, voivat määrittää PersistKeySet-merkinnän palaamaan (tahattomasti erilaiseen) .NET Framework 4.8 RTM -toimintaan, mutta tämä johtaa tiedostojen kerääntymiseen, joka on ratkaistava mukautetulla siivouslogiikalla.
X509Certificate2Collection.Import .NET Core for Windowsissa ja .NET 5+ for Windows toimivat samalla tavalla kuin .NET Framework 2.0-4.7.2 (ja .NET Framework 4.8 kaikkine päivityksineen). .NET-tiimi harkitsee siirtymistä paranneltuun ulkoasuun .NET 6:ssa (tai tulevissa versioissa), mutta tämä suunnittelupäivitys ei koske .NET Framework-, .NET Core- tai .NET 5 -versioita.