V následujícím seriálu probereme možnosti a problémy zabezpečení aplikací. Ačkoli je řada bezpečnostních problémů zaviněna samotným programátorem, začneme seznámením s metodou zabezpečeného přenosu SSL.

SSL (Secure socket layer) vyvinula v roce 1996 firma Netscape jako nekomerční otevřený protokol. Používat ho může kdokoli pro soukromé i komerční účely.

SSL je vrstva/protokol zabezpečující data na přechodu mezi aplikační a transportní vrstvou (protokolem TCP/IP). Lze zajistit šifrování přenášených dat a autentizaci serveru pomocí digitálních certifikátů. SSL není nijak omezeno pouze na protokol HTTP. SSL je možno použít i pro bezpečné připojení prostřednictvím FTP, NNTP ale i k poštovním službám přes SMTP, POP3, IMAP4 a řadu dalších protokolů. Oproti klasickým protokolům se budou zabezpečené lišit jen o písmeno "s" (například FTPS).

Pro použití SSL je třeba mít na straně serveru nainstalovanou podporu SSL a také jej musí podporovat náš prohlížeč, což v současnosti podporují téměř všechny.

To, že jsme se připojili na webové stránky zabezpečené pomocí SSL, poznáme podle adresy (obsahuje navíc písmeno s, např. https://server.cz) nebo podle indikace  prohlížeče. Obyčejně je zabezpečení přenosu indikováno ikonkou zamčeného zámku ve stavovém řádku okna prohlížeče. V závislosti na nastavení nás prohlížeč informuje o přechodu mezi zabezpečeným a nezabezpečeným režimem. Pokud máme upozorňování zapnuto, objeví se dialogové okno, ve kterém můžeme případně odmítnout přechod do nezabezpečeného režimu.

Autentizace pomocí digitálních certifikátů

Při autentizaci ověřujeme pravost klienta (resp. serveru) s nímž komunikujeme. Při tomto procesu se používá asymetrické šifrování např. algoritmus RSA, tzv. digest a certifikáty.

  • Digest je výběr znaků z původní zprávy nějakou funkcí. Tato funkce je vybrána tak, aby nebylo možné nebo alespoň maximálně obtížné sestrojit k ní funkci inverzní a aby pro různé zprávy vracela různý digest, tj aby nebylo možné, že by byl digest stejný pro různé zprávy.
  • Certifikát vydává nezávislá certifikační autorita a podepisuje jej svým soukromým klíčem. Pomocí veřejného klíče certifikační autority si pak může kdokoliv ověřit pravost certifikátu. Certifikát obsahuje jméno certifikační autority, jméno subjektu, pro který byl certifikát vystaven, veřejný klíč subjektu a údaje o časové platnosti.

Předpokládejme, že spolu chtějí komunikovat dva objekty "I." a "II.". Oba mají k dispozici svůj pár klíčů – soukromý a veřejný.

  • I. ověřuje, že komunikuje s II.a pošle II. inicializační zprávu.
  • II.odpoví na inicializační zprávu spolu se svým certifikátem.
  • I. ověří pravost certifikátu.
  • II. odešle I. nezašifrovanou zprávu spolu s tzv. digestem (výběrem znaků této zprávy), který zašifruje pomocí svého soukromého klíče.
  • I. rozšifruje pomocí veřejného klíče II. poslanou zprávu – získá tak digest. Tu samou funkci jakou použil objekt II. pro výpočet digestu aplikuje na nezašifrovanou část zprávy a obdrží další digest. Oba dva digesty porovná. Rovnají-li se, pak komunikuje opravdu s tou správnou osobou

Pokud by mezi komunikující objekty I. a II. vstoupil další III. objekt  (tzv. "man in the middle"),  mohl by podvrhnout svůj veřejný klíč a vydávat se za objekt II. Použitím certifikátu je zaručeno že posílaný veřejný klíč patří opravdu objektu II. Podobně také v posledním kroku je nutné ověření. Pouze objekt, který má správný soukromý klíč (nejen ten veřejný) úspěšně projde autentizací.

Navazování spojení, šifrování přenášených dat

Při inicializaci spojení a pro zasílání klíče celé relace se v SSL používá opět používá algoritmus RSA.

  • Klient pošle serveru požadavek Client.Hello. Spolu s tímto požadavkem posílá i svůj veřejný klíč (tento je obvykle generován v procesu instalace prohlížeče podporujícího SSL).
  • Server přijme požadavek Client.Hello a odpoví Server.Hello. Odpověď zašifruje pomocí veřejného klíče prohlížeče. V této odpovědi posílá i veřejný klíč serveru.
  • Po úspěšném přijetí zprávy Server.Hello odešle prohlížeč serveru žádost o klíč, kterým bude šifrována celá relace. I tato zpráva je zašifrována veřejným klíčem serveru.
  • Jako odpověď server zasílá klíč relace. Tato zpráva je zašifrována veřejným klíčem prohlížeče.
  • Když klient dostane požadovaný klíč relace, šifruje se veškerá další komunikace tímto klíčem,  tj. v případě HTTP přenosu se šifrují všechny HTTP požadavky.

Dohodnuté šifrování zůstává v platnosti pro více po sobě následujících spojení. Nové klíče se generují pro každý přenos. Používá se 128 bitový klíč, v USA pak 512 bitový.

Užití SSL v aplikaci na webu

Pokud náš server podporuje SSL, je použití úplně jednoduché – stačí prostě přistupovat k naší aplikaci přes protokol HTTPS. Pomocí PHP můžeme lehce ověřit, zda naše aplikace běží v zabezpečeném režimu, aby například někdo nepřistupoval k našim stránkám v nezabezpečeném režimu. Na začátek naší aplikace přidáme tento kód:

<?PHP
$SSL_Port=443; // port SSL komunikaci, administrátor serveru může nastavit i jiný
if ($SERVER_PORT!=$SSL_Port) { // ověřit, zda jde o protokol https
  if (empty($mustbesecure)) // je-li prázdná testovací proměnná, přesměrovat na zabezpečenou stránku s nastavením této proměnné
    header("Location: https://$HTTP_HOST$SCRIPT_NAME?$QUERY_STRING&mustbesecure=1");
  else
    echo "Zabezpečené spojení nelze navázat"; // ani po přesměrování se nezdařilo zabezpečený přenos navázat
  exit;
}
?>
Zabezpečeno

Kód je potřeba přidat do všech skriptů, aby nebylo možné žádný z nich spustit v nezabezpečeném režimu. Nebuďme však „masochisty“ a zase zbytečně nepřehánějme použití SSL tam, kde to není nezbytné. Výměna ověřovacích informací totiž může nepříjemně zpomalit naši aplikaci.

Kdy potřebujeme dávat k aplikaci vlastní certifikát?

Laicky řečeno, potřebujeme dát k dispozici klientům jejich vlastní certifikát pouze tehdy, pokud potřebujeme zajistit, že s naší aplikací komunikuje určitý konkrétní objekt (například klient přistupující ke svému bankovnímu účtu). Pokud nám je lhostejné, kdo s aplikací pracuje, jen chceme zabezpečit, aby informace, které si klient s aplikací vymění (například některý ze správců databáze, redakčního systému) nemohly uniknout, certifikát není potřebný. Při navázání spojení se serverem přes https nabídne prohlížeč k použití certifikát serveru (ten musí být k dispozici, zajistí to správce serveru) a žádný další není potřebný.

V článku samozřejmě není vše, co se týká SSL, cílem bylo přiblížit možnosti a základy použití.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět