Ce este HTTPS?

Am scris în ultima vreme despre ”scăpările” renumitului protocol https. Acum vin cu un articol explicativ care să vă descrețească frunțile.

Intro (aproape scurt)

HTTPS este protocol care adaugă un nivel de confidențialitate comunicațiior între server și client. De aici și denumirea ”HTTP” – protocolul de facto utilizat de serverele web, și ”S” de la Secure – acel nivel de securitate.

Pentru a înțelege mai bine Facebook folosește HTTP pentru a ”vorbi” cu navigatorul vostru. Dacă dați click pe acest link http://www.facebook.com/ veți fi dus la Facebook.com. HTTP este protocolul, www este subdomeniul (implicit) și facebook.com este domeniul.
Dacă dați click pe acest link ftp://facebook.com/ navigatorul nu va reuși să se conecteze, pentru că serverul facebook.com nu ascultă protocolul ftp. Însă dacă dați click pe https://www.facebook.com vă veți conecta la Facebook.com prin protocolul https.

Și unde-i serverul în toată chestia asta? Dar clientul? (tot pe scurt…)

Păi serverul este un calculator (un fel de) pe care este găzduit domeniul facebook.com . Altfel spus acel calculator, spune la alte calculatoare din internet că el are domeniul facebook.com. Clientul ești tu, adică calculatorul tău, care la cererea navigatorului întreabă cel mai apropiat (teoretic) calculator de tip server din rețea unde se găsește facebook.com. Celelalte calculatoare vor returna o adresă (adresa calculatorului respectiv), iar navigatorul tău, informat în prealabil va trimite toate mesajele către facebook.com la acea adresă.
Acum http://www.facebook.com/home.php este un mesaj către serverul ce găzduiește facebook.com, și cere resursa /home.php prin protocolul http.
Ce returnează serverul e treaba lui, dar dacă navigatorul a înțeles va afișa pagina respectivă. Sau un mesaj de eroare dacă nu a înțeles.

Ce face HTTPS diferit față HTTP?

  • Criptează toate mesajele trimise la server;
  • Rulează implicit pe portul 443;
  • Este (puțin) mai lent;
  • Este validată printr-un certificat;

Ce este un mesaj criptat?
Mesajul meu: mesaj denecriptat
Mesajul meu criptat: Dg0WCA9DDAAHAAAaDBkRAhw= (dau o bere celui care recunoaște algoritmul, știind că cheia este ”cheie” ;) )

Așa cum puteți vedea dacă cineva ar putea vedea sau intercepta mesajele dintre client și server, îi va fi mult mai greu să le înțeleagă atunci când sunt criptate. Sau nu le va înțelege deloc. Și ăsta e practic nivelul de securitate adus de HTTPS, care îți permite să comunici cu un server prin mesaje criptate.

Să înțelegem HTTPS
HTTPS , (TLS practic, protocolul pe care este construit https) folosește două chei pentru a cripta și mai apoi decripta mesajele.
• O cheie publică, pe care o poate vedea oricine se conectează la server prin https. Dar poate fi folosită doar pentru a cripta mesaje.
• O cheie privată, aflată pe server, la care au acces doar administratorii serverului și singura care poate fi folosită pentru a decripta mesajele primite de server.

Așadar criptarea mesajelor are loc pe calculatorul tău, și apoi sunt trimise la server, care le decriptează și dă un răspuns adecvat.
În consecință:
• un administrator al serverului va putea întodeauna să-ți vadă mesajele pentru că el știe cheia pentru a decripta mesajele, dar mai ales pentru că pe server mesajele decriptate deja sunt ținute în jurnale specifice;
• un hacker dacă a reușit să copieze cheia privată de pe server, îți va putea vedea mesajele;
• un program de tip keylogger sau spyware, instalat în calculatorul sau navigatorul tău îți va putea vedea mesajele pentru că are acces la ele înainte de a fi criptate.

HTTPS este viabil doar pentru a transmite mesaje criptate pe un canal nesigur, cum este internetul. Așadar dacă un sait are https, sau l-ai accesat prin https nu înseamnă că este automat un sait sigur și de încredere, că nu propagă viruși, sau că nu are de gând să-ți fure datele personale și numărul de card. Un sait https poate fi la fel de ușor ținta și sursa unor fraude prin sisteme informatice cum este unul care folosește http. Securitatea datelor transmise către un server este doar atât de bună pe cât persoanele implicate în administrarea serverului care găzduiește datele o iau în serios.

