C# - Tanúsítványok készítése, tulajdonságaik elérése programból

forráskód letöltése
A biztonságos kommunikáció egyik momentuma, hogy a felek meg tudják határozni az érkezett üzenet forrását, vagyis a küldő személyazonosságát. Ennek érdekében folyamatosan terjed a digitális aláírás technológiája. Ekkor a felek valamilyen külső tanúsító által kibocsátott tanúsítványt használnak fel azonosításukra. Cikkünkben bemutatjuk a Visual studio.NET parancssori eszközét, melynek segítségével minta-tanúsítványt generálunk, ismertetve annak jellemzőit.
A mellékelt példa használatához telepítenünk kell a Microsoft WSE 1.0 csomagot. Ennek elvégzéséhez olvassa el a Kezdeti lépések című fejezetet.
Kezdeti lépések
A Microsoft által elkészített csomag a Web Services Enhancements for Microsoft .NET nevet viseli, és cikkünk írásakor a következő Webcímen volt elérhető, mely természetesen megváltozhatott: http://msdn.microsoft.com/webservices/building/wse/default.aspx.
Letöltve az állományt (Web Services Enhancements 1.0 for Microsoft .NET.msi) telepítenünk kell a .NET Framework alá. Az öntelepítő állomány erről gondoskodik, a használható .DLL állomány (Microsoft.Web.Services.dll), és a kapcsolódó dokumentáció alapértelmezésben a következő mappába kerül: %winroot%:\Program Files\Microsoft WSE\v1.0.2312\.
A telepített assembly bekerül a globális assembly-listába, így amikor referenciaként megadjuk alkalmazásainkban, akkor a globális palettáról kell kiválasztanunk, nem pedig valamilyen alternatív mappából.
Tanúsítványgenerálás
A Visual Studio.NET parancssori eszközéről, a MAKECERT.EXE alkalmazásról van szó, melynek használatát ismertetjük. A program a VS.NET telepítése után a <winroot>:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin mappában található, használatához az IDE saját parancssorát kell elindítanunk (elérési útvonala: <winroot>:\Program Files\Microsoft Visual Studio .NET\Common7\Tools\vsvars32.bat).
Az alkalmazás segítségével tesztelési célra készíthetünk X509. szabvány szerinti tanúsítványokat. Az eszköz elkészít egy nyilvános kulcs - privát kulcs párt, melyeket egy tanúsítvány-állományban tárol. A létrehozott tanúsítványt hozzákapcsolja egy tanúsítvány kibocsátóhoz, valamint lehetővé teszi, hogy tetszőleges nevet rendeljünk a tanúsítványhoz.
Az alkalmazás általános szintaxisa a következő:
makecert [opciók] fájlnév
A fájlnév argumentumban kell megadnunk a tanúsítványt tároló állomány nevét, valamint igény szerint a létrehozás helyét. Az állomány kiterjesztése lehetőleg .CER legyen.
A program számtalan alapvető, és kiegészítő opcióval rendelkezik, a cikkben a legjellemzőbbeket ismertetjük.
Opciók Megjegyzés
-n X509név A tanúsítvány neve. A névnek X.500 szabvány szerintinek kell lenni, vagyis ”CN=név” formátumúnak.
-sk kulcsnév A kulcs konténer neve, melyben a privát kulcs megtalálható. Ha nincs megadva, létrehozásra kerül.
-sr hely A tanúsítvány (registry-ben történő) tárolási helyét specifikálhatjuk így. Értékei LOCALMACHINE vagy CURRENTUSER (alapértelmezett).
-ss tároló neve Tároló neve.
-# szám A tanúsítvány sorszáma, melyet alapértelmezésben a program generál.
-$ engedély A tanúsítvány típusát adhatjuk meg. Értékei lehetnek COMMERCIAL (kereskedelmi szoftverkibocsátók által használt) vagy INDIVIDUAL (egyedi szoftverkibocsátók által használt).
-? Kilistázza az alapvető opciókat.
-a aláírási algoritmus Az aláírás algoritmusa specifikálható. Értékei MD5 (alapértelmezett) vagy SHA1 lehetnek.
-b nn/hh/éééé Az érvényességi periódus kezdete. Alapesetben a kibocsátás időpontja.
-e nn/hh/éééé Az érvényesség lejárta. Alapértelmezésben 2039. 12. 31.
A mellékelt példa használata előtt létre kell hoznunk egy tanúsítványt VSCert néven. Az állomány neve TESTCERT.CER lesz. Ehhez indítsuk el a Visual Studio.NET parancssort, majd gépeljük be a következő sort:
makecert –sk mycert –ss root –n CN=VSCert <elérési útvonal>testCert.cer
Mivel nem specifikáltuk, hogy mely tárolóban helyezze el a program a tanúsítványunkat, megjelenik egy üzenetpanel, mely rákérdez, hogy elhelyezheti-e a tanúsítványt ROOT tárolóban.

