Kaip veikia SSL šifravimas

Kaip veikia SSL šifravimas: išsamus paaiškinimas nuo TLS handshake iki kriptografinių algoritmų

Kiekvieną dieną milijardai žmonių siunčia slaptažodžius, kortelių numerius, asmeninius pranešimus ir konfidencialius dokumentus per internetą. Visa tai keliauja per dešimtis tinklo mazgų, maršrutizatorių ir serverių, kol pasiekia galutinį tašką. Be šifravimo bet kuris šių tarpinių taškų galėtų perimti ir perskaityti jūsų duomenis kaip atvirą knygą.

SSL/TLS šifravimas yra technologija, kuri to neleidžia. Kai naršyklės adreso juostoje matote spynelės piktogramą ir raides „HTTPS”, tai reiškia, kad tarp jūsų kompiuterio ir serverio sukurtas šifruotas tunelis, per kurį duomenys keliauja nematomi pašaliniams.

Tačiau kas vyksta po tos spynelės dangčiu? Kaip du kompiuteriai, niekada anksčiau nekomunikavę, per kelias milisekundes susitaria dėl šifravimo ir pradeda saugiai keistis duomenimis? Šiame straipsnyje išnagrinėsime visą SSL/TLS šifravimo mechaniką: nuo pirmojo kontakto iki paskutinio užšifruoto baito.

SSL ir TLS: terminų paaiškinimas

Prieš gilinantis į techninę pusę, svarbu susitvarkyti terminus, nes jie dažnai painiojami.

SSL (Secure Sockets Layer) buvo originalus šifravimo protokolas, sukurtas Netscape kompanijos 1995 metais. Buvo išleistos trys versijos:

  • SSL 1.0 – niekada nebuvo viešai išleista dėl saugumo spragų
  • SSL 2.0 (1995) – turėjo rimtų pažeidžiamumų, oficialiai atsisakyta 2011 m.
  • SSL 3.0 (1996) – veikė ilgiau, tačiau 2014 m. aptiktas POODLE pažeidžiamumas privertė jį atsisakyti

TLS (Transport Layer Security) yra SSL įpėdinis, sukurtas IETF (Internet Engineering Task Force):

  • TLS 1.0 (1999) – pirma versija, panaši į SSL 3.0, tačiau su pataisymais
  • TLS 1.1 (2006) – apsauga nuo CBC atakų
  • TLS 1.2 (2008) – dabartinis plačiai naudojamas standartas, palaiko AEAD šifravimo rinkinius
  • TLS 1.3 (2018) – naujausias standartas, greitesnis ir saugesnis

Svarbu suprasti: kai šiandien sakome „SSL sertifikatas” arba „SSL šifravimas”, iš tikrųjų turime omenyje TLS. Pats SSL protokolas yra miręs ir nebepriimamas jokiame šiuolaikiniame serveryje ar naršyklėje. Tačiau pavadinimas „SSL” įstrigo kaip bendras terminas, panašiai kaip „kserokopijavimas” reiškia kopijavimą nepriklausomai nuo aparato gamintojo.

Šiame straipsnyje naudosime „TLS”, kai kalbėsime apie konkrečius techninius procesus, ir „SSL/TLS”, kai kalbėsime apie koncepciją bendrai.

Kriptografijos pagrindai: trys stulpai

SSL/TLS šifravimas remiasi trimis kriptografijos sritimis. Kiekviena atlieka skirtingą funkciją, ir tik visos kartu užtikrina saugų ryšį.

1. Asimetrinis šifravimas (viešojo rakto kriptografija)

Asimetrinis šifravimas naudoja du matematiniu atžvilgiu susijusius raktus: viešąjį raktą (public key) ir privatųjį raktą (private key).

Kaip tai veikia:

  • Viešasis raktas yra prieinamas visiems. Jis įtrauktas į SSL sertifikatą ir siunčiamas kiekvienam, kas jungiasi prie serverio.
  • Privatus raktas žinomas tik serverio savininkui. Jis niekada nepaliekia serverio.
  • Duomenis, užšifruotus viešuoju raktu, galima iššifruoti tik privačiu raktu.
  • Duomenis, pasirašytus privačiu raktu, galima patikrinti tik viešuoju raktu.

Analogija: įsivaizduokite pašto dėžutę su plyšiu. Bet kas gali įmesti laišką per plyšį (užšifruoti viešuoju raktu), tačiau tik dėžutės savininkas, turintis raktą, gali ją atidaryti ir perskaityti laiškus (iššifruoti privačiu raktu).

Pagrindiniai asimetrinio šifravimo algoritmai:

  • RSA (Rivest-Shamir-Adleman) – seniausias ir plačiausiai naudojamas. Remiasi didelių pirminių skaičių dauginimo sudėtingumu. Standartinis rakto ilgis: 2048 arba 4096 bitai.
  • ECDSA (Elliptic Curve Digital Signature Algorithm) – modernesnis algoritmas, pagrįstas elipsinių kreivių matematika. Siūlo tokį patį saugumo lygį kaip RSA, tačiau su trumpesniais raktais (256 bitų ECDSA ≈ 3072 bitų RSA).
  • EdDSA (Edwards-curve Digital Signature Algorithm) – naujausias, greitesnis nei ECDSA, naudojamas Ed25519 ir Ed448 kreivėmis.

Kodėl asimetrinis šifravimas naudojamas tik handshake metu?

Asimetrinis šifravimas yra matematiškai sudėtingas ir lėtas. RSA šifravimas yra apie 1000 kartų lėtesnis nei simetrinis AES šifravimas. Todėl jis naudojamas tik pradiniam raktų apsikeitimui, po kurio perjungiama į greitesnį simetrinį šifravimą.

