HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

SOAP üzenet titkosítása megosztott kulccsal


Példaprogram letöltése

17610 bájt

A hálózaton történő adatforgalom biztonsága érdekében üzeneteinket valamilyen formában titkosítani kell. A Microsoft WSE (Web Services Enhancements for Microsoft .NET) csomagjának névterei lehetővé teszik, hogy megfelelő konfiguráció után titkosítva küldjük el a SOAP üzeneteket a szerviz alkalmazáshoz. Cikkünkben elkészítünk egy Web szervizt, melyben értelmezzük a titkosított üzeneteket.

Mellékelt példa megnyitása előtt szükséges egy WSEServer nevű virtuális könyvtár létrehozása, mely a példa mappájában található WSEServer alkönyvtárra mutat. Ehhez nyissa meg a mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A szerviz alkalmazás futtatása előtt gondoskodnunk kell arról, hogy a Web szerver virtuális mappájában engedélyezzük a névtelen hozzáférést.
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.
Web szerviz megvalósítása
A szerviz egyetlen webes metódussal rendelkezik, melynek neve GetProduct. A metódus képes arra, hogy a szerviz mappájában található products.xml állomány tartalmát beolvassa egy DataSet objektumba, majd a kért azonosítóhoz tartozó információkat visszaküldje a kliensprogramhoz.
A kliens-alkalmazás titkosított formában küldi el a SOAP üzenetet. Ehhez egy, a szerviz által is ismert, megosztott kulcsot, valamint a WSE megfelelő osztályát használja fel. Lássuk, mit kell tennünk azért, hogy az üzenet dekódolásra kerülhessen a szervizben.
A WSE csomag névtereinek eléréséhez referenciaként mind a kliens, mind a szerver-alkalmazásokban meg kell adni a Microsoft.Web.Services.dll állományt. Ehhez válasszuk a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a Microsoft.Web.Services.dll elemet.
A szükséges osztályok eléréséhez meg kell adnunk a következő hivatkozásokat:
using System.Web.Services;
using System.Security.Permissions;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using Microsoft.Web.Services;
using Microsoft.Web.Services.Security;
A webes metódus a következő: először beolvassuk az XML állományt.
[WebMethod]
public string[] GetProduct(int id)
{
  string[] pList = null;
  ds.ReadXml(Server.MapPath("products.xml"));
Ezt követően a létrehozott karakterlánc-tömbbe írjuk a táblaobjektum egy meghatározott rekordjának mezőit.
  pList = new string[ds.Tables[0].Columns.Count];
  for(int i=0;i<ds.Tables[0].Columns.Count;i++) 
  {
    pList[i] = ds.Tables[0].Columns[i].ColumnName + " : " + ds.Tables[0].Rows[id-1][i].ToString();
  }            
  return pList;
}
A szerviz állományában létrehoztunk egy, a DecryptionKeyProvider osztályból származó DKeyProvider osztályt, melynek felüldefiniált GetDecryptionKey metódusával kaphatjuk meg az üzenet dekódolásához szükséges információkat.
A metódusban először meg kell hívni az ősosztály metódusát:
DecryptionKey key = base.GetDecryptionKey(uri,info);
A kapott DecryprionKey objektum tartalmazza a kulcsot a dekódoláshoz. A metódusban megtörténik az üzenet XML-kódjának értelmezése.
foreach (KeyInfoClause clause in info) 
{
  if (clause is KeyInfoName)
  {
Amennyiben az üzenet XMLDSIG <KeyName> elemében a megfelelő karakterlánc található, akkor a szerviz Web.config állományában megtalálható konfigurációs bejegyzések megfelelő szegmenséből beolvasásra kerül a megosztott kulcs.
    if (((KeyInfoName)clause).Value == "WSE kulcs")
    {
      string keyData = ConfigurationSettings.AppSettings["symmkey"];
      byte[] keyBytes = Convert.FromBase64String(keyData);
Majd generáljuk a szimmetrikus dekódoló kulcsot:
      return new SymmetricDecryptionKey(TripleDES.Create(),keyBytes);
    }
  }
}
Egyébként NULL értéket ad vissza a függvény.
A szerviz konfigurációs bejegyzései a közül a legfontosabbak a következők:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
...
A megosztott kulcs bejegyzése:
  <appSettings>
    <add key="symmkey" value="EE/uaFF5N3ZNJWUTR8DYe+OEbwaKQnso" />
  </appSettings>
  ...
