Copyright © 1998 RNDr. Libor Dostalek

SSL

Protokol SSL vytvořila firma Netscape. Konkurenční firma Microsoft vytvořila obdobný protokol PCT. Oba protokoly jsou si vzájemně natolik podobné, že mnohému software nečiní žádných potíží podporovat oba dva protokoly současně. V této publikaci se budeme podrobně zabývat protokolem SSL verze 3.

Naším cílem není popisovat konfiguraci klientů a serverů podporujících SSL. Nejlepší takovéto návody lze nalézt přímo na stránkách První certifikační autority  http://www.ica.cz .

Protokol TCP/IP neřešil problematiku zabezpečení přenášených dat. Klasický model protokolu TCP/IP v sobě nezahrnuje žádnou vrstvu, která by se touto problematikou zabývala:

Vrstva SSL (Secure Sockets Layer) dodatečně řešící zabezpečení přenášených dat  je vložena mezi aplikační protokol a protokol TCP.

SSL se specializuje na zabezpečení přenosu dat mezi klientem a serverem:

SSL je možné použít pro všechny aplikace, kterým nevadí omezení délky šifrovacího klíče a které nevyžadují elektronické podepisování přenášených transakcí. Tj. není vhodným prostředkem např. pro: Často se setkáváme se zabezpečením protokolu HTTP pomocí vrstvy SSL, takového řešení se označuje jako protokol HTTPS (nezaměňovat s protokolem SHTTP, což je jiný, dnes již málo běžný typ zabezpečení protokolu HTTP!).


Pro pochopení funkce SSL je třeba se na tuto vrstvu podívat podrobněji. SSL se skládá ze 4 dílčích protokolů:

  1. Protokol Record Layer Protocol  (RLP), který je z pohledu aplikačních protokolů onou "vrstvou SSL" (na následujícím obrázku jsou jako aplikační protokoly uvedeny protokoly LDAP a WWW, tj. HTTP). Protokol RLP bere data od aplikačních protokolů, šifruje je a počítá z přenášených fragmentů kontrolní součet. Druhý účastník spojení protokolem RLP ověřuje kontrolní součet, dešifruje data a předává je aplikačnímu protokolu.

  2. Protokol RLP se nezabývá problémy jako je typ použitého šifrovacího algoritmu, stanovení šifrovacího klíče atd. Vše má připraveno protokolem HP v tzv. aktuální protokolové svitě a dalších parametrech zpracování.
  3. Handshake protocol (HP) se z hledika protokolu RLP tváří jako další aplikační protokol. Jeho pakety se balí do protokolu RLP. Protokolem HP si oba účastnící připraví protokolovou svitu (typ šifrovacího protokolu a protokol pro výpočet kontrolního součtu), dohodnou se na komprimačním algoritmu a vymění si data pro výpočet sdíleného tajemství. Ze sdíleného tajemství se pak odvodí symetrické šifrovací klíče a MAC secret. Protokol HP všechny tyto informace připraví nikoliv do aktuální svity, ale do tzv. připravované svity.
  4. Protokol Change Cipher Specification Protocol (CCSP) je velice jednoduchý protokol. Poté co protokol HP připraví novou protokolovou svitu a všechna potřebná data pro činnost RLP protokolu, je třeba zkopírovat připravené parametry zpracování  na aktuální parametry zapracování a začít šifrovat podle nových parametrů. Protokol CSP se skládá pouze z jediné zprávy "zkopíroval jsem připravovanou svitu na aktuální -  nyní je šifrováno podle nové svity".
  5. Dojde-li k jakémukoliv zádrhelu v komunikaci, pak je tu k dispozici Alert Protocol (AP), kterým jedna strana může signalizovat závadu druhé straně. AP lze s trochou nadsázky přirovnat k protokolu ICMP na vrstvě IP.

Každá strana tedy udržuje dvakrát některé parametry komunikace ve svých datových strukturách. Jednou udržuje aktuální data používaná protokolem RLP a podruhé připravovaná data protokolem HP.

Klient se serverem pro komunikaci zřizují tzv. relaci (session), relace může zahrnovat jedno nebo více spojení (connection). Pro úplnost je třeba ještě dodat, že mezi dvěma počítači může být současně zřízeno i více relací.

Klient i server ve svých strukturách udržují následující informace:

Otázka je, jak se tajemství pro výpočet kontrolního součtu a symetrické šifrovací klíče stanoví. Postup je popsán v příslušné normě. Komplikace totiž nastává s tím, že kromě stanovení uvedených hodnot musí norma také    popsat stanovení zkrácených exportních klíčů.

V kapitole o HP si popišeme kdy si klient a server vyměňují svá náhodná čísla (ServerRandom a ClientRandom) a jak se stanovuje sdílené tajemství. Myšlenka pak spočívá v tom, že se vezme sdílené tajemství a obě náhodná čísla a z jejich kombinací  se vypočítá kontrolní součet algorimem MD5 a algoritmem SHA.  Vznikne tak špalek dat (key_block).