2. Simetrinis šifravimas

Simetrinis šifravimas naudoja vieną bendrą raktą tiek šifravimui, tiek iššifravimui. Abu komunikacijos šalys (naršyklė ir serveris) turi tą patį raktą.

Kaip tai veikia:

  • Siuntėjas paima duomenis ir užšifruoja juos bendru raktu
  • Užšifruoti duomenys siunčiami per tinklą
  • Gavėjas iššifruoja duomenis tuo pačiu raktu
  • Bet kas, neturintis rakto, mato tik beprasmišką simbolių seką

Analogija: du žmonės turi identiškas spynos kopijas. Vienas užrakina dėžutę, kitas ją atrakina. Bet kas be rakto kopijos dėžutės atidaryti negali.

Pagrindiniai simetrinio šifravimo algoritmai TLS kontekste:

  • AES-128-GCM – 128 bitų raktas su Galois/Counter Mode. Greitas, saugus, plačiausiai naudojamas.
  • AES-256-GCM – 256 bitų raktas. Aukštesnis saugumo lygis, šiek tiek lėtesnis. Naudojamas, kai reikia papildomos atsargos.
  • ChaCha20-Poly1305 – alternatyva AES, sukurta Daniel J. Bernstein. Ypač greita programinėje realizacijoje (be specialių procesoriaus instrukcijų). Dažnai naudojama mobiliuosiuose įrenginiuose, kuriuose nėra AES-NI aparatinio spartinimo.

GCM (Galois/Counter Mode) yra AEAD (Authenticated Encryption with Associated Data) režimas, kuris vienu metu šifruoja duomenis ir patvirtina jų vientisumą. Tai reiškia, kad gavėjas gali patikrinti ne tik konfidencialumą (niekas neperskaitė), bet ir vientisumą (niekas nepakeitė duomenų kelyje).

3. Maišos funkcijos (Hash Functions)

Maišos funkcija paima bet kokio ilgio duomenis ir sugeneruoja fiksuoto ilgio „pirštų atspaudą” (hash). Šis atspaudas yra unikalus kiekvienam duomenų rinkiniui.

Maišos funkcijų savybės:

  • Vienkryptiškumas. Iš maišos reikšmės neįmanoma atkurti originalių duomenų. Galima tik vieną kryptimi: duomenys → maiša.
  • Determinizmas. Tie patys duomenys visada sukuria tą pačią maišos reikšmę.
  • Lavinos efektas. Net menkiausias pakeitimas pradininiuose duomenyse sukuria visiškai kitokią maišos reikšmę.
  • Atsparumas kolizijoms. Praktiškai neįmanoma rasti dviejų skirtingų duomenų rinkinių, kurie sukurtų tą pačią maišos reikšmę.

Pavyzdys (SHA-256):

"Labas" → 5f2b7c4a8d3e9f1b...  (64 simboliai)
"labas" → a1c8d2f5b7e3c9a4...  (visiškai kitokia reikšmė)
"Labas " → 9e4b2d8f1c7a3e5b... (tarpas pabaigoje – visiškai kitokia reikšmė)

Maišos funkcijų naudojimas TLS:

  • Duomenų vientisumo tikrinimas. Prie kiekvieno siunčiamo pranešimo pridedama maišos reikšmė (MAC, Message Authentication Code). Gavėjas perskaičiuoja maišą ir palygina. Jei nesutampa, duomenys buvo pakeisti kelyje.
  • Sertifikatų pasirašymas. Sertifikavimo institucija (CA) sukuria sertifikato turinio maišą ir ją pasirašo savo privačiu raktu. Naršyklė gali patikrinti parašą naudodama CA viešąjį raktą.
  • Pseudo-atsitiktinių skaičių generavimas. TLS naudoja maišos funkcijas raktų išvedimui iš bendros paslapties.

Šiuolaikiniai maišos algoritmai TLS kontekste:

  • SHA-256 – standartas TLS 1.2 ir TLS 1.3
  • SHA-384 – naudojamas su stipresniais šifravimo rinkiniais
  • SHA-1 – pasenęs, nebepalaikomas šiuolaikiniuose sertifikatuose nuo 2017 m.
  • MD5 – pasenęs, nesaugus, nenaudojamas TLS jau daugelį metų

TLS Handshake: žingsnis po žingsnio

TLS handshake yra procesas, per kurį naršyklė ir serveris susitaria dėl šifravimo parametrų ir sukuria bendrą simetrinį raktą. Tai vyksta kiekvieną kartą, kai atidarote svetainę su HTTPS (arba naudojama ankstesnė sesija, jei ji dar galioja).

Handshake skiriasi priklausomai nuo TLS versijos. Apžvelgsime abu: TLS 1.2 (vis dar plačiai naudojamas) ir TLS 1.3 (šiuolaikinis standartas).

TLS 1.2 Handshake

TLS 1.2 handshake reikalauja dviejų pilnų apsikeitimų (2-RTT, dvi kelionės pirmyn ir atgal) prieš pradedant šifruotą komunikaciją.

1. Client Hello

Naršyklė inicijuoja ryšį siųsdama „Client Hello” pranešimą serveriui. Šiame pranešime yra:

  • Palaikomos TLS versijos (pvz., TLS 1.2, TLS 1.1)
  • Šifravimo rinkinių sąrašas (cipher suites) – naršyklė nurodo, kokius šifravimo algoritmus ji palaiko, surikiuotus pagal pirmenybę
  • Client Random – 32 baitų atsitiktinė reikšmė, naudojama raktų generavimui
  • Session ID – jei naršyklė anksčiau jungėsi prie šio serverio, gali pasiūlyti atnaujinti seną sesiją
  • SNI (Server Name Indication) – domeno vardas, prie kurio naršyklė jungiasi (leidžia vienam serveriui aptarnauti kelis domenus su skirtingais sertifikatais)
  • Palaikomos suspaudimo metodai (TLS 1.2 palaiko, tačiau dauguma serveriams rekomenduojama išjungti dėl CRIME atakos)