A panelen többek között szerepel a tanúsítvány sorszáma, mellyel tárolásra kerül a Rendszerleíró adatbázis következő kulcsában:
[HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\Root\Certificates\96E091E1F0DC40C6A8BE6C07175FCEB655598803]
Látható, hogy a tanúsítvány az alapértelmezett tárolóba került (currentuser).
A tanúsítvány állományán duplát kattintva annak jellemzői betöltődnek, és megtekinthetők. A „Tanúsítvány telepítése” gombra kattintva installálhatjuk a tanúsítványt. Ekkor megjelenik egy panel, melyen meg kell adnunk, hogy mely tárolóban szeretnénk tárolni az adott dokumentumot.

A Tallózás gombra kattintva megjelenik egy lista, melyben tárolók vannak feltüntetve (Személyes, Más személyek, stb.).

Egyet kiválasztva befejezhetjük a műveletet, a tanúsítvány helye megtekinthető a VS.NET másik eszköze, a Certification Manager segítségével. Ez a <winroot>:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin\certmgr.exe elérési útvonalon található.

Most már használhatjuk a mellékelt programot is. A program által elvégzett műveletek, és a WSE kapcsolatáról a következő szakaszban szólunk.

A tanúsítvány jellemzői
Miért van szükségünk a WSE-re a tanúsítvány jellemzőinek ismertetéséhez? A válasz a WSE jellemzőinek ismeretében kézenfekvő: mert használata egyszerűbb, mint a .NET 1.0-ás verziójában fellelhető osztályok használata.
A WSE kapcsolódó osztályait eredetileg a Webes szervizek SOAP üzeneteinek aláírására fejlesztették, speciális metódusokat írtak erre a célra. Az üzenetek aláírásához ugyanis ismerni, és kezelni kell a számítógépen fellelhető tanúsítványokat, melyek egyikét – ha tetszik – csatolni kell az üzenethez.
A WSE osztályai lekérdezik a két tároló altárolóiban található tanúsítványokat, majd beolvassák tulajdonságaikat. A példában ezt használjuk fel mi is. Az alkalmazás űrlapján megadjuk a tanúsítvány nevét, melynek tulajdonságaira kíváncsiak vagyunk, majd megnyomjuk a LEKÉRDEZ gombot.
A X509CertificateStore osztály segítségével specifikáljuk a kérdéses tárolót, mely a megadott tanúsítványt tartalmazza.
X509CertificateStore store = X509CertificateStore.CurrentUserStore(X509CertificateStore.RootStore);
Megnyitjuk olvasásra.
store.OpenRead();
Majd végigmegyünk elemein, melyek X509Certificate osztályú elemek.
foreach(X509Certificate cert in store.Certificates)
{ 
Amelyiknek a neve megegyezik a megadottal – például a létrehozott CN=VSCert értékkel - annak adatai jelennek meg a ListBox kontrolban.
  if (cert.GetName() == textBox1.Text)
  {
    listBox1.Items.Add("Tanúsítvány neve: " + cert.GetName());
    ...
  }
}
Végül bezárjuk a tárolót.
Cert.Close();