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