C# - XML hitelesítése tanúsítvánnyal

forráskód letöltése
A .NET Framework számtalan újdonsága közül az egyik legfontosabb, hogy képesek vagyunk XML állományainkat is hitelesíteni, aláírni. Erre a System.Security.Cryptography.Xml névtér osztályai adnak lehetőséget. Cikkünkben bemutatunk egy példát arra, hogy miként tudjuk hitelesíteni XML állományunkat egy tanúsítvánnyal, az X509 szabványnak megfelelően.
A mellékelt példában digitálisan aláírjuk, és egy tanúsítvánnyal hitelesítjük a PersonalInfo.xml állományt. Az alkalmazás felületén két műveletet tudunk elvégezni. Az első műveletben képesek vagyunk programból generálni egy tanúsítványt, melyet az XML aláírásához használhatunk fel a második műveletben. Amennyiben a tanúsítványt nem kívánjuk a programmal generálni, akkor elvégezhetjük ezt manuálisan is. A következő szakaszban bemutatjuk, hogy hogyan. A programmal való és a manuálisan történő generálás azonos segédprogrammal történik.
Tanúsítvány generálása
A Visual Studio.NET parancssori eszközét, a MAKECERT.EXE alkalmazást használhatjuk fel erre a célra. 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
Amennyiben ezt a módszert használjuk, akkor a gyakorlati példa kipróbálása előtt generáljunk egy tanúsítványt, és helyezzük el azt a projekt mappájában. A generált tanúsítvány minden szempontból megfelelő lesz. A tanúsítványt tartalmazó állomány neve legyen sampleCert.cer, a tanúsítvány menedzserprogramban megjelenő neve pedig CN=VSCert. Létrehozásához a következő opciókkal indítottuk el a MAKECERT.EXE alkalmazás:
makecert –sk mycert –ss root –n CN=VSCert <elérési útvonal>sampleCert.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 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.

Állomány aláírása
Miután a programunk elindult, a PersonalInfo.xml állomány betöltődik a böngésző-kontrolba, amely a Form-on található. Azt követően pedig, hogy a sampleCert.cer tanúsítvány-állományt valamilyen formában létrehoztuk, elindítható az aláírás művelete.
Ezt a Sign metódusunk végzi. Az első lépés a műveletben, hogy egy XmlDocument objektumba betöltjük a hitelesítendő állományt.
XmlDocument origdoc = new XmlDocument();
origdoc.Load("PersonalInfo.xml");
Ezt követően generálunk egy kulcsot az RSA algoritmust implementáló módszerrel. Ehhez a RSA osztályt használjuk.
RSA rsaKey = RSA.Create();
Létrehozunk egy SignedXml objektumot az aláírást tárolandó, és a generált kulcsot megadjuk a SigningKey property-ben.
signedXml = new SignedXml();
signedXml.SigningKey = rsaKey;
Szükségünk van egy referenciaosztályra is az aláíráshoz, így azt is létrehozzuk egy hivatkozott URL-el, majd elhelyezzük az aláírás objektumban.
Reference reference = new Reference();
reference.Uri = "http://www.microsoft.com";
signedXml.AddReference(reference);
A kulcsinformációk tárolására az aláírásnak szüksége van egy KeyInfo objektumra is. Ebben az objektumban tároljuk a hitelesítő tanúsítványt.
KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = X509Certificate.CreateFromCertFile("sampleCert.cer");
A KeyInfoX509Data osztály segítségével hozhatjuk létre a megfelelő tagokat az XML-ben, melyek a hitelesítéskor generált kódokat tartalmazzák.
keyInfo.AddClause(new KeyInfoX509Data(cert));
...
A művelet végén generáljuk az aláírást.
signedXml.ComputeSignature();
Az aláírás tulajdonképpen egy XML formátumú adathalmaz, melyet az eredeti XML-hez kapcsolhatunk. Ennek eredményeképpen jön létre egy új adatfolyam.
XmlElement signedxml = signedXml.GetXml(); origdoc.DocumentElement.AppendChild(origdoc.ImportNode(signedxml, true));
Az adatfolyamot elmentjük a SignedPersonalInfo.xml állományban, majd betöltjük annak tartalmát az Internet Explorer kontrolba.
XmlTextWriter tw = new XmlTextWriter("SignedPersonalInfo.xml",new UTF8Encoding(false));
...
axWebBrowser1.Navigate(Application.StartupPath + "\\" + comboBox1.Text,ref m,ref m,ref m,ref m);
A betöltéshez a böngésző-kontrol Navigate metódusát használjuk, melynek első paramétere a fizikai állomány elérési útvonala.