A kulcs generálását végző osztály megadása a TYPE attribútumban, „névtér.osztály, assemby” :
  <microsoft.web.services>
    ...
    <security>
      <decryptionKeyProvider type="WSEServer.DKeyProvider, WSEServer" />      
    </security>
  </microsoft.web.services>
</configuration>
Proxy osztály készítése
A Visual Studio.NET beépített eszköze segítségével készíthetünk egy kliens proxy-t az alkalmazáshoz, melynek segítségével könnyen kapcsolat teremthető a szerviz metódusa és a hívó kliens program segítségével.
A %winroot%:\Program Files\Visual Studio.NET\FrameworkSDK\Bin mappában található program segítségével egy - a szerviz osztályával azonos nevű, .cs kiterjesztésű – állomány generálható, melyet a kliens projektbe felveszünk. A DataService.cs állomány a következőképpen generálható parancssorból:
wsdl /out: DataService.cs http://localhost/WSEServer/DataService.asmx
A proxy osztály ősosztályának nevét meg kell változtatnunk, hiszen a WebServicesClientProtocol osztályból kell származtatni.
public class DataService : WebServicesClientProtocol
{
  ...
}
Ezt követően meg kell adnunk a proxy osztály állományának elején is a szükséges referenciát:
using Microsoft.Web.Services;
A kliens alkalmazás elkészítése
A program forráskódjának elején itt is el kell helyezni a hivatkozásokat a névterekre:
using System.Web.Services.Protocols;
using System.Configuration;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using Microsoft.Web.Services;
using Microsoft.Web.Services.Security;
A Form ComboBox kontroljából ki kell választani a lekérdezendő termék azonosítóját, melyet paraméterként átadunk a szerviz metódusának. A metódust a proxy osztály segítségével hívjuk meg, melyet először példányosítunk:
DataService wse = new DataService();
Létrehoztunk egy metódust, melynek segítségével készítünk egy kulcsot az információ titkosításához. Ezt hívjuk meg ezt követően.
EncryptionKey key = GetEncryptionKey();
A kliens által küldött üzenet fejlécében elhelyezzük a kulcsot:
wse.RequestSoapContext.Security.Elements.Add(new EncryptedData(key));
...
Majd meghívjuk a szerviz metódusát, és feltöltjük a karakterlánc-tömböt, melynek elemeit elhelyezzük a ListBox kontrolban.
string[] pList = wse.GetProduct(Convert.ToInt32(comboBox1.Text));
...
A GetEncryptionKey metódusban szintén a konfigurációs állományban elhelyezett adatot olvassuk ki ahhoz, hogy a kulcsot generáljuk.
string keyData = ConfigurationSettings.AppSettings["symmkey"];
byte[] keyBytes = Convert.FromBase64String(keyData);
SymmetricEncryptionKey key = new SymmetricEncryptionKey(TripleDES.Create(), keyBytes);
A metódusban az üzenet megfelelő elemeiben (<KeyName>) elhelyezendő adatokat adjuk meg a metódus végén.
KeyInfoName keyName = new KeyInfoName();
keyName.Value  = "WSE kulcs";
key.KeyInfo.AddClause(keyName);
return key;
A szerviz alkalmazásban az üzenet <KeyName> elemében található adatot olvassuk ki először, és ha az nem azonos a várt – „WSE kulcs” – karakterlánccal, akkor a feldolgozás hibaüzenettel leáll.
A kliens alkalmazás konfigurációs állományának neve megegyezik a konfigurálandó alkalmazás teljes (kiterjesztéssel értendő) nevével, kiterjesztése pedig .CONFIG. Például az alkalmazásunk (WSEClient.exe) konfigurációs állománya a WSEClient.exe.config nevet viseli.
Legfontosabb bejegyzése a megosztott kulcsot tartalmazó <appSettings> tag. A megosztott kulcsnak a szerviz kulcsával azonosnak kell lenni:
...
<appSettings>
  <add key="symmkey" value="EE/uaFF5N3ZNJWUTR8DYe+OEbwaKQnso" />
</appSettings>
...

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 272. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |