Člověk se pořád učí. A když se neučí, tak je následně poučen. Stalo se mi toto - pracovali jsme na komunikačním modulu, který pro komunikaci s cizím serverem používá podepsané zprávy. Uživatel modulu nejprve do systému nahraje certifikát i s privátním klíčem a modul pak s jeho pomocí podepisuje odesílané zprávy.
Certifikát je uložen mimo program v zabezpečené databázi a pokud je potřeba, vytvoří se vlastní objekt certifikátu v paměti asi takhle:
Tenhle postup fungoval, ale pak byl celý systém rozšířen o automatické pravidelné zasílání zpráv a toto vytváření certifikátu se začalo odehrávat častěji. Neočekával jsem ale, že Windows si vytvářejí při každém vytvoření certifikátu výše uvedeným postupem na disku malý soubor s klíčem a tento soubor následně neodstraňují a tento tak zůstává na disku. Kdysi dávno to byla dokonce reportované chyba a pro starší OS vyšel i fix, ale v novějších OS to zůstalo a žádný fix už nebyl.
Výsledkem kombinace častější kombinace a výše uvedeného chování byl dramatický úbytek volného místa na systémovém disku a neuvěřitelně mnoho souborů v adresáři C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys. Naštěstí se na to přišlo poměrně brzy a byl tedy čas příslušná místa opravit - ale pár dnů provozu navíc mohlo znamenat pád serverů z důvodu vyčerpání diskového místa.
Oprava spočívala v tom, že certifikáty se po dobu běhu modulu ukládaly jak do paměťové keše, tak i do dedikovaného X509Store objektu a v případě ukončování práce modulu byly v destruktoru postupně volána metoda Reset() pro všechny certifikáty - teprve zavoláním této metody dojde k odstranění souboru z disku. Vyřešil se tak problém s místem (každý certifikát se během běhu modulu vytvořil právě jen jednou), tak se zlepšil i výkon - certifikáty jsou k dispozici okamžitě. Navíc při ukončení činnosti modulu jsou certifikáty zcela odstraněny ze systému. Pokud dojde k pádu modulu a destruktor není zavolán, jsou certifikáty při obnovení činnosti získány z X509Store a při následujícím korektním zakončení činnosti modulu odstraněny.
Pokud někomu vrtá hlavou, proč není X509Store použit od začátku a výhradně, tak proto, že modul neběží na jednom učitém serveru a nejsou tak dopředu známé možnosti prostředí - certifikáty s klíči jsou bezpečně uložené zvlášť a přístup k nim je zabezpečen dle jiných pravidel.
Asi to musí někomu, kdo v této oblasti pracuje denně, přijít zábavné. Můj pracovní záběr se ale pohybuje od mobilních aplikací, přes weby, databáze až k win službám a tak pochopitelně nemám detailní znalosti a jsem občas nucen se učit z podobných chyb..... Mimo vyřešení příčiny problému se pak navíc musel najít způsob, jak bezpečně odstranit všechny ty malé soubory, které mezitím zahltili disk :-)
Certifikát je uložen mimo program v zabezpečené databázi a pokud je potřeba, vytvoří se vlastní objekt certifikátu v paměti asi takhle:
var certificate = new X509Certificate2(content, password, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
Tenhle postup fungoval, ale pak byl celý systém rozšířen o automatické pravidelné zasílání zpráv a toto vytváření certifikátu se začalo odehrávat častěji. Neočekával jsem ale, že Windows si vytvářejí při každém vytvoření certifikátu výše uvedeným postupem na disku malý soubor s klíčem a tento soubor následně neodstraňují a tento tak zůstává na disku. Kdysi dávno to byla dokonce reportované chyba a pro starší OS vyšel i fix, ale v novějších OS to zůstalo a žádný fix už nebyl.
Výsledkem kombinace častější kombinace a výše uvedeného chování byl dramatický úbytek volného místa na systémovém disku a neuvěřitelně mnoho souborů v adresáři C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys. Naštěstí se na to přišlo poměrně brzy a byl tedy čas příslušná místa opravit - ale pár dnů provozu navíc mohlo znamenat pád serverů z důvodu vyčerpání diskového místa.
Oprava spočívala v tom, že certifikáty se po dobu běhu modulu ukládaly jak do paměťové keše, tak i do dedikovaného X509Store objektu a v případě ukončování práce modulu byly v destruktoru postupně volána metoda Reset() pro všechny certifikáty - teprve zavoláním této metody dojde k odstranění souboru z disku. Vyřešil se tak problém s místem (každý certifikát se během běhu modulu vytvořil právě jen jednou), tak se zlepšil i výkon - certifikáty jsou k dispozici okamžitě. Navíc při ukončení činnosti modulu jsou certifikáty zcela odstraněny ze systému. Pokud dojde k pádu modulu a destruktor není zavolán, jsou certifikáty při obnovení činnosti získány z X509Store a při následujícím korektním zakončení činnosti modulu odstraněny.
Pokud někomu vrtá hlavou, proč není X509Store použit od začátku a výhradně, tak proto, že modul neběží na jednom učitém serveru a nejsou tak dopředu známé možnosti prostředí - certifikáty s klíči jsou bezpečně uložené zvlášť a přístup k nim je zabezpečen dle jiných pravidel.
Asi to musí někomu, kdo v této oblasti pracuje denně, přijít zábavné. Můj pracovní záběr se ale pohybuje od mobilních aplikací, přes weby, databáze až k win službám a tak pochopitelně nemám detailní znalosti a jsem občas nucen se učit z podobných chyb..... Mimo vyřešení příčiny problému se pak navíc musel najít způsob, jak bezpečně odstranit všechny ty malé soubory, které mezitím zahltili disk :-)
Žádné komentáře:
Okomentovat