Šifravimo rinkinio (cipher suite) pavyzdys:

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

Ši eilutė reiškia:

  • TLS – protokolas
  • ECDHE – raktų apsikeitimo algoritmas (Elliptic Curve Diffie-Hellman Ephemeral)
  • RSA – autentifikacijos algoritmas (sertifikato parašo tipas)
  • AES_256_GCM – simetrinio šifravimo algoritmas (256 bitų AES Galois/Counter Mode)
  • SHA384 – maišos funkcija duomenų vientisumo tikrinimui

2. Server Hello

Serveris atsako su „Server Hello” pranešimu, kuriame nurodo:

  • Pasirinktą TLS versiją (aukščiausia, kurią palaiko abu)
  • Pasirinktą šifravimo rinkinį (vieną iš naršyklės pasiūlytų)
  • Server Random – 32 baitų atsitiktinė reikšmė
  • Session ID – naujos sesijos identifikatorius arba esamos sesijos atnaujinimas

3. Certificate (sertifikato siuntimas)

Serveris siunčia savo SSL sertifikatą naršyklei. Sertifikate yra:

  • Serverio viešasis raktas
  • Domeno vardas, kuriam sertifikatas išduotas
  • Sertifikavimo institucijos (CA) informacija
  • Sertifikato galiojimo datos
  • Skaitmeninis parašas
  • Tarpinių sertifikatų grandinė (certificate chain)

4. Server Key Exchange

Jei naudojamas ECDHE raktų apsikeitimas (o šiuolaikiniuose konfigūracijose jis beveik visada naudojamas), serveris siunčia savo ECDHE viešąjį parametrą. Šis parametras pasirašomas serverio privačiu raktu, kad naršyklė galėtų patikrinti jo autentiškumą.

5. Server Hello Done

Serveris informuoja, kad baigė savo pranešimų seriją.

6. Naršyklės tikrinimas (vyksta naršyklės viduje)

Prieš tęsdama, naršyklė atlieka keletą patikrinimų:

  • Sertifikato grandinės tikrinimas. Ar sertifikatas pasirašytas patikimos CA? Ar tarpiniai sertifikatai teisingi? Ar šakninė CA yra naršyklės patikimų CA sąraše?
  • Galiojimo datos. Ar sertifikatas nėra pasibaigęs? Ar jis jau galioja?
  • Domeno tikrinimas. Ar sertifikate nurodytas domenas sutampa su svetainės adresu?
  • Atšaukimo tikrinimas. Ar sertifikatas nebuvo atšauktas? Tikrinama per CRL (Certificate Revocation List) arba OCSP (Online Certificate Status Protocol).

Jei bet kuris patikrinimas nepavyksta, naršyklė rodo saugumo įspėjimą ir neužmezga šifruoto ryšio.

7. Client Key Exchange

Naršyklė siunčia savo ECDHE viešąjį parametrą serveriui. Dabar abi pusės turi pakankamai informacijos apskaičiuoti bendrą paslaptį (shared secret).

8. Bendros paslapties apskaičiavimas (abi pusės)

Naršyklė ir serveris nepriklausomai apskaičiuoja tą pačią bendrą paslaptį naudodami Diffie-Hellman algoritmą:

  • Naršyklė naudoja savo privatų ECDHE parametrą ir serverio viešąjį ECDHE parametrą
  • Serveris naudoja savo privatų ECDHE parametrą ir naršyklės viešąjį ECDHE parametrą
  • Rezultatas yra identiškas abiem pusėms (tai Diffie-Hellman algoritmo magija)

Iš šios bendros paslapties, kartu su Client Random ir Server Random reikšmėmis, išvedami keli simetriniai raktai:

  • Client Write Key – naršyklės siunčiamų duomenų šifravimui
  • Server Write Key – serverio siunčiamų duomenų šifravimui
  • Client Write IV – inicializacijos vektorius naršyklės duomenims
  • Server Write IV – inicializacijos vektorius serverio duomenims

9. Change Cipher Spec + Finished (abi pusės)

Naršyklė siunčia „Change Cipher Spec” pranešimą, informuodama, kad nuo šiol visi pranešimai bus šifruoti. Po to siunčia „Finished” pranešimą, kuris yra pirmas šifruotas pranešimas. Jame yra visų ankstesnių handshake pranešimų maišos reikšmė, leidžianti patikrinti, kad niekas nepakeitė handshake duomenų kelyje.

Serveris atlieka tą patį: siunčia savo „Change Cipher Spec” ir „Finished”.

10. Šifruota komunikacija

Handshake baigtas. Nuo šiol visi duomenys tarp naršyklės ir serverio šifruojami simetriniu raktu. Kiekvienas pranešimas šifruojamas, prie jo pridedamas autentifikacijos kodas (MAC), ir siunčiamas per tinklą.

TLS 1.3 Handshake: greitesnis ir saugesnis

TLS 1.3, priimtas 2018 metais, supaprastino handshake procesą ir pašalino pasenusias bei nesaugias funkcijas.

Pagrindiniai TLS 1.3 skirtumai nuo TLS 1.2:

1. Vienas apsikeitimas (1-RTT)

