Windows - Az SSL kommunikáció részletei

SSL/TLS 3. rész

Az SSL két rétegének részletezésével foglalkozunk cikkünkben. Megismerhetjük a különféle üzeneteket, riasztásokat, amelyek segítségével a kommunikáció megvalósul SSL ügyfél és szerver között.
A handshake protokoll
A handshake réteg egy sor egymást követő üzenetet jelent, amely segítségével az adatátviteli közeg biztonsági paramétereit egyeztetik a kommunikációban résztvevő felek.
Az ügyfél kezdeti üzenete a szerverhez
Az ügyfél egy hello üzenettel nyitja meg a session-t a szerverhez. Ez az üzenet az alábbiakat tartalmazza:
  • Verziószám: Ezzel az adattal jelzi a kliens, hogy mi az a legmagasabb verzió, amelyet a protokollból kezelni tud. 2-es verzió SSL 2.0-át, 3-mas verzió SSL 3.0-át, 3.1-es verzió TLS-t jelent. TLS az RFC szabvány szerint TLS 1.0-át jelent.
  • Véletlenszerűen generált adat: egy 4 bájt méretű adat, amely a kliens dátum és idő értékét tartalmazza, valamint egy 28 bájt méretű véletlen szám, amely a szerver által hasonlóképpen generált adattal együtt előállít egy mester-kulcsot, amelyből a későbbi kódoló kulcsok készülnek.
  • Session azonosító (ha van): Ez az érték ahhoz szükséges, hogy a kliens folytatni tudjon egy megkezdett session-t. Ha korábbi viszonyt használunk újra, akkor ezzel tehermentesítjük a processzort az inicializálással kapcsolatos tevékenységek terhétől, és a korábban egyeztetett konfigurációs információkat a felek a könnyen hozzáférhető gyorsító tárukban tudják tárolni.
  • Rejtjel sorozat: Egy rejtjelsorozat lista, amely elérhető a kliensen. Egy példa a rejtjelsorozatra: TLS_RSA_WITH_DES_CBC_SHA, ahol a TLS a verzió, RSA a kulcscsere algoritmusa, DES_CBC a kódoló algoritmus, és SHA a daraboló, vagy hash funkció.
  • Tömörítési algoritmus: a kért tömörítési algoritmus (jelenleg nem támogatott).
ClientVersion 3,1
ClientRandom[32]
SessionID: None (new session)
Suggested Cipher Suites:
TLS_RSA_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_DES_CBC_SHA
Suggested Compression Algorithm: NONE
Egy példa a kliens hello üzenetére.
A szerver válasza
A szerver szintén hello üzenettel válaszol a kliensnek, amely az alábbiakat tartalmazza:
  • Verziószám: Az a verzió, amelyet mindkét oldal támogat. A kliens által küldött és a saját legmagasabb verziója közül az alacsonyabbikat választja ki.
  • Véletlenszerűen generált adat: azonos a kliens hasonló adatával. 4 bájt dátum és idő, valamint 28 bájt véletlen szám.
  • Session azonosító (ha van): Ez háromféle lehet:
  • Új viszonyazonosító. Ha a kliens nem kért korábbi viszonyfolytatást azonosító megadásával, akkor új viszony kezdődik, új azonosítóval. Akkor is új viszony indul, ha a kliens által kért viszonyt a szerver nem képes, vagy nem akarja folytatni.
  • Folytatható viszony azonosítója. Az azonosító megegyezik a kliens hello üzenetében megadottal. A kliens jelezte, hogy folytatni szeretné a korábbi viszonyt, a szerver pedig ezt nyugtázza.
  • Null. Ebben az esetben egy új viszony kezdődik, de a szerver ezzel jelzi, hogy nem akarja az új viszonyt később folytatni, így nem ad vissza azonosítót.
  • Rejtjel sorozat. A verzióválasztásnál ismertetett módon a két fél által egyaránt elfogadott legerősebb rejtjeltípust adja vissza. Ha nincs azonos rejtjelkulcs, amelyben megegyezhetnének, akkor handshake hibariasztással zárul a kommunikáció.
  • Tömörítési algoritmus (jelenleg nem támogatott).