Să înțelegem certificatele
Certificatele sunt fișiere pe baza cărora un program specializat generează perechi de chei publice și private, emise și oferite (majoritatea contra-cost) de companii private. Aceste companii administrează și emit propriile certificate rădăcină (root certificate) pe baza cărora pot fi validate toate certificatele pe care le oferă. Funcționând ca o terță parte pentru validarea unei conexiuni https.
Certificatele sunt valabile și se emit pe anumite perioade de timp (între 2 și 5 ani). Așa că un certificat expirat este considerat automat invalid.

Cum știu dacă un certificat este invalid?
Păi asta e destul de evident. Navigatorul meu Chrome afișează ceva de genul:

Chiar dacă mesajul arată ”amenințător” nu este chiar așa. Dacă observați acolo jos mai scrie: ”Vă recomandăm să nu continuaţi, mai ales dacă nu aţi mai văzut niciodată acest avertisment pentru acest site.” . Deci dacă am mai fost pe acest sait și n-am mai văzut așa ceva ar fi bine să nu intru momentan pe sait. Însă dacă știu despre ce este vorba pot să continui liniștit.

De fapt mesajul apare pentru că navigatorul meu nu a putut valida certificatul prezentat de sait cu vreunul din certificatele rădăcină pe care le are instalate. Și cum probabil v-ați gândit, navigatorul meu are doar câteva certificate rădăcină pre-instalate. Evident cel al companiei care a emis certificatul de pe saitul respectiv nu este printre acestea.
Pentru a vedea certificatele rădăcină preinstalate în Chrome, mergeți la Setări și căutați ”ssl”. Va apare un buton ”Gestionați certificatele” pe care dacă dați click va apare o fereastră cu mai multe tab-uri. În tab-ul ”Trusted Root Certification Authorities” veți vedea această listă.

Dacă este invalid certificatul, https-ul e invalid?
Nicidecum. De fapt starea de validitate sau invaliditate a certificatului nu afectează cu nimic conexiunea https. Mesajele transmise sunt criptate în continuare și serverul le va decripta în mod corect. De fapt în unele cazuri chiar folosirea unui certificat invalid este recomandat pentru că https este un canal sigur.
De exemplu dacă am un server de dezvoltare la care se conectează 5 sau 10 persoane și vreau să țin comunicațiile cu serverul securizate pentru a preveni spionajul (industrial sau ocazional), prefer să folosesc o conexiune https chiar fără un certificat valid. Persoanelor care se conectează la server le vor fi criptate mesajele și nu trebuie să îmi fac griji așa mari de locul sau rețeaua din care se conectează.
Desigur pe un server public, la care se conectează vizitatori aleatoriu, va trebui să cumpăr și să folosesc un certificat valid, altfel mesajele emise de navigatoarele lor îi vor face să ignore saitul meu.

Dacă https-ul funcționează de ce arată mesajul acela cu roșu?
Pe un server public pot fi un număr de motive pentru care certificatul să nu mai fie valid, sau să fie revocat. Cum ar fi:
• Administratorii serverului au descoperit o gaură de securitate în recepția mesajelor prin https, și au decis să revoce certificatul până când remediază problema.
• Certificatul a expirat. Certificatele au o durată de valabilitate dintr-un motiv ușor de intuit. Pentru că prin încercări repetate un hacker ar putea găsi cheia privată emisă prin intermediul certificatului. Fără să fie nevoit să acceseze serverul care a emis-o. Această tehnică este numită și BF sau Brute Force Attack. În consecință un certificat expirat are șanse mai mari să fie deja compromis.
• Certificatul a fost înlocuit de către o persoană neautorizată. Și toate mesajele transmise folosind noul certificat invalid, vor putea fi decriptate de persoana în cauză. Care sigur poate fi un hacker, sau vecinul de la etaj care și-a lăsat wireless-ul fără parolă :P .

Iar navigatorul ia cel mai nefavorabil scenariu în considerare. De aceea și zice ””Vă recomandăm să nu continuaţi, mai ales dacă nu aţi mai văzut niciodată acest avertisment pentru acest site.” Așadar dacă nu ai mai văzut așa ceva probabil e stricat.