TLS 1.3 handshake reikalauja tik vieno pilno apsikeitimo (1-RTT), o ne dviejų kaip TLS 1.2. Tai reiškia, kad ryšys užmezgamas dvigubai greičiau.

Kaip tai pasiekiama: naršyklė siunčia savo raktų apsikeitimo parametrus jau kartu su „Client Hello” pranešimu, nespėdama sužinoti, kokį algoritmą serveris pasirinks. Naršyklė tiesiog pasiūlo parametrus keliems populiariausiems algoritmams, ir serveris pasirenka tinkamą.

2. Nulio apsikeitimo atnaujinimas (0-RTT)

Jei naršyklė ir serveris jau buvo anksčiau sujungti, TLS 1.3 leidžia siųsti duomenis kartu su pirmuoju handshake pranešimu (0-RTT). Tai reiškia, kad svetainė pradeda krauti dar prieš handshake pabaigą.

Tačiau 0-RTT turi riziką: jei kažkas perima ir pakartoja (replay) 0-RTT duomenis, serveris gali juos apdoroti du kartus. Todėl 0-RTT tinka tik idempotentinėms užklausoms (pvz., GET), o ne operacijoms, keičiančioms būseną (pvz., mokėjimams).

3. Pašalintos nesaugios funkcijos

TLS 1.3 pašalino:

  • RSA raktų apsikeitimą (paliko tik ECDHE, kuris užtikrina Perfect Forward Secrecy)
  • CBC šifravimo režimą (paliko tik AEAD: AES-GCM ir ChaCha20-Poly1305)
  • SHA-1 maišos funkciją
  • Statinius DH raktų apsikeitimus
  • Suspaudimą (prevencija nuo CRIME atakos)
  • Renegotiation (handshake perkūrimą sesijos metu)

TLS 1.3 palaiko tik penkis šifravimo rinkinius:

TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_CCM_SHA256
TLS_AES_128_CCM_8_SHA256

Paprastumas yra pranašumas: mažiau pasirinkimų reiškia mažiau galimybių suklysti konfigūruojant.

4. Šifruotas handshake

TLS 1.3 šifruoja didesnę handshake dalį nei TLS 1.2. Serverio sertifikatas siunčiamas jau šifruotas, todėl tinklo stebėtojas negali matyti, kokį sertifikatą serveris pateikė (ir atitinkamai nežino, kokią svetainę lankytojas atidaro, jei naudojamas ECH).

Vizualinis TLS 1.2 vs. TLS 1.3 palyginimas

AspektasTLS 1.2TLS 1.3
Handshake trukmė2-RTT (du apsikeitimai)1-RTT (vienas apsikeitimas)
Sesijos atnaujinimasSession ID / Session Ticket0-RTT (su atsargos priemonėmis)
Raktų apsikeitimasRSA, DHE, ECDHETik ECDHE (Perfect Forward Secrecy)
Šifravimo algoritmaiDaugybė (įskaitant senus)Tik 5 AEAD algoritmai
Sertifikato šifravimasAtviru tekstuŠifruotas
SuspaudimasPalaikomas (bet nerekomenduojamas)Pašalintas

Perfect Forward Secrecy: apsauga nuo ateities grėsmių

Perfect Forward Secrecy (PFS) yra savybė, užtikrinanti, kad net jei serverio privatus raktas ateityje būtų kompromituotas, anksčiau užfiksuotas šifruotas srautas vis tiek liktų neįskaitomas.

Problema be PFS

Senajame RSA raktų apsikeitimo modelyje (TLS 1.2 su RSA) naršyklė šifruodavo „pre-master secret” serverio viešuoju raktu ir siųsdavo serveriui. Serveris iššifruodavo privačiu raktu.

Problema: jei kažkas metų metus fiksuodavo šifruotą srautą, o vėliau gaudavo serverio privatų raktą (per įsilaužimą, teismo nutartį ar serverio utilizavimą), jis galėdavo iššifruoti visą istorinį srautą. Vienas privatus raktas atidarydavo visus praeities duomenis.

Sprendimas: efemeriški raktai

PFS pasiekiamas naudojant efemeriškus (laikinus) raktus. ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) algoritme raidė „E” reiškia „Ephemeral” – trumpalaikis.

Kiekviena sesija sukuria naujus, unikalius Diffie-Hellman parametrus. Po sesijos pabaigos šie parametrai ištrinami. Net jei serverio ilgalaikis privatus raktas (naudojamas sertifikato autentifikacijai) būtų kompromituotas:

  • Atakuotojas galėtų apsimesti serveriu ateityje (kol sertifikatas neatšauktas)
  • Tačiau negalėtų iššifruoti ankstesnio srauto, nes sesijos raktai jau sunaikinti ir jie nebuvo išvesti iš ilgalaikio rakto

Kodėl TLS 1.3 garantuoja PFS

TLS 1.3 pašalino RSA raktų apsikeitimą ir palieka tik ECDHE. Tai reiškia, kad kiekviena TLS 1.3 sesija automatiškai turi Perfect Forward Secrecy. Tai nebe pasirinkimas, o privaloma savybė.

Sertifikatų grandinė: pasitikėjimo sistema

SSL sertifikatas pats savaime yra tik skaitmeninis dokumentas. Kad naršyklė galėtų patikėti šiuo dokumentu, ji turi patikrinti visą pasitikėjimo grandinę iki šakninio sertifikato.

Sertifikatų grandinės struktūra

1. Šakninis sertifikatas (Root CA Certificate)

Šakninis sertifikatas yra aukščiausias pasitikėjimo lygmuo. Jį išduoda šakninė sertifikavimo institucija (Root CA), ir jis yra iš anksto įdiegtas jūsų operacinėje sistemoje arba naršyklėje.