A szerver válasza még az alábbi információkkal egészül ki a hello üzenet mellett:
  • Szerver tanúsítvány. A szerver elküldi tanúsítványát a felhasználónak. Ez tartalmazza a szerver nyilvános kulcsát. A kliens ezt fogja használni hitelesítéshez, és a kezdeti titok kódolásához. A kliens szintén ellenőrzi a szerver nevét a tanúsítványban, hogy összevesse az általa használt szervernévvel. Ha például a kliens beír egy URL-t, mint pl. www.url.hu, akkor a tanúsítványnak tartalmaznia kell a www.url.hu címet vagy a *.url.hu-t, különben a böngésző figyelmeztető üzenetet küld.
  • Szerver-kulcscsere. Ez egy választható lehetőség arra, hogy a szerver egy átmeneti kulcsot hozzon létre, és elküldje azt a kliensnek. Ez a kulcs arra használható, hogy a kliens a későbbiekben kódolni tudja a kliens kulcscsere-üzeneteket. Ez a lépés csak akkor szükséges, amikor a nyílt kulcsú algoritmus nem nyújt olyan kulcsot, amellyel a kliens kulcscsere-üzenetek kódolhatók, például amikor a szerver tanúsítványa nem tartalmaz nyílt kulcsot.
  • Kliens tanúsítványkérés. Ez egy feltételes lépés, amelyben a szerver hitelesítést kér a klienstől. Ez olyan weboldalakon szükséges, ahol azonosítania kell magát a felhasználónak, pl. banki tranzakciók esetében.
  • Szerver hello vége. Ez az üzenet az jelenti, hogy a szerver befejezte a hello üzenetét és válaszra vár.
Kliens válasza a szervernek
  • Klienshitelesítés. Ha a szerver egy klienstanúsítvány-kérést küldött, akkor a kliens elküldi a tanúsítványát a szervernek, klienshitelesítésre. A kliens tanúsítványa tartalmazza a kliens publikus kulcsát.
  • Kliens kulcscsere. A kliens elküld egy kliens kulcscsere üzenetet, miután elkészítette a kezdeti titkot, felhasználva mindkét véletlen értéket. A kezdeti titok kódolt lesz a szerver tanúsítványának nyílt kulcsával, mielőtt átvitelre kerül a szerverre. Mindkét fél részéről kiszámításra kerül a master titok helyben, és session kulcs képződik belőle. Ha a szerver dekódolni tudja az adatot, és befejezni a protokollt, akkor a kliens biztos lehet abban, hogy a szervernek helyes privát kulcsa van. Ez a lépés döntő a szerver hitelesítését illetően. Csak a tanúsítványban lévő nyílt kulcsnak megfelelő privát kulccsal rendelkező szerver képes dekódolni ezt az adatot, és folytatni az egyeztetést. Ez az üzenet szintén tartalmazza a protokoll verziót. A szerver ellenőrzi, hogy ez egyezik-e a kliens által küldött hello üzenet eredeti értékével. Ez a rendszabály megvéd a visszagörgetési támadástól. A visszagörgetési támadás azt próbálja elérni, hogy a kliens és a szerver a kevésbé biztonságos korábbi verziójú protokollt használja a kommunikációban.
  • Hitelesítés ellenőrzés. Ez az üzenet akkor kerül küldésre, ha a kliens előzőleg küldött egy klienshitelesítő üzenetet. A kliens hitelesített lesz, a privát kulcs használatával jelölve egy hash-t minden üzenetből eddig a pontig. A fogadó ellenőrzi az aláírást felhasználva az aláíró nyilvános kulcsát, így megbizonyosodva arról, hogy az a kliens privát kulcsával lett jelölve.
  • Rejtjelkészlet-váltás. Ez az üzenet értesíti a szervert arról, hogy a záró üzenet utáni kommunikáció közösen egyeztetett kulcs és algoritmus szerint fog zajlani.
  • Kliens üzenet befejezése. Ez az üzenet egy hash az adott társalgásból, amely biztosítja a további hitelesítését a kliensnek. Ez az első üzenet, amelyet a rekord réteg kódol és darabol.