Pro zajímavost i přesná formulace podle normy:

 key_block =
       MD5(master_secret + SHA(`A' + master_secret +
                               ServerRandom + ClientRandom)) +
       MD5(master_secret + SHA(`BB' + master_secret +
                               ServerRandom + ClientRandom)) +
       MD5(master_secret + SHA(`CCC' + master_secret +
                               ServerRandom + ClientRandom)) + [...];
 

Ze špalku dat se nejprve odseknou data tvořící tajemství pro výpočet kontrolního součtu klienta (client_write_MAC_secret), pak data tvořící tajemství pro výpočet kontrolního součtu serveru (server_write_MAC_secret), pak šifrovací klíč klienta (client_write_key), šifrovací klíč serveru a nakonec inicializační vektory.

      client_write_MAC_secret[CipherSpec.hash_size]
     server_write_MAC_secret[CipherSpec.hash_size]
     client_write_key[CipherSpec.key_material]
     server_write_key[CipherSpec.key_material]
     client_write_IV[CipherSpec.IV_size] /* non-export ciphers */
     server_write_IV[CipherSpec.IV_size] /* non-export ciphers */
(norma pro popis SSL používá v hranatých závorkách vyjádření délky v bajtech)
 

Record Layer protocol

Record layer protocol přebírá data od aplikačních protokolů  a před tím než je sám předá vrstvě TCP, tak provede:

 Kontrolní součet se nepočítá pouze z fragmentu (resp. komprimovaného fragmentu), ale fragment se pro výpočet kontrolního součtu sřetězí s tajemstvím pro výpočet kontrolního součtu (write_MAC_secret), které je utajované podobně jako jsou utajovány symetrické šifrovací klíče. Chtěl-li by útočník pozměnit obsah přenášeného fragmentu, pak k změněnému fragmentu není schopen vypočítat (a podvrhnout) kontrolní součet  neboť  nezná tajemství pro výpočet kontrolního součtu.

 Záhlaví RLP se skládá ze tří položek.

  1. Typu přenášených dat specifikujícího, jedná-li se o data aplikačního protokolu (např. HTTP) nebo o služební data vrstvy SSL, tj. data některého z protokolů tvořícího vrstvu SSL, tj. HP, AP či CCSP.
  2. Verze SSL
  3. Délky fragmentu, po jeho případné komprimaci a šifrování.
Na následujícím obrázku je RLP fragment znázorněn.

Pro ilustraci jsem si pro předchozí obrázek MS Network Monitorem odchytil jeden paket protokolu HTTPS. Význam prvních pěti bajtů tvořících záhlaví protokolu RLP je vcelku evidentní. Zajímavé je něco úplně jiného, totiž jedná se o počáteční data, kterými klient obnovuje spojení se serverem. Jelikož klient se serverem ještě nejsou dohodnuti na žádném algoritmu pro kompresi, žádném algoritmu pro výpočet kontrolního součtu ani žádném šifrovacím algoritmu, tak RLP protokol nemůže provádět žádné zabezpečení, tj. komunikace běží nekomprimovaně, nešifrovaně a bez kontrolního součtu (česky řečeno: přenáší se "clear text"). Přesněnji řečeno: každý klient i server je nucen pro to, aby byl schopen navázat relaci, podporovat protokolovou svitu SSL_NULL_WITH_NULL_NULL ("žádné šifrování a žádný kontrolní součet"), rovněž musí podporovat komunikaci bez komprese.

V kapitole o HP si právě na tomto úvodním nešifrovaném dialogu protokol HP rozebereme. Vřele doporučuji všem zájemcům o pochopení SSL obdobný postup. Pro úplnost jen dodávám, že je třeba odříznout záhlaví linkové vrstvy, IP vrstvy i TCP vrstvy. V následujícím rámu je pak zobrazen původní paket z MS Network Monitoru. Spojení jsem navazoval s https://cert.ica.cz:4433.  Před tímto TCP paketem musely předcházet ještě tři "nedatové" pakety, kterými protokol TCP sám navazuje spojení, ale to je problém spíše do kapitoly o protokolu TCP.

Úplný výpis prvního datového TCP paketu nesoucí data z předchozího obrázku z MS Network Monitoru je:
 
 
660     21.325  P39AAP         DEC   2171A4   TCP       .AP..., len:   84, seq: 145165779-145165862, ack: 377664001, win: P39AAP          cert.ica.cz    IP

+ FRAME: Base frame properties
+ ETHERNET: ETYPE = 0x0800 : Protocol = IP:  DOD Internet Protocol
  IP: ID = 0x4230; Proto = TCP; Len: 124
      IP: Version = 4 (0x4)
      IP: Header Length = 20 (0x14)
    + IP: Service Type = 0 (0x0)
      IP: Total Length = 124 (0x7C)
      IP: Identification = 16944 (0x4230)
    + IP: Flags Summary = 2 (0x2)
      IP: Fragment Offset = 0 (0x0) bytes
      IP: Time to Live = 128 (0x80)
      IP: Protocol = TCP - Transmission Control
      IP: Checksum = 0x618F
      IP: Source Address = 194.149.104.198
      IP: Destination Address = 194.149.104.203
      IP: Data: Number of data bytes remaining = 104 (0x0068)
  TCP: .AP..., len:   84, seq: 145165779-145165862, ack: 377664001, win: 8760, ...
      TCP: Source Port = 0x05B2
      TCP: Destination Port = 0x1151
      TCP: Sequence Number = 145165779 (0x8A70DD3)
      TCP: Acknowledgement Number = 377664001 (0x1682B201)
      TCP: Data Offset = 20 (0x14)
      TCP: Reserved = 0 (0x0000)
    + TCP: Flags = 0x18 : .AP...
      TCP: Window = 8760 (0x2238)
      TCP: Checksum = 0xB855
      TCP: Urgent Pointer = 0 (0x0)
      TCP: Data: Number of data bytes remaining = 84 (0x0054)

00000:  00 00 F8 21 71 A4 00 20 AF FA 25 89 08 00 45 00   ...!q.. ..%...E.
00010:  00 7C 42 30 40 00 80 06 61 8F C2 95 68 C6 C2 95   .|B0@...a...h...
00020:  68 CB 05 B2 11 51 08 A7 0D D3 16 82 B2 01 50 18   h....Q........P.
00030:  22 38 B8 55 00 00 16 03 00 00 4F 01 00 00 4B 03   "8.U......O...K.
00040:  00 34 F3 C2 D1 1E AD 65 2B 7A 2F 95 A5 F0 68 AA   .4.....e+z/...h.
00050:  8E 55 F8 53 B3 B3 AC C7 9E E9 0C B6 5C 62 A8 BE   .U.S........\b..
00060:  9F 20 03 99 14 66 7F DE 5A 47 10 19 F6 47 C7 4D   . ...f.ZG...G.M
00070:  15 6A 4A 43 3A BA B1 65 82 AC 98 52 68 7D 06 EE   .jJC:..e...Rh}..
00080:  2D E1 00 04 00 03 00 06 01 00                     -......... 
 

Alert protocol

Alert protokol je jednoduchý protokol, kterým se účastníci komunikace vzájemně informují o chybách v SSL-komunikaci. Rozeznávají se dvě úrovně závažnosti:
  1. Upozornění, po kterém může komunikace dále pokračovat.
  2. Fatální chyba, po které se komunikace  ukončuje.

 

Change cipher specification protocol

CCSP je protokol skládající se pouze z jedné zprávy. Tato zpráva signalizuje, že došlo ke zkopírování datové struktury s připravovanými parametry zabezpečení spojení, do aktuální struktury, kterou používá protokol RLP. Veškerá data, která následují za touto zprávou jsou již zabezpečena za využítí nového šifrovacího klíče, nového tajemství pro výpočet kontrolního součtu atd.

Slovně bychom mohli zprávu Change cipher specification vyjádřit jako "změna šifrovacího klíče". Jen je třeba dodat, že tuto změnu provádí klient a server na sobě nezávisle, tj. jedna strana provede změnu a druhá třeba až za okamžik - za svou zprávou Change cipher specification.

TCP paket může obsahovat zprávu  Change cipher specification uprostřed, tj. část RLP-fragmentu předcházející tuto zprávu je šifrována jinak než část RLP-fragmentu za touto zprávou.

Na obrázku je použito slovo svita. Používám jej více méně proto, že se mi toto slovo líbí, i když protokolová svita specifikuje pouze algoritmus použitý pro symetrickou šifru a algoritmus pro výpočet kontrolního součtu.
 
 

Handshake protocol

Protokol HP je jádrem SSL. HP zabezpečuje: Komunikace v HP protokolu se skládá z tzv. zpráv. Rozeznávají se dva základní případy komunikace protokolem HP:
  1. Navazování nové relace, tj. server přiděluje nový identifikátor relace.
  2. Obnovení relace (použije se původní indetifikátor relace). Tento případ je v podstatě zjednodušením předchozího případu. Tj. používají se jen některé zprávy.
Nadále se omezíme na popis podmnožiny SSL využívající k autentizaci certifikáty X.509v3 s veřejnými klíči pro algoritmus RSA. S ostatními případy nemáme praktické zkušenosti a laskavého čtenáře odkazujeme na příslušnou normu SSL.

Struktura HP paketu připomíná RLP paket. V záhlaví jsou jakoby stejné informace. Rozdíl je mj. v tom, že HP paket už může být  šifrován i se svým záhlavím.

Na předchozím obrázku je v paketu RLP uložena zpráva typu ClientHello o délce 4B16. Nyní nám půjde o objasnění jednotlivých typů zpráv.
 

HelloRequest

HelloRequest je prázdná málo běžná zpráva, kterou server upozorňuje klienta, že je na čase, aby klient odeslal zprávu ClientHello. Jedině totiž klinet může odeslat zprávu ClientRequest, kterou HP protokol začíná výměnu zprávu, která vede k ustanovení nových šifrovacích klíčů.

Obnovení relace

Jednodušším případem komunikace mezi klientem a serverem je obnovení již dříve existující relace. Kdy se s takovým případem setkáváme? Obnovením se většinou nemyslí (i když se to nevylučuje), obnovení spojení např. po závadě na komunikačních linkách - to je záležitost nižšího protokolu, v našem případě protokolu TCP. Spíše se zde bude jednat o trochu jiný případ. Představte si, že si prohlížíte WWW-stránky na  HTTPS serveru. Přečtete si první stránku pro což musela být navázána relace. První stránka se skládala z celé řady objektů (textů, obrázků či zvuků), pro ztažení každého z těchto objektu v protokolu HTTP/1.0 se navazuje samostatné spojení protokolem TCP. Po ztažení všech objektů stránky se všechna TCP spojení uzavřou. (Pro úplnost dodejme, že v protokolu HTTP/1.1 je běžnější všechny objekty téže stránky ztahovat jedním spojením.)

Poté si ztaženou stránku prohlížíme na obrazovce. Během prohlížení není navázáno žádné spojení - není ani jasné, zda-li budeme další informace požadovat z téhož nebo jiného HTTPS serveru. V případě, že požadujeme další stránku z téhož serveru, pak se pro ztažení nových objektů navazují nová TCP spojení a SSL tentokráte  relaci obnovuje. O tom, zda-li bude relace obnovována rozhoduje nastavení klienta (obnovuje se zpravidla pokud mezi tím nebyl klientův program ukončen a znovu nastartován -  to lze však prvděpodobně i změnit v konfiguraci klienta).


Při obnovování spojení klient odešle serveru zprávu ClientHello. Zpráva ClientHello obsahuje náhodné číslo ClinetRandom vstupující do výpočtu sdíleného tajemství. Zejména však zpráva ClinetHello obsahuje identifikátor obnovované relace. Dále zpráva ClientHello obsahuje seznam kryptografických algoritmů podporovaných klientem.

Server odpovídá zprávou ServerHello obsahující náhodné číslo ServerHello vstupující též do výpočtu sdíleného tajemství. Zpráva ServerHello obsahuje opět identifikátor obnovované relace a zejména kryprografické algoritmy, které si server vybral z těch, které klient podporuje. V případě, že server zamítne obnovit relaci či si nevybere z nabízených kryptografických algoritmů, pak server neodpoví zprávou ServerHello, ale protokolem Alert a uzavře TCP-spojení.

V případě, že server spojení neuzavře odešle protokolem Change cipher specification informaci, že "přešel na nové šifrovací klíče" a pošle zprávu Finished obsahující kontrolní součet ze všech zpráv od zprávy ClinetHello. Klient už jen pošle potvrzující zprávu Change cipher specification a Finished, kterými výměnu zpráv potvrdí. Dále již běží přenos vlastních aplikačních dat, který je šifrován. Každý RLP fragment obsahuje též kontrolní součet zabezpečující integritu přenášených dat (už zprávy Finished byly šifrovány).

Klient a server si vyměňují zprávy protokolu HP jak je znázorněno na následujícím obrázku:

Ne všechny zprávy jsou zprávy protokolu HP. V určitém okamžku oba partneři vydávají zprávu Change cipher specification - "přejdi na nový šifrovací klíč", která není zprávou protokolu HP, ale zprávou samostatného protokolu Change cipher specification.
 

ClientHello

Zpráva ClientHello je tvořena:
  1. Opět verzí dlouhou 2B.
  2. 32 B dlouhým náhodným číslem (ClientRandom) generovaným klientem. Toto náhodné číslo se skládá ze dvou částí:
  3. Identifikátorem relace (SessionID). Při prvním navazování nového spojení je tato položka nulová, protože SessionID určuje server. V případě, že se spojení obnovuje, pak toto pole obsahuje číslo obnovované relace.
  4. Protokolové svity jsou dvojbajtové řetězce identifikující šifrovací protokol a protokol pro výpočet kontrolního součtu. Klient v této zprávě popisuje všechny jím podporované protokolové svity. Říká: "Já podporuji následující svity. Servře vyber si z nich jednu a tu mi pošli ve zprávě ServerHello". První dva bajty vyjadřují délku řetězce  předávaných protokolových svit.
  5. Podporové kompresní alogoritmy. První bajt vyjadřuje počet podporovaných kompresních algoritmů klientem. Každý následující bajt pak popisuje jeden podporovaný algoritmus.

V kapitole o  protokolu RLP jsme uvedeli příklad RLP paketu, který v sobě nesl zprávu ClinetHello.  Z tohoto příkladu odřízneme záhlaví protokolů IP, TCP i záhlaví fragmentu RLP a získáme:

03 00 34 F3 C2 D1 1E AD 65 2B 7A 2F 95 A5 F0 68 AA 8E 55 F8 53 B3 B3 AC
C7 9E E9 0C B6 5C 62 A8 BE 9F 20 03 99 14 66 7F DE 5A 47 10 19 F6 47 C7
4D 15 6A 4A 43 3A BA B1 65 82 AC 98 52 68 7D 06 EE 2D E1 00 04 00 03 00
06 01 00

Na počátku jsou první dva bajty určující verzi: 03 00.

Následuje 32 bajtů náhodného čísla tvořeného  4B vyjadřujících datum a čas plus 28 B z generátoru náhodných čísel: 34 F3 C2 D1 1E AD 65 2B 7A 2F 95 A5 F0 68 AA 8E 55 F8 53 B3 B3 AC C7 9E E9 0C B6 5C 62 A8 BE 9F

První bajt Session ID specifikuje délku, následující bajty pak  identifikátor relace: 2016=3210   03 99 14 66 7F DE 5A 47 10 19 F6 47 C7 4D 15 6A 4A 43 3A BA B1 65 82 AC 98 52 68 7D 06 EE 2D E1

Pole protokolových svit je uvozeno dvojbajtovou délkou, za kterým následují jednotlivé dvojice bajtů specifikující šifrovací protokol a protokol pro výpočet kontrolního součtu:  00 04   00 03  00 06. Z následující tabulky pak zjistíme, že klient podporuje dvě svity (4 bajty): SSL_RSA_EXPORT_WITH_RC4_40_MD5 a SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5. Tj. autentizaci pomocí RSA,  šifrovací protokoly RC4 nebo RC2 s exportními omezeními na délku klíče 40 bitů a kontrolní součet bude počítán podle algoritmu MD5.

Pole podporovaných kompresních metod je uvozeno 1B délky následovaným jednobajtovými identifikacemi jednotlivých kompresních protokolů : 01 00 (tj. bez komprese)
 
 
     CipherSuite SSL_NULL_WITH_NULL_NULL                = 00 00 
          (předchozí svita je používána zejména na počátku komunikace) 
     CipherSuite SSL_RSA_WITH_NULL_MD5                  = 00 01
     CipherSuite SSL_RSA_WITH_NULL_SHA                  = 00 02
     CipherSuite SSL_RSA_EXPORT_WITH_RC4_40_MD5         = 00 03
     CipherSuite SSL_RSA_WITH_RC4_128_MD5               = 00 04
     CipherSuite SSL_RSA_WITH_RC4_128_SHA               = 00 05
     CipherSuite SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5     = 00 06
     CipherSuite SSL_RSA_WITH_IDEA_CBC_SHA              = 00 07
     CipherSuite SSL_RSA_EXPORT_WITH_DES40_CBC_SHA      = 00 08
     CipherSuite SSL_RSA_WITH_DES_CBC_SHA               = 00 09
     CipherSuite SSL_RSA_WITH_3DES_EDE_CBC_SHA          = 00 0A
     CipherSuite SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA   = 00 0B
     CipherSuite SSL_DH_DSS_WITH_DES_CBC_SHA            = 00 0C
     CipherSuite SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA       = 00 0D
     CipherSuite SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA   = 00 0E
     CipherSuite SSL_DH_RSA_WITH_DES_CBC_SHA            = 00 0F
     CipherSuite SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA       = 00 10
     CipherSuite SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA  = 00 11
     CipherSuite SSL_DHE_DSS_WITH_DES_CBC_SHA           = 00 12
     CipherSuite SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA      = 00 13
     CipherSuite SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA  = 00 14
     CipherSuite SSL_DHE_RSA_WITH_DES_CBC_SHA           = 00 15
     CipherSuite SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA      = 00 16
     CipherSuite SSL_DH_anon_EXPORT_WITH_RC4_40_MD5     = 00 17
     CipherSuite SSL_DH_anon_WITH_RC4_128_MD5           = 00 18
     CipherSuite SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA  = 00 19
     CipherSuite SSL_DH_anon_WITH_DES_CBC_SHA           = 00 1A
     CipherSuite SSL_DH_anon_WITH_3DES_EDE_CBC_SHA      = 00 1B
     CipherSuite SSL_FORTEZZA_KEA_WITH_NULL_SHA         = 00 1C
     CipherSuite SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA = 00 1D
     CipherSuite SSL_FORTEZZA_KEA_WITH_RC4_128_SHA      = 00 1E 

 

ServerHello

Zpráva ServerHello obsahuje:

Pro ilustraci si Network monitorem opět odchytíme odpoveď serveru klientovi:
 
 
+ FRAME: Base frame properties
+ ETHERNET: ETYPE = 0x0800 : Protocol = IP:  DOD Internet Protocol
  IP: ID = 0x9D71; Proto = TCP; Len: 119
      IP: Version = 4 (0x4)
      IP: Header Length = 20 (0x14)
    + IP: Service Type = 0 (0x0)
      IP: Total Length = 119 (0x77)
      IP: Identification = 40305 (0x9D71)
    + IP: Flags Summary = 0 (0x0)
      IP: Fragment Offset = 0 (0x0) bytes
      IP: Time to Live = 60 (0x3C)
      IP: Protocol = TCP - Transmission Control
      IP: Checksum = 0x8A53
      IP: Source Address = 194.149.104.203
      IP: Destination Address = 194.149.104.198
      IP: Data: Number of data bytes remaining = 99 (0x0063)
  TCP: .AP..., len:   79, seq: 377664001-377664079, ack: 145165863, win:33580,... 
      TCP: Source Port = 0x1151
      TCP: Destination Port = 0x05B2
      TCP: Sequence Number = 377664001 (0x1682B201)
      TCP: Acknowledgement Number = 145165863 (0x8A70E27)
      TCP: Data Offset = 20 (0x14)
      TCP: Reserved = 0 (0x0000)
    + TCP: Flags = 0x18 : .AP...
      TCP: Window = 33580 (0x832C)
      TCP: Checksum = 0xC423
      TCP: Urgent Pointer = 0 (0x0)
      TCP: Data: Number of data bytes remaining = 79 (0x004F)

00000:  00 20 AF FA 25 89 00 00 F8 21 71 A4 08 00 45 00   . ..%....!q...E.
00010:  00 77 9D 71 00 00 3C 06 8A 53 C2 95 68 CB C2 95   .w.q..<..S..h...
00020:  68 C6 11 51 05 B2 16 82 B2 01 08 A7 0E 27 50 18   h..Q.........'P.
00030:  83 2C C4 23 00 00 16 03 00 00 4A 02 00 00 46 03   .,.#......J...F.
00040:  00 34 F3 D0 18 4C 49 D9 E1 07 A6 C4 0D 8D A1 BD   .4...LI.........
00050:  09 53 C7 1B B8 51 8F E9 56 2B 7A FF 41 D9 E8 13   .S...Q..V+z.A...
00060:  10 20 03 99 14 66 7F DE 5A 47 10 19 F6 47 C7 4D   . ...f.ZG...G.M
00070:  15 6A 4A 43 3A BA B1 65 82 AC 98 52 68 7D 06 EE   .jJC:..e...Rh}..
00080:  2D E1 00 03 00                                    -.... 
 

Po odříznutí záhlaví IP a TCP získáme:

16 03 00 00 4A 02 00 00 46 03 00 34 F3 D0 18 4C 49 D9 E1 07 A6 C4 0D 8D A1 BD 09 53 C7 1B B8 51 8F E9 56 2B 7A FF 41 D9 E8 13 10 20 03 99 14 66 7F DE 5A 47 10 19 F6 47 C7 4D 15 6A 4A 43 3A BA B1 65 82 AC 98 52 68 7D 06 EE 2D E1 00 03 00

Záhlaví RLP fragmentu je 16 03 00 00 4A. Kde 16 specifikuje Handsake Protocol, 03 00 určuje verzi 3.0 a 4A16=7410vyjadřuje délku RLP fragmentu.

Záhlaví HP protokolu je  02 00 00 46. Kde 02 specifikuje zprávu  ServerHello a 00004616=7010 vyjadřuje délku zprávy.

Verze záhlaví protokolu HP je opět 03 00.

Náhodné číslo (ServerRandom) je dlouhé 32 bajtů: 34 F3 D0 18 4C 49 D9 E1 07 A6 C4 0D 8D A1 BD 09 53 C7 1B B8 51 8F E9 56 2B 7A FF 41 D9 E8 13 10.

Identifikátor relace začíná jedním bajtem specifikujícím délku identifikátoru (2016=3210) následovaným vlastním identifikátorem relace: 20  03 99 14 66 7F DE 5A 47 10 19 F6 47 C7 4D 15 6A 4A 43 3A BA B1 65 82 AC 98 52 68 7D 06 EE 2D E1.

Pak následuje serverem vybraná protokolová svita (jedna z těch které nabízí klient - v případě, že by si server nevybral, pak neodpoví zprávou ServerHello, ale Alert Protokolem a následuje ukončení spojení). V našem případě server zvolil svitu 00 03, tj. podle tabulky SSL_RSA_EXPORT_WITH_RC4_40_MD5.

Poslední bajt obsahuje serverem zvolený komprimační algoritmus. V tomto případě volba 00 signalizuje, že komprese nebude použita.
 

Change cipher specification & Finished

Server po zprávě ServerHello v případě obnovování spojení okamžitě signalizuje protokolem Change cipher specification, že datová část všech následujícíh RLP paketů  již bude šifrována podle zvolené svity. Poté následuje zpráva Finished.

Zpráva Finished obsahuje kontrolní součet algorimem MD5 následovaný kontrolním součet algoritmem SHA z řetězce skládajícího se mj. ze sdíleného tajemství a obsahu všech zpráv od zprávy ClientHello. Jelikož sdílené tajemství zná pouze klient a server, tak je velice obtížné útočníkovi do obnovování spojení vložit nějaká nepatřičná data. Jedná se již o šifrovaná data, tedy do nich nevidíme network monitorem.

Vraťme se k našemu příkladu. Server vrací v jednom TCP paketu  change cipher specification a zprávu Finished:
 
+ FRAME: Base frame properties
+ ETHERNET: ETYPE = 0x0800 : Protocol = IP:  DOD Internet Protocol
  IP: ID = 0x9D73; Proto = TCP; Len: 107
      IP: Version = 4 (0x4)
      IP: Header Length = 20 (0x14)
    + IP: Service Type = 0 (0x0)
      IP: Total Length = 107 (0x6B)
      IP: Identification = 40307 (0x9D73)
    + IP: Flags Summary = 0 (0x0)
      IP: Fragment Offset = 0 (0x0) bytes
      IP: Time to Live = 60 (0x3C)
      IP: Protocol = TCP - Transmission Control
      IP: Checksum = 0x8A5D
      IP: Source Address = 194.149.104.203
      IP: Destination Address = 194.149.104.198
      IP: Data: Number of data bytes remaining = 87 (0x0057)
  TCP: .AP..., len:   67, seq: 377664080-377664146, ack: 145165863, win:33580,... 
      TCP: Source Port = 0x1151
      TCP: Destination Port = 0x05B2
      TCP: Sequence Number = 377664080 (0x1682B250)
      TCP: Acknowledgement Number = 145165863 (0x8A70E27)
      TCP: Data Offset = 20 (0x14)
      TCP: Reserved = 0 (0x0000)
    + TCP: Flags = 0x18 : .AP...
      TCP: Window = 33580 (0x832C)
      TCP: Checksum = 0xBF40
      TCP: Urgent Pointer = 0 (0x0)
      TCP: Data: Number of data bytes remaining = 67 (0x0043)

00000:  00 20 AF FA 25 89 00 00 F8 21 71 A4 08 00 45 00   . ..%....!q...E.
00010:  00 6B 9D 73 00 00 3C 06 8A 5D C2 95 68 CB C2 95   .k.s..<..]..h...
00020:  68 C6 11 51 05 B2 16 82 B2 50 08 A7 0E 27 50 18   h..Q.....P...'P.
00030:  83 2C BF 40 00 00 14 03 00 00 01 01 16 03 00 00   .,.@............
00040:  38 F5 69 2F 21 94 07 87 5A 9E 63 EB 56 01 02 91   8.i/!...Z.c.V...
00050:  DD DB 78 42 31 91 BA 3F 05 80 71 D3 86 9D E9 BB   ..xB1..?..q.....
00060:  79 06 5F 75 36 27 3D 04 A0 B7 93 D5 64 56 FC D4   y._u6'=.....dV..
00070:  80 B0 52 E2 C2 7A E4 4E 8D                        ..R..z.N. 

Tento TCP paket v sobě obsahuje zprávu change cipher specification a současně zprávu finished protokolu HP.

14 03 00 00 01 01  je change cipher specification.

Ze záhlaví RLP fragmentu předcházející vlastní zprávu Finished jsme schopni poznat pouze, že se jedná o HP protokol (16) verzi (03 00) a délku, která je šetnáctkově 0038. Dále už je vše šifrováno:
16 03 00 00 38 F5 69 2F 21 94 07 87 5A 9E 63 EB 56 01 02 91 DD DB 78 42 31 91 BA 3F 05 80 71 D3 86 9D E9 BB 79 06 5F 75 36 27 3D 04 A0 B7 93 D5 64 56 FC D4 80 B0 52 E2 C2 7A E4 4E 8D

Přesto stojí za to se nad touto zašifrovanou zprávou ještě zamyslet.  RLP fragment se zprávou finished má strukturu:

Ze zprávy ServerHello jsme zjistili, že server zvolil svitu SSL_RSA_EXPORT_WITH_RC4_40_MD5, tj. RLP fragment obsahuje na konci ještě kontrolní součet algoritmem MD5 (16 bajtů) a výplň. Takže aniž bychom viděli do přenášených dat tak ve zbylých tj. šifrovaných bajtech (po odříznutí i RLP záhlaví):  F5 69 2F 21 94 07 87 5A 9E 63 EB 56 01 02 91 DD DB 78 42 31 91 BA 3F 05 80 71 D3 86 9D E9 BB 79 06 5F 75 36 27 3D 04 A0 B7 93 D5 64 56 FC D4 80 B0 52 E2 C2 7A E4 4E 8D

Prvních16+20 bajtů (F5 69 2F 21 94 07 87 5A 9E 63 EB 56 01 02 91 DD DB 78 42 31 91 BA 3F 05 80 71 D3 86 9D E9 BB 79 06 5F 75 36) musí být vlastní zpráva Finished, dalších 16 bajtů (27 3D 04 A0 B7 93 D5 64 56 FC D4 80 B0 52 E2 C2) kontrolní součet z RLP fragmentu a zbytek 7A E4 4E 8D může být jen výplň.(Ja to nevím, protože jsem to nedešifroval, ale jak by to bylo jinak?)

Následuje  odpověď klienta ve dvou TCP paketech:
 
 
+ FRAME: Base frame properties
+ ETHERNET: ETYPE = 0x0800 : Protocol = IP:  DOD Internet Protocol
  IP: ID = 0x4430; Proto = TCP; Len: 46
      IP: Version = 4 (0x4)
      IP: Header Length = 20 (0x14)
    + IP: Service Type = 0 (0x0)
      IP: Total Length = 46 (0x2E)
      IP: Identification = 17456 (0x4430)
    + IP: Flags Summary = 2 (0x2)
      IP: Fragment Offset = 0 (0x0) bytes
      IP: Time to Live = 128 (0x80)
      IP: Protocol = TCP - Transmission Control
      IP: Checksum = 0x5FDD
      IP: Source Address = 194.149.104.198
      IP: Destination Address = 194.149.104.203
      IP: Data: Number of data bytes remaining = 26 (0x001A)
  TCP: .AP..., len:    6, seq: 145165863-145165868, ack: 377664147, win: 8614, ... 
      TCP: Source Port = 0x05B2
      TCP: Destination Port = 0x1151
      TCP: Sequence Number = 145165863 (0x8A70E27)
      TCP: Acknowledgement Number = 377664147 (0x1682B293)
      TCP: Data Offset = 20 (0x14)
      TCP: Reserved = 0 (0x0000)
    + TCP: Flags = 0x18 : .AP...
      TCP: Window = 8614 (0x21A6)
      TCP: Checksum = 0x2B79
      TCP: Urgent Pointer = 0 (0x0)
      TCP: Data: Number of data bytes remaining = 6 (0x0006)

00000:  00 00 F8 21 71 A4 00 20 AF FA 25 89 08 00 45 00   ...!q.. ..%...E.
00010:  00 2E 44 30 40 00 80 06 5F DD C2 95 68 C6 C2 95   ..D0@..._...h...
00020:  68 CB 05 B2 11 51 08 A7 0E 27 16 82 B2 93 50 18   h....Q...'....P.
00030:  21 A6 2B 79 00 00 14 03 00 00 01 01               !.+y........ 
 

V tomto TCP paketu byla pouze zpráva protokolu Change Ciper Specification: 14 03 00 00 01 01. Tato zpráva říká, že datová část (nikoliv záhlaví) následujících RLP fragmentů bude šifrována podle nové svity a podle nových klíčů.

Následující TCP paket obsahuje zprávu Finished bezprostředně již následovanou šifrovanými aplikačními daty. Aplikační data jsou vyznačeně kurzivou:
 
+ FRAME: Base frame properties
+ ETHERNET: ETYPE = 0x0800 : Protocol = IP:  DOD Internet Protocol
  IP: ID = 0x4530; Proto = TCP; Len: 438
      IP: Version = 4 (0x4)
      IP: Header Length = 20 (0x14)
    + IP: Service Type = 0 (0x0)
      IP: Total Length = 438 (0x1B6)
      IP: Identification = 17712 (0x4530)
    + IP: Flags Summary = 2 (0x2)
      IP: Fragment Offset = 0 (0x0) bytes
      IP: Time to Live = 128 (0x80)
      IP: Protocol = TCP - Transmission Control
      IP: Checksum = 0x5D55
      IP: Source Address = 194.149.104.198
      IP: Destination Address = 194.149.104.203
      IP: Data: Number of data bytes remaining = 418 (0x01A2)
  TCP: .AP..., len:  398, seq: 145165869-145166266, ack: 377664147, win: 8614,... 
      TCP: Destination Port = 0x1151
      TCP: Sequence Number = 145165869 (0x8A70E2D)
      TCP: Acknowledgement Number = 377664147 (0x1682B293)
      TCP: Data Offset = 20 (0x14)
      TCP: Reserved = 0 (0x0000)
    + TCP: Flags = 0x18 : .AP...
      TCP: Window = 8614 (0x21A6)
      TCP: Checksum = 0x223D
      TCP: Urgent Pointer = 0 (0x0)
      TCP: Data: Number of data bytes remaining = 398 (0x018E)

00000:  00 00 F8 21 71 A4 00 20 AF FA 25 89 08 00 45 00   ...!q.. ..%...E.
00010:  01 B6 45 30 40 00 80 06 5D 55 C2 95 68 C6 C2 95   ..E0@...]U..h...
00020:  68 CB 05 B2 11 51 08 A7 0E 2D 16 82 B2 93 50 18   h....Q...-....P.
00030:  21 A6 22 3D 00 00 16 03 00 00 38 F5 BD 37 32 24   !."=......8..72$
00040:  AB 67 EF 7E D3 68 9E 48 DC 84 10 6C D1 77 FD 15   .g.~.h.H...l.w..
00050:  24 16 E1 4F 2D E8 A6 7E BA 79 B5 54 06 1A 90 FD   $..O-..~.y.T....
00060:  27 20 8E 3A 24 25 39 A4 86 B6 D7 30 FF 0E 44 3E   ' .:$%9....0..D>
00070:  83 B8 DF 17 03 00 01 4C 18 F9 97 F7 2D 02 97 E5   .......L....-... 
00080:  A8 93 AB 73 89 9F 7E 08 E0 42 6C 52 13 EA CD 66   ...s..~..BlR...f 
00090:  0A D4 CE ED C5 91 E5 67 01 B2 06 80 0B 35 DF A5   .......g.....5.. 
000A0:  B7 6A E3 15 FB 1C AC C1 59 B3 50 23 04 D1 15 6C   .j......Y.P#...l 
000B0:  39 4F B0 36 30 BE BA E1 51 F9 4E F1 2E EE 59 4A   9O.60...Q.N...YJ 
000C0:  12 27 EB FD 45 1A 65 52 C6 49 92 57 DC C5 69 F7   .'..E.eR.I.W..i. 
000D0:  09 27 76 27 9E D9 54 A6 27 86 98 55 14 E6 F2 B2   .'v'..T.'..U.... 
000E0:  7F 43 55 DC E1 00 18 96 8A 6D B8 54 6F 89 1D 90   CU......m.To... 
000F0:  AB E2 09 33 58 34 02 B1 DF 31 E9 1E CF 34 76 53   ...3X4...1...4vS 
00100:  F7 94 4E 66 25 BA BB 06 A3 D6 06 C2 78 0F D2 33   ..Nf%.......x..3 
00110:  AA BC FB F2 F3 3B 54 95 E6 EF DF 2E 9B 3F B0 60   .....;T......?.` 
00120:  AA D8 50 CA 48 FF EE 36 A6 60 6F FB 23 B3 84 21   ..P.H..6.`o.#..! 
00130:  55 32 E5 72 4F 83 A5 E9 7D 63 43 BE EA 21 82 C0   U2.rO...}cC..!.. 
00140:  65 39 A1 6C BF 66 72 7F 76 04 CD A2 22 35 D3 E8   e9.l.frv..."5.. 
00150:  B8 D4 2F C0 99 E7 89 78 A2 D5 19 2D 0C 02 62 F2   ../....x...-..b. 
00160:  6E 2D BB E3 B1 76 F3 E6 75 8C 5D 7F D2 3A ED 8D   n-...v..u.].:.. 
00170:  A1 4B 55 54 D8 D9 08 D4 2E 5B DB 2B 29 8E 63 AA   .KUT.....[.+).c. 
00180:  5B 6F D3 56 B8 28 56 C5 89 ED A1 B6 8D 1C 9D 56   [o.V.(V........V 
00190:  8D AE 20 D3 37 D2 6B 74 E8 2A 53 8F AF A1 A1 97   .. .7.kt.*S..... 
001A0:  A4 57 B4 D0 1E 9B CA 1A F4 61 C7 F2 6B CD DF 3E   .W.......a..k..> 
001B0:  F0 BF 69 A2 98 A8 07 23 D1 28 F8 35 E0 2E 17 8A   ..i....#.(.5.... 
001C0:  90 55 72 A9                                      .Ur. 

Datový fragment začíná hlavičkou RLP protokolu 17 03 00 01 4C  a za ní následuje 14C16=33210šifrovaných dat: 18 F9 97 F7 2D 02 97 E5... . Jelikož se jedná o protokol HTTP šifrovaný algoritmem RC4 s 40 bitů dlouhým klíčem (viz zpráva ServerHello), tak útočník má velice zjednodušenou šanci, protože na počátku v HTTP-datech byl s velkou pravděpodobností řetězec "GET ", kromě toho lze vysledovat i další pro útočníka zajímavé informace. Opět i v odpovědi serveru útočník s největší pravděpodobností odhadne, jak bude vypadat první řádka (pravděpodobně: "HTTP/1.0 200 OK"). Nalezení šifrovacího klíče ponechme útočníkovi (klient i  server používají každý svůj symetrický klíč). Jedná-li se o desetiletého útočníka, pak mu to nějakou dobu potrvá. Bojuje-li proti nám NSA, pak se šušká že NSA najede šifrovací klíč on line.

Aplikační data jsou uložena v RLP fragmentu na jeho počátku, za nimi následuje kontrolní součet a výplň.

Poučení: Takto zabezpečeným kanálem bychom nikdy neměli posílat např. údaje o kreditních kartách atp. Při elektronickém obchodování je protokol HTTPS určen pro vybírání zboží (procházení virtuálním obchodním domem); pro vlastní placení zboží by se pak použít protokol SET.

Poznámka: v předchozích ukázkách jsem odchytil  pakety a vypsal. Vypsal jsem pouze pakety nesoucí z hlediska protokolu TCP data, pakety bez dat (bez TCP-přiznaku PUSH), které pouze potvrzují přijetí dat jsem vynechal, takže při bližším zkoumání uvedených paketů zjistíte, že mohou být přeskočeny některé sekvence ACK (byly potvrzeny vynechanými nedatovými pakety).
 

 Zřízení nové relace