Windows, macOS, Linux, Android ir iOS turi savo patikimų šakninių CA sąrašus. Chrome naudoja operacinės sistemos sąrašą (išskyrus Linux, kur turi savo), Firefox turi savo nepriklausomą sąrašą.

Šakninis sertifikatas yra self-signed (pasirašytas pačios CA). Jo saugumas remiasi ne kriptografija, o pasitikėjimu: operacinės sistemos kūrėjai (Microsoft, Apple, Google, Mozilla) tikrina ir audituoja šaknines CA prieš įtraukdami jas į sąrašą.

2. Tarpinis sertifikatas (Intermediate CA Certificate)

Šakninės CA retai pasirašo galutinius sertifikatus tiesiogiai. Vietoj to, jos sukuria tarpinius sertifikatus, kurie savo ruožtu pasirašo galutinius sertifikatus.

Kodėl? Saugumo priežastys:

  • Šakninio sertifikato privatus raktas yra ypač vertingas. Jis saugomas izoliuotose, neprisijungusiose prie interneto sistemose (offline, hardware security modules).
  • Jei tarpinis sertifikatas būtų kompromituotas, galima jį atšaukti ir pakeisti nauju, neliečiant šakninio.
  • Jei šakninis raktas būtų kompromituotas, reikėtų atnaujinti jį visose operacinėse sistemose ir naršyklėse visame pasaulyje. Tai katastrofinis scenarijus.

3. Galutinis sertifikatas (End-entity / Leaf Certificate)

Tai sertifikatas, kuris priskiriamas konkrečiai svetainei. Jį pasirašo tarpinė CA. Šiame sertifikate yra serverio viešasis raktas ir domeno informacija.

Grandinės tikrinimo procesas

Kai naršyklė gauna serverio sertifikatą, ji atlieka šį tikrinimo procesą:

  1. Patikrina galutinį sertifikatą: ar jis pasirašytas žinomos tarpinės CA? Jei taip, tęsia.
  2. Patikrina tarpinį sertifikatą: ar jis pasirašytas žinomos šakninės CA? Jei taip, tęsia.
  3. Patikrina šakninį sertifikatą: ar jis yra naršyklės/OS patikimų CA sąraše? Jei taip, visa grandinė patikima.

Jei bet kurioje vietoje grandinė nutrūksta (pvz., trūksta tarpinio sertifikato arba šakninė CA nėra patikima), naršyklė rodo klaidos pranešimą.

Dažna konfigūracijos klaida

Viena dažniausių SSL konfigūracijos klaidų yra tarpinių sertifikatų nepridėjimas prie serverio konfigūracijos. Serveris siunčia tik galutinį sertifikatą, ir naršyklė negali patikrinti grandinės.

Kai kurios naršyklės (ypač Chrome desktop) bando pačios parsisiųsti trūkstamą tarpinį sertifikatą, todėl svetainė veikia. Tačiau kitos naršyklės ir mobilieji įrenginiai to nedaro ir rodo klaidą. Todėl visada reikia konfigūruoti pilną sertifikatų grandinę.

Patikrinimas: SSL Labs testas (ssllabs.com/ssltest) aiškiai parodo, ar sertifikatų grandinė pilna.

Raktų apsikeitimas: Diffie-Hellman protokolas

Diffie-Hellman raktų apsikeitimas yra geniali matematinė procedūra, leidžianti dviem šalims sukurti bendrą slaptą raktą per viešą (nesaugų) kanalą, neperduodant pačio rakto.

Supaprastintas Diffie-Hellman paaiškinimas

Naudosime spalvų analogiją, kuri intuityviai parodo principą:

  1. Alisa ir Bobas susitaria dėl bendros pradžios spalvos – tarkim, geltonos. Tai viešas parametras, kurį gali matyti visi.
  2. Kiekvienas pasirenka savo slaptą spalvą:
  • Alisa pasirenka raudoną (slapta)
  • Bobas pasirenka mėlyną (slapta)
  1. Kiekvienas sumaišo savo slaptą spalvą su bendra geltona:
  • Alisa siunčia Bobui oranžinę (geltona + raudona)
  • Bobas siunčia Alisai žalią (geltona + mėlyna)
  1. Kiekvienas prideda savo slaptą spalvą prie gautos mišinys:
  • Alisa ima žalią (iš Bobo) ir prideda raudoną → gauna rusvą
  • Bobas ima oranžinę (iš Alisos) ir prideda mėlyną → gauna tą pačią rusvą
  1. Rezultatas: abu turi tą pačią „rusvą” spalvą (bendrą raktą), nors niekada ja tiesiogiai nesiuntė per tinklą.

Analogijos esmė: spalvas lengva sumaišyti, tačiau labai sunku atskirti atgal. Matematikoje tai atitinka diskretinio logaritmo problemą arba elipsinių kreivių skaliarinės daugymo problemą.

ECDHE praktikoje

Šiuolaikinis TLS naudoja ECDHE (Elliptic Curve Diffie-Hellman Ephemeral), kuris:

  • Naudoja elipsinių kreivių matematiką (efektyvesnis nei klasikinis DH)
  • Sukuria naujus parametrus kiekvienai sesijai (ephemeral)
  • Pasiekia aukštą saugumo lygį su trumpesniais raktais (256 bitų EC ≈ 3072 bitų RSA)

Populiariausios kreivės: X25519 (TLS 1.3 standartas, sukurta Daniel J. Bernstein), P-256 (NIST standartas), P-384.

Šifravimo procesas po handshake

