Varnost

HTTPS

Zakaj se nekateri naslovi pričnejo s http, drugi pa s https? Kakšna je razlika in čemu izbrati HTTPS?

Uvod

HTTPS (HyperText Transfer Protocol Secure) je dopolnitev protokola HTTP, ki omogoča zaupno izmenjavo podatkov in ki, z razliko od HTTP, na strežniški strani privzeto uporablja TCP vrata 443. Za šifriranje se uporabljata SSL (Secure Sockets Layer) in TLS (Transport Layer Security) protokola, ki omogočata različne šifrirne mehanizme in različne dolžine ključa.

Namen HTTPS

Uporaba HTTPS je potrebna povsod, kjer prenašamo zaupne ali tajne podatke, oziroma, če si ne želimo, da bi si podatke med prenosom (ali po zajemu prenosa) ogledovale ali jih obdelovale tretje osebe. Pri tem podatke ne predstavlja zgolj vsebina, temveč tudi HTTP zaglavje in URI (enolični naslovi).

S prehodom na HTTPS je potrebno poskrbeti, da se vsi elementi strežejo preko HTTPS. Na primeru spletne strani to pomeni, da se morajo vsi gradniki strani, te predstavljajo slike, stili ipd., naložiti preko HTTPS. Če spletna stran omogoča uporabniku vgraditev svojih elementov oziroma gradnikov iz tretjih strani, lahko pride do t.i. mešane vsebine.

Protokol TLS je bil zasnovan za zagotavljanje treh osnovnih temeljev zaupnosti: tajnosti (vsebina je skrita), pristnosti (avtorstva vsebine ni možno zanikati) in celovitosti (v vsebini ni prišlo do sprememb).

Elementi zaupnosti

Strežniško digitalno potrdilo

Za preverjanje pristnosti se uporablja digitalno potrdilo, najpogosteje v obliki X.509, ki vsebuje javni ključ ter podpis. Digitalno potrdilo preveri odjemalec, in sicer se mora njegovo polje CN (CommonName) ujemati z domeno, na katero se želi odjemalec povezati. Poleg tega odjemalec preveri tudi, če je bilo digitalno potrdilo podpisano s strani enega od t.i. zaupanja vrednih overiteljev (trusted certificate authority), da se vzpostavi t.i. veriga zaupanja (chain of trust).

Dandanes je slednje postalo dostopno vsakomur. Brezplačno overjeno potrdilo s strani Let's Encrypt velja tri mesece.

Veriga zaupanja je v brkskalniku v večini primerov izkazana z zeleno ključavnico, vendar mora biti obiskovalec kljub temu previden, saj mnoge zlonamerne spletne strani uporabijo ravno takšno ključavnico za ikono spletne strani (favicon). Na spodnji sliki se ključavnica nahaja levo od URL (sivega napisa https://), medtem ko je ikona spletne strani prikazana višje, na zavihku.

http

Ustvarjanje zasebnega ključa

Pripadajoči zasebni ključ naj bo dolžine vsaj 2048 bitov, priporočeno 4096 bitov.

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096
chmod 400 private_key.pem

Protokoli

Ker je število odjemalcev, ki še ne podpirajo protokola TLS zanemarljivo malo, hkrati pa so SSL protokoli ranljivi, se priporoča onemogočiti vse SSL različice, ter omogočiti vsaj TLS različice 1.2.

Šifrirni svežnji

Takoj po vzpostavitvi povezave na podrejenem (TCP prenosnem) nivoju, odjemalec pričene z rokovanjem. Pri tem strežniku sporoči svoj nabor podprtih šifrirnih svežnjev, nato pa strežnik izbere tistega, ki ga tudi sam podpira. Z izbiro šifrirnega svežnja (cipher suite) oziroma naborom omogočenih svežnjev določimo naslednje postopke – algoritme – in funkcijo.

V primeru TLS je psevdonaključna funkcija TLS-PRF in je odvisna od izbranega postopka preverjanja pristnosti podatkov.

Če spletni strežnik uporablja knjižnico openssl (libssl), je mogoče izpisati seznam podprtih šifrirnih svežnjev.

$ openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384   TLSv1.2  Kx=ECDH Au=RSA   Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2  Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
...

Vsaka vrstica je sestavljena iz imena svežnja, različice protokola, postopka za izmenjave ključa Kx, postopka za preverjanje pristnosti Au, postopka šifriranja podatkov Enc z dolžino ključa v oklepaju ter postopka preverjanja pristnosti podatkov Mac.

Postopek izmenjave ključa

Postopek izmenjave ključa, na primer ECDHE-RSA določa, kako si bosta strežnik in odjemalec izmenjevala šifrirne ključe in kako se preverja pristnost. Na voljo so naslednji postopki, pri čemer se zadnja dva odsvetuje.

Priporoča se poraba kratkotrajnih (ephemeral) postopkov (označeni s črko E na koncu prve kratice pred vezajem), saj omogočajo poudarjeno tajnost (PFS – perfect forward secrecy), kar pomeni, da odkritje enega kratkotrajnega ključa odkrije samo sejo, kjer se je ta ključ uporabljal.

Postopek šifriranja podatkov

Postopek šifriranja podatkov, na primer AES256-GCM, se uporablja za šifriranje HTTP prometa. Z izbiro postopka se določi tudi dolžina ključa in dolžino začetnega vektorja (initialization vector).

Postopek preverjanja pristnosti spročil

Postopek preverjanja pristnosti spročil, na primer SHA256, določa zgostitveno funkcijo, s katero se izračuna zgostitveno vrednost v bloke razdeljenih podatkov in služi kot podpis. Če prejemnik za prejet blok podatkov izračuna drugačno zgostitveno vrednost, bo blok podatkov zavrnil. S tem je zagotovljena celovitost.

HTTP zaglavje

Poleg vsebine HTTP vsebuje še zaglavje, ki vsebuje podatke o vsebini in o strežniku. Z nekaterimi nastavitvami v zaglavju lahko brskalniku povemo, kaj sme in česa ne sme narediti z našim strežnikom.

Preverjanje zaglavja ponuja stran securityheaders.io.

HTTP Strict Transport Security (HSTS)

Strict-Transport-Security       max-age=31536000
Strict-Transport-Security       max-age=31536000; includeSubDomains
Strict-Transport-Security	max-age=31536000; includeSubDomains; preload

Z nastavitvijo HSTS v zaglavju da strežnik odjemalcu vedeti, da ta uporablja HTTPS in naj se v dvomih nikakor ne povezujeje na HTTP. Brskalnik si bo to zapomnil za vrednost max-age izraženo v sekundah, v zgornjem primeru si bo zapomnil za 365 dni (oziroma za eno leto).

Nastavitev HSTS (vsaj brez includeSubDomains in preload) se priporoča za vse spletne strani, ki podpirajo HTTPS.