A szerver végső válasza a kliensnek
  • Rejtjelkészlet-váltás üzenet. Ez az üzenet értesíti a klienst, hogy a szerver elkezd kódolni a megbeszélt módon.
  • Szerver záró üzenete. Ez az üzenet egy hash az eddigi üzenetekből, felhasználva a session ID-t és a MAC titkot. Ha a felhasználó képes tökéletesen dekódolni ezt az üzenetet, és megerősíteni a hash-t, amelyet tartalmaz, akkor ez azt jelenti, hogy az SSL/TLS handshake tökéletesen sikerült, és a két fél kulcsa megfelel egymásnak.
A riasztást kezdeményező alprotokoll
A riasztási alprotokoll a handshake protokoll egy komponense, amely eseményvezérelt értesítési üzeneteket tartalmaz, amelyet bármelyik fél küldhet.
Eseményvezérelt riasztási üzenetek:
Riasztás üzenete Végzetes Leírás
unexpected_message Igen Helytelen üzenet.
bad_record_mac Igen Helytelen MAC cím.
decryption_failed Igen A TLSCiphertext-et nem képes megfelelően dekódolni.
record_overflow Igen A felvétel nagyobb, mint 2^14+1024 bájt.
handshake_failure Igen Elfogadhatatlan biztonsági paraméterek.
bad_certificate Igen Probléma van a tanúsítvánnyal.
unsupported_certificate Nem A tanúsítvány nem támogatott.
certificate_revoked Nem A tanúsítvány visszavonásra került.
certificate_expired Nem A tanúsítvány lejárt.
certificate_unknown Nem A tanúsítvány ismeretlen.
illegal_parameter Igen Megsértett biztonsági paraméter.
unknown_ca Igen Ismeretlen CA.
access_denied Igen A küldő nem akar megegyezni.
decode_error Igen Nem lehet dekódolni az üzenetet.
decrypt_error Igen A handshake titkosítási művelet hibával leállt.
export_restriction Igen Nem felel meg a kiviteli szabályoknak.
protocol_version Igen A protokoll verzió nem támogatott mindkét oldalon.
insufficient_security Igen Biztonsági szükségletek nem egyeznek.
internal_error Igen Nem a protokoll által okozott hiba.
user_canceled Igen Nem a protokoll által okozott hibás leállás.
no_renegotiation Nem Megegyezési kérés visszavonva.
A felvételi (record) protokoll
A felvételi protokoll adatot fogad az alkalmazási rétegből, és ezután:
  • Feldarabolja az adatot, vagy összeilleszti azt eredeti struktúrává.
  • Sorszámozza az egymás után következő adatblokkokat az üzenetben, hogy megvédjen az adatok újra sorolását végző támadásoktól.
  • Tömöríti, vagy kicsomagolja az adatokat a handshake protokoll által egyeztetett algoritmus segítségével.
  • Kódolja, vagy dekódolja az adatokat a kódoló kulcs és a titkosító algoritmus segítségével, amelynek használatáról a handshake protokoll segítségével állapodtak meg.
  • Érvényesít egy HMAC, vagy MAC műveletet a kimeneti adatra. Kiszámítja a HMAC-ot, és ellenőrzi az egyediségét az átvitt adatnak azért, hogy ellenőrizze az adat integritását, amikor az üzenet megérkezik.
Amint a record protokoll befejezte e műveleteket, átadja az adatait a TCP/IP protokollnak, hogy elvégezze az átvitelt. Az adat érkezik, akkor elküldi a megfelelő folyamatnak feldolgozásra.

SSL/TLS cikksorozat