Po sėkmingo handshake prasideda faktinis duomenų šifravimas. Kiekvienas pranešimas apdorojamas keliais žingsniais:

Duomenų siuntimas (šifravimas)

  1. Fragmentavimas. Dideli duomenų blokai padalijami į mažesnius fragmentus (iki 16384 baitų TLS 1.2, iki 16384+256 baitų TLS 1.3).
  2. Šifravimas. Kiekvienas fragmentas šifruojamas simetriniu raktu (AES-GCM arba ChaCha20-Poly1305). Šifravimo procesas naudoja:
  • Sesijos raktą
  • Sekos numerį (sequence number) – apsauga nuo pranešimų pertvarkymo ar pakartojimo
  • Papildomus autentifikacijos duomenis (AAD) – neužšifruota, tačiau autentifikuota pranešimo antraštė
  1. Autentifikacijos žymos (tag) pridėjimas. AEAD algoritmas kartu su šifravimu sukuria autentifikacijos žymą, leidžiančią gavėjui patikrinti, ar duomenys nebuvo pakeisti.
  2. TLS įrašo formavimas. Užšifruotas fragmentas įpakuojamas į TLS Record Protocol formatą su antrašte, nurodančia turinio tipą, protokolo versiją ir duomenų ilgį.
  3. Siuntimas per TCP. TLS įrašas perduodamas transporto sluoksniui (TCP) ir siunčiamas per tinklą.

Duomenų gavimas (iššifravimas)

  1. TLS įrašo gavimas. Gavėjas gauna TLS įrašą ir nuskaito antraštę.
  2. Iššifravimas. Naudojant atitinkamą sesijos raktą ir sekos numerį, iššifruoja duomenis.
  3. Autentifikacijos tikrinimas. Patikrina autentifikacijos žymą. Jei žyma nesutampa, pranešimas atmetamas ir ryšys nutraukiamas.
  4. Defragmentavimas. Fragmentai sujungiami atgal į originalius duomenis.
  5. Perdavimas aplikacijai. Iššifruoti duomenys perduodami web serveriui ar naršyklei.

OCSP ir sertifikatų atšaukimo tikrinimas

Kai sertifikato privatus raktas kompromituojamas arba sertifikatas išduotas klaidingai, jį reikia atšaukti. Naršyklė turi būdą patikrinti, ar sertifikatas vis dar galioja.

CRL (Certificate Revocation List)

Seniausias metodas: sertifikavimo institucija skelbia sąrašą atšauktų sertifikatų. Naršyklė parsisiunčia šį sąrašą ir patikrina, ar serverio sertifikato numeris yra sąraše.

Trūkumai:

  • Sąrašai gali būti dideli (šimtai MB)
  • Parsisiuntimas lėtina svetainės atidarymą
  • Sąrašai atnaujinami periodiškai (ne realiu laiku)

OCSP (Online Certificate Status Protocol)

Modernesnis metodas: naršyklė siunčia užklausą OCSP serveriui su konkretaus sertifikato numeriu ir gauna atsakymą „galioja” arba „atšauktas”.

Privalumai palyginus su CRL:

  • Mažesnė užklausa (tik vienas sertifikatas, ne visas sąrašas)
  • Greitesnis atsakymas

Trūkumai:

  • Privatumo problema: OCSP serveris žino, kokias svetaines lankytojas atidaro
  • Papildoma užklausa lėtina svetainės atidarymą
  • Jei OCSP serveris neatsako, naršyklė turi nuspręsti: blokuoti ar leisti? (Dauguma leidžia – „soft-fail” – kas sumažina saugumo vertę)

OCSP Stapling

Sprendimas, pašalinantis OCSP trūkumus: serveris pats periodiškai (kas kelias valandas) gauna OCSP atsakymą iš sertifikavimo institucijos ir „prikabina” (staple) jį prie TLS handshake.

Kaip tai veikia:

  1. Serveris siunčia OCSP užklausą sertifikavimo institucijai
  2. CA atsako su pasirašytu OCSP atsakymu (galioja kelias valandas ar dienas)
  3. Kai naršyklė jungiasi, serveris siunčia sertifikatą kartu su OCSP atsakymu
  4. Naršyklei nereikia pačiai kreiptis į OCSP serverį

Privalumai:

  • Greitesnis handshake (nereikia papildomos užklausos)
  • Privatumas (CA nežino, kas lanko jūsų svetainę)
  • Patikimumas (net jei OCSP serveris laikinai neveikia, serveris turi cached atsakymą)

OCSP Stapling konfigūravimas Nginx:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/chain.pem;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;

OCSP Must-Staple

Dar pažangesnis variantas: sertifikate nurodoma, kad OCSP Stapling yra privalomas. Jei serveris nepateikia OCSP atsakymo, naršyklė atsisakys užmegzti ryšį. Tai pašalina „soft-fail” problemą.

Tačiau OCSP Must-Staple reikalauja kruopščios serverio konfigūracijos, nes jei OCSP atsakymas pasibaigs ir serveris nepavyks gauti naujo, svetainė taps nepasiekiama.

Istoriniai pažeidžiamumai: kas nuėjo ne taip

SSL/TLS istorija yra ir pažeidžiamumų istorija. Kiekvienas rimtas pažeidžiamumas paskatino protokolo tobulinimą ir galiausiai privedė prie TLS 1.3, kuris yra reikšmingai saugesnis.

Heartbleed (2014)

Kas nutiko: klaida OpenSSL bibliotekos „Heartbeat” funkcijoje leido atakuotojui perskaityti iki 64 KB serverio atminties su kiekviena užklausa. Atmintyje galėjo būti privačių raktų, naudotojų slaptažodžių, sesijos duomenų.