Codul culorilor


  • Conexiunea la www.encrypted.com este securizate prin https, însă certificatul nu prezintă garanție.


  • Conexiunea la www.encrypted.com este securizată prin https și certificatul prezintă garanție. Însă pe pagină sunt elemente incluse folosind http sau alte conexiuni nesigure. Știu că e mai complicat dar pentru a afișa o pagină web, navigatorul trimite mai multe mesaje pentru diverse imagini și fișiere incluse în pagină. Unele dintre acestea pot fi incluse prin alte protocoale decât cel folosit inițial de pagină.

  • Conexiunea la www.encrypted.com este securizată prin https și certificatul prezintă garanție.

  • Conexiunea la www.encrypted.com este securizată prin https și certificatul prezintă garanție. În plus se specifică compania PayPal Inc. ca responsabilă de domeniul encrypted.com.

Dacă ar fi să aleg pe care dintre aceste variante aș transmite date și informații confidențiale, aș alege doar ultimele două.

Să păcălim https!
Sunt câteva vulnerabilități demonstrate în ultima vreme ale protocolului. Majoritatea au efect pe partea de client. Dar este una foarte interesantă pe care o puteți încerca și voi, așa de curiozitate.
Dacă nu știați pentru a stabili valabilitatea unui certificat, navigatorul compară data la care expiră certificatul cu data sistemului pe care rulează. Dar, nu numai data de expirare ci și data la care a fost emis! Așadar dacă pun data calculatorului meu cu 5 ani în urmă toate certificatele emise ”în viitor” vor fi marcate ca invalide. Puteți face asta pe calculatorul unui prieten și apoi să-i explicați frumos că i-ați furat datele de card. Bine da nu faceți asta chiar de ziua lui! Mai bine de 1 Aprilie.

Concluzie
Protocolul https nu garantează că datele transmise sunt în siguranță, acesta ține datele în siguranță doar pe timpul transmisiei. Certificatele indică ”starea de sănătate” a unei conexiuni https prin validarea respectivului certificat asupra unui certificat ”rădăcină” emis de o companie terță. Oricum o conexiune cu un certificat invalid este fi la fel de sigură ca una cu certificat valid. Securitatea datelor trimise și primite însă depinde de securitatea individuală a clientului și a serverului.

Acest articol are un scop pur educațional. Orice referințe la companii sau produse reale este din pură coincidență.

Yours truly – security advisor.

Securitatea HTTPS, avem sau n-avem?

HTTPS este un protocol foarte cunoscut și totodată foarte utilizat. Traficul cu serverul este criptat, așa că se elimină  posibilitatea unui atac man-in-the-middle.  Până aici toate bune, practic cu o conexiune https putem fi siguri că parola noastră este ascunsă. Însă, și aici este un mare ”însă”, sesiunile și identificatorii lor sunt stocate ușor ”la vedere”, în cookie-uri. Adică folosind un script malițios și câteva șmecherii pentru a păcăli navigatorul un atacator le-ar putea extrage, și fără să știe datele de autentificare să obțină acces la contul utilizatorului, în care tocmai s-a autentificat.

Desigur ca să reușească atacul, inițiatorul trebuie să aibă câțiva ași în mânecă: să fie bine plasat în rețea pentru a putea ”asculta” cererile sau să aibă control asupra proxy-ului prin care trece traficul.

Prima dată s-a discutat de BEAST, care exploata o vulnerabilitate cunoscută a TLS, însă clasificată ca ”teoretică”. Acum discutăm de CRIME, care exploatează de data aceasta direct navigatorul utilizatorului. Și desigur dacă serverul urmărit are și el câteva scăpări deschide mai multe posibilități.

Ca utilizator, te poți proteja de aceste tentative prin folosirea unui navigator actualizat la zi (personal recomand Firefox sau Chrome) în modul privat sau incognito (CTRL+SHIFT+N – pe Chrome), prin conectarea la rețele de încredere (nb. evitați cele ”de cartier”), și desigur printr-un antivirus actualizat și ce are și module de scanare a traficului prin rețea. Nu știu cât protejează ultima opțiune dar în cazul în care vă conectați la o rețea ne-securizată, acesta din urmă ar trebui să fie primul care vă atenționează.