neděle 23. března 2014

Zabezpečené spojení HTTPS a vlastní SSL certifikát v Apache2

Úvod

Standardní spojení s webovým serverem pomocí protokolu HTTP neobsahuje prvky šifrování přenášených dat nebo ověření identity serveru z pohledu klienta. Rizikem je tedy odposlouchávání komunikace a podvržení identity serveru. Proto bylo vyvinuto rozšíření pomocí zabezpečovací vrstvy SSL popř. novější TLS, souhrnně tedy mluvíme o HTTPS (Hypertext Transfer Protocol Secure).

Na úvod je potřeba říci, že aby bylo zabezpečení uživatele kompletní, je potřeba, aby si obě strany před vzájemnou komunikací vyměnily veřejné klíče pomocí jiného kanálu, než je ten, pomocí kterého budou následně chtít (bezpečně) komunikovat. To je ale v praxi poměrně obtížné a proto se volí jiný způsob a to je přenechání  ověření pravosti klíče jinému subjektu, což je nejčastěji obecně uznávaná, důvěryhodná autorita. Ve výsledku to funguje tak, že nám server předloží digitálně podepsaný certifikát od tzv. certifikační autority a my jej porovnáme s veřejným klíčem na naší straně, resp. na našem počítači. Certifikáty od důvěryhodných certifikačních autorit jsou dodávány společně s webovými prohlížeči (za což se pochopitelně platí určitá částka), takže se k uživateli dostanou poměrně snadno a navíc je bez větších komplikacích možné ihned použít aniž by musel uživatel sám obstarávat dodání certifikátu od protistrany.
Ukázka informací o certifikátu podepsaného autorizovanou autoritou, v tomto případě GeoTrust Inc. Dále si lze povšimnout, že je uveden i skutečný provozovatel serveru (což není zas tak časté), zde konkrétně Ministerstvo vnitra.
Existuje druhý typ certifikátů, tzv self-signed, tedy certifikát podepsaný sám sebou. Takový to certifikát si může vytvořit kdokoli sám u sebe, samozřejmě zdarma. Pokud server, při zahájení komunikace předloží tento self-signed certikát, objeví se upozornění, kdy vás prohlížeč varuje že nelze ověřit věrohodnost serveru protože certifikát nebyl vydán certifikační autoritou a je jen na vás aby jste uvážili jestli protistraně důvěřujete (viz obrázek na konci článku). Pokud ano, tak většina prohlížečů umožňuje server zařadit mezi důvěryhodné a přímo certifikát stáhnout a uložit.  Při další návštěvě serveru už bude prohlížeč na server nahlížet jako na důvěryhodný (resp. za důvěryhodný ho považuje uživatel).

Nicméně je potřeba dodat, že vlastnost šifrování přenosu je stále funkční, i když není certifikát podepsaný certifikační autoritou.

Z výše uvedených důvodů je výskyt self-signed certifikátů na komerčních webech poměrně nízký a např u služeb jako je internetové bankovnictví je v podstatě nepřijatelný. Naopak u menších webů a serverů pro omezený počet uživatelů (nebo pro vlastní server určený pro testování a experimenty) je vlastní certifikát dostačující. V těchto případech je prioritou šifrování komunikace (např. zadávání hesel při přihlašování k službám). Self-signed certifikáty lze použít i při zabezpečeném FTP. Některé společnosti začali dokonce nabízet podepsané certifikáty zdarma, o tom snad v jiném článku.

Ukázka informací o self-signed certifikátu.

Instalace

Ukážeme si vytvoření vlastního certifikátu pro HTTPS spojení v Apache2 bežící na Ubuntu 12.4 LTS (stejný postup je samozřejmě možný v Debianu). Předpokladem je mít přístup k root účtu. Pokud nejste přihlášeni přes root účet, před každý příkaz dopiště sudo.

Pokud nemáme ještě webový server Apache, tak jej nyní nainstalujeme
apt-get install apache2
Dále povolíme SSL modul
a2enmod ssl
Restartujeme web server
service apache2 restart
 Pro certifikáty si vytvoříme novou složku
mkdir /etc/apache2/ssl
Vytvoříme nový pár klíčů na straně serveru a certifikát s platností jeden rok (parametr -days).
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
V konzoli následuje série údajů které můžete vyplnit. Doporučuje se vyplnit alespoň některé.
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

-----
Country Name (2 letter code) [AU]: // stát
State or Province Name (full name) [Some-State]: // provincie (okres)
Locality Name (eg, city) []: //lokalita (město)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: //název společnosti
Organizational Unit Name (eg, section) []: //název oddělení
Common Name (e.g. server FQDN or YOUR name) []:  //volitelný název (jméno)
Email Address []: //email
Nyní je potřeba nastavit Apache. Otevřeme konfig pro SSL.
nano /etc/apache2/sites-available/default-ssl
 Zde vložíme, např. pod řádek <VirtualHost _default_:443> následující řádek
ServerName nazevserveru.domena:443
nebo pokud máme jen IP adresu
ServerName  10.11.12.13:443
Dále najdeme řádek
SSLEngine on
 měl by být nezakomentovaný (bez # na začátku). Pokud tam není nebo vypadá jinak, přepište ho.

Ještě je potřeba definovat cestu ke klíčům a certifikátu:
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
Z důvodů bezpečnosti (POODLE útok) vypneme starší verze protokolů SSLv2 a SSLv3
SSLProtocol all -SSLv2 -SSLv3
Soubor uložte a zavřete (Crtl+X a potvrdit zapsání pomocí klávesy Y).

Na závěr ještě musíme nastavit přístup přes port 443. Povolíme Virtual Hosta default-sll
a2ensite default-ssl
 A restartujeme Apache
service apache2 reload
Nyní do prohlížeče zadejte
https://nazevserveru.domena
a ověřte funkčnost.

Varování prohlížeče Firefox na nedůvěryhodný certifikát. Ten jsme vygenerovali v předchozí ukázce
Bonus na závěr: V tuto chvíli lze na webový server přistupovat pomocí HTTPS (port 443) a zárověň i postaru přes HTTP (port 80), tedy i nezabezpečeně. Pokud chcete povolit jen přístup přes zabezpečený port 443, postup je následující.

Povolte mód rewrite
a2enmod rewrite
Editujte soubor
nano /etc/apache2/sites-available/default 
 a do něho přidejte pod řádek <VirtualHost *:80> následující tři řádky
RewriteEngine   on
RewriteCond     %{SERVER_PORT} ^80$
RewriteRule     ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
Opět restart server
service apache2 reload
Nyní pokud zadáte adresu s http:// na začátku, dojde k přesměrování na https://.

Seznam změn:
9-11-2014: doplněna bezpečnostní "záplata" 

Reference: 1, 2, 3 

Žádné komentáře:

Okomentovat