Poveikis: apie 17% visų interneto SSL serverių buvo pažeidžiami. Tai buvo vienas rimčiausių interneto saugumo incidentų istorijoje.

Pamoka: programinės įrangos klaidų prevencija yra lygiai taip pat svarbi kaip kriptografinių algoritmų stiprumas. Heartbleed nebuvo kriptografijos problema, o programavimo klaida (buffer over-read).

POODLE (2014)

Kas nutiko: ataka prieš SSL 3.0 protokolą, leidžianti iššifruoti šifruotus duomenis, kai naudojamas CBC režimas.

Poveikis: privertė galutinai atsisakyti SSL 3.0 protokolo.

Pamoka: seni protokolai turi būti išjungiami, net jei jie „vis dar veikia”.

BEAST (2011)

Kas nutiko: ataka prieš TLS 1.0 CBC šifravimą, leidžianti iššifruoti HTTPS slapukus (cookies).

Poveikis: paskatino perėjimą prie TLS 1.1 ir 1.2.

CRIME ir BREACH (2012–2013)

Kas nutiko: atakos, išnaudojančios TLS suspaudimą (CRIME) ir HTTP suspaudimą (BREACH), leidžiančios atskleisti šifruotą informaciją (pvz., CSRF tokenus).

Poveikis: TLS suspaudimas buvo išjungtas (ir pašalintas TLS 1.3). HTTP suspaudimas vis dar naudojamas, tačiau su atsargumo priemonėmis.

DROWN (2016)

Kas nutiko: ataka, leidžianti iššifruoti TLS ryšį, jei serveris palaiko ir seną SSLv2 protokolą (net jei jis naudojamas tik kitame serveryje su tuo pačiu privačiu raktu).

Poveikis: parodė, kad seni protokolai kelia grėsmę net netiesiogiai.

Kodėl tai svarbu šiandien?

Kiekvienas šių pažeidžiamumų buvo ištaisytas, o TLS 1.3 projektuotas taip, kad daugelis jų kategorijų būtų nebeįmanomos. Tačiau pamoka lieka: saugumas yra procesas, ne produktas. Reguliarūs atnaujinimai, senų protokolų išjungimas ir nuolatinis stebėjimas yra būtini.

TLS ir našumas: ar šifravimas lėtina svetainę?

Viena seniausių mitų apie SSL/TLS yra tai, kad šifravimas „lėtina svetainę”. Tai buvo tiesa prieš dešimtmetį, tačiau šiandien situacija pasikeitė radikaliai.

Kodėl TLS šiandien yra greitas

1. Aparatinis AES spartinimas (AES-NI)

Šiuolaikiniai procesoriai (Intel, AMD) turi specialias instrukcijas AES šifravimui. AES-NI leidžia šifruoti duomenis beveik be papildomos procesorinės apkrovos. Procesorius gali šifruoti gigabaitus per sekundę.

2. TLS 1.3 greitesnis handshake

TLS 1.3 sumažino handshake nuo 2-RTT iki 1-RTT, o sesijų atnaujinimui – iki 0-RTT. Tai reiškia, kad šifruotas ryšys užmezgamas beveik taip pat greitai kaip nešifruotas.

3. HTTP/2 ir HTTP/3 reikalauja HTTPS

Paradoksas: HTTPS svetainė gali būti greitesnė nei HTTP svetainė, nes HTTPS leidžia naudoti HTTP/2 ir HTTP/3 protokolus, kurie turi multipleksavimą, antraščių suspaudimą ir kitas greičio optimizacijas.

4. TLS Session Resumption

Kai lankytojas grįžta į svetainę, nereikia atlikti pilno handshake. TLS Session Tickets arba PSK (Pre-Shared Key) mechanizmai leidžia atnaujinti sesiją su minimaliais skaičiavimais.

Kur TLS vis dar prideda šiek tiek latency

  • Pirmas apsilankymas. Pirmas handshake prideda 1 RTT (TLS 1.3) papildomo laiko. Jei serveris yra toli nuo lankytojo, tai gali būti juntama (pvz., 100-200 ms per Atlantą).
  • Sertifikatų grandinė. Didelis sertifikatas (ypač su ilga grandine) prideda duomenų prie handshake.
  • OCSP tikrinimas. Jei nenaudojamas OCSP Stapling, naršyklė gali kreiptis į OCSP serverį, kas prideda papildomą užklausą.

Optimizavimo patarimai

  • Naudokite TLS 1.3 (greičiausias handshake)
  • Įjunkite OCSP Stapling (pašalina papildomą užklausą)
  • Naudokite ECDSA sertifikatus vietoj RSA (mažesni raktai, greitesnis handshake)
  • Įjunkite TLS Session Resumption (greičiau grįžtantiems lankytojams)
  • Naudokite HTTP/2 arba HTTP/3 (reikalauja HTTPS, tačiau greitina viską kita)
  • Rinkitės X25519 kreivę raktų apsikeitimui (greičiausia ECDHE kreivė)

TLS 1.3 ir ateities technologijos

ECH (Encrypted Client Hello)

TLS handshake pradžioje naršyklė siunčia SNI (Server Name Indication) lauką atviru tekstu. Tai reiškia, kad tinklo stebėtojas (ISP, darbdavys, valdžia) gali matyti, kokias svetaines lankytojas atidaro, nors pačio turinio perskaityti negali.

ECH (Encrypted Client Hello) užšifruoja SNI lauką, padarydamas jį nematomu tinklo stebėtojui. Šiuo metu ECH palaikomas Cloudflare serveriuose ir Firefox naršyklėje. Platesnis palaikymas plečiasi.

Post-kvantinė kriptografija

Kvantiniai kompiuteriai teoriškai galės pralaužti šiandieninius asimetrinio šifravimo algoritmus (RSA, ECDSA, ECDHE). Nors praktiškai galingas kvantinis kompiuteris dar neegzistuoja, pavojus yra realus dėl „harvest now, decrypt later” strategijos: kažkas gali fiksuoti šifruotą srautą šiandien ir iššifruoti ateityje, kai turės kvantinį kompiuterį.

NIST post-kvantiniai standartai (2024):

  • ML-KEM (Kyber) – raktų apsikeitimo mechanizmas, atsparus kvantiniams kompiuteriams
  • ML-DSA (Dilithium) – skaitmeninio parašo algoritmas

Chrome ir Cloudflare jau eksperimentuoja su hibridiniais raktų apsikeitimais, kurie derinia X25519 (klasikinį) su ML-KEM (post-kvantinį). Jei vienas iš jų būtų pralaužtas, kitas vis tiek apsaugotų duomenis.

QUIC ir HTTP/3

QUIC yra Google sukurtas transporto protokolas, kuris integruoja TLS 1.3 šifravimą tiesiai į transporto sluoksnį. HTTP/3 naudoja QUIC vietoj TCP.

QUIC privalumai:

  • TLS handshake ir transporto ryšio užmezgimas vyksta kartu (greičiau nei atskiri TCP + TLS žingsniai)
  • Atsparumas tinklo sutrikimams (jei prarandamas paketas, neblokuoja kitų duomenų srautų)
  • Geresnė patirtis mobiliuosiuose tinkluose (ryšio perkėlimas tarp Wi-Fi ir mobilaus tinklo be sesijos nutrūkimo)

Praktiniai patarimai: kaip užtikrinti stiprų SSL/TLS šifravimą

Serverio konfigūracija (Nginx pavyzdys)

server {
    listen 443 ssl http2;
    server_name jusuverslas.lt;

    # Sertifikatai
    ssl_certificate /etc/letsencrypt/live/jusuverslas.lt/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jusuverslas.lt/privkey.pem;

    # Protokolai (tik TLS 1.2 ir 1.3)
    ssl_protocols TLSv1.2 TLSv1.3;

    # Šifravimo rinkiniai (TLS 1.2)
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;

    # ECDH kreivė
    ssl_ecdh_curve X25519:prime256v1:secp384r1;

    # Sesijos spartinimas
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/jusuverslas.lt/chain.pem;
    resolver 1.1.1.1 8.8.8.8 valid=300s;

    # Saugumo antraštės
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
}

Ką tikrinti reguliariai

  • SSL Labs testas (ssllabs.com/ssltest) – siekite A+ įvertinimo
  • Sertifikato galiojimo data – nustatykite stebėjimą (Uptime Robot, StatusCake)
  • Protokolų palaikymas – TLS 1.0 ir 1.1 turi būti išjungti
  • Šifravimo rinkiniai – tik AEAD algoritmai (AES-GCM, ChaCha20-Poly1305)
  • HSTS antraštė – turi būti aktyvuota su ilgu max-age
  • Sertifikatų grandinė – pilna grandinė turi būti konfigūruota
  • OCSP Stapling – patikrinkite, ar veikia

Apibendrinimas

SSL/TLS šifravimas yra viena svarbiausių interneto saugumo technologijų. Jis apsaugo milijardus transakcijų, pranešimų ir prisijungimų kasdien, ir jo veikimas remiasi elegantišku kriptografinių principų deriniu.

Pagrindiniai principai, kuriuos verta atsiminti:

  • TLS handshake yra procesas, per kurį naršyklė ir serveris susitaria dėl šifravimo parametrų. TLS 1.3 tai atlieka per vieną apsikeitimą (1-RTT), padarydamas šifravimą beveik nematomu vartotojui.
  • Asimetrinis šifravimas (ECDHE) naudojamas tik raktų apsikeitimui, o simetrinis šifravimas (AES-GCM, ChaCha20) naudojamas duomenų perdavimui. Šis derinys sujungia asimetrinio saugumą su simetrinio greičiu.
  • Perfect Forward Secrecy užtikrina, kad kiekviena sesija turi unikalius raktus. Net jei serverio privatus raktas ateityje būtų atskleistas, praeities sesijos liktų saugios.
  • Sertifikatų grandinė kuria pasitikėjimo hierarchiją nuo šakninio CA iki jūsų svetainės sertifikato. Teisingai sukonfigūruota grandinė yra būtina.
  • TLS 1.3 yra standartas. Jis pašalino nesaugias funkcijas, supaprastino konfigūraciją ir pagreitino handshake. Jei jūsų serveris vis dar naudoja tik TLS 1.2, verta pridėti TLS 1.3 palaikymą.
  • Šifravimas šiandien yra nemokamas ir greitas. Let’s Encrypt suteikia nemokamus sertifikatus, o šiuolaikiniai procesoriai atlieka AES šifravimą be pastebimo greičio praradimo. Nėra jokios priežasties nešifruoti.
  • Post-kvantinė kriptografija artėja. Hibridiniai raktų apsikeitimai (X25519 + ML-KEM) jau testuojami, ir per ateinančius metus taps standartu.

Spynelės piktograma naršyklėje atrodo paprastai. Tačiau po ja slypi dešimtmečiai kriptografijos tyrimų, matematikos ir inžinerijos, kurie veikia kiekvieną sekundę, kai naršote internetą. Tai viena tų technologijų, kuri geriausiai veikia tada, kai jos visiškai nepastebite.

Į viršų