Na počátku stvořil Admin server a službu. Služba pak byla nesličná a nebezpečná a data byla přenášena plaintextem. I řekl Admin: „Budiž SSL!“ I bylo SSL. A viděl Admin, že SSL bylo dobré. I oddělil Admin SSL od plaintextu a nazval SSL bezpečným a plaintext nebezpečným. I vznikl self-signed certifikát a zabezpečený přenos, služba první.
Self-signed overflow
Tak takhle začínal asi každý. Jedna služba. Jeden self-signed certifikát, který se naimportuje kam je potřeba, a všichni jsou spokojeni. A pak přibyde druhá služba. A třetí, čtvrtá a pátá a údržba klientských počítačů začne být problematická, protože uživatelé neumí (a nechtějí umět) číst, a tak místo aby si certifikáty sami naimportovali, vás raději budou bombardovat žádostmi o radu s tím, že „jim tam v Outlůku furt něco vyskakuje“ a že „se nemůžou připojit na tu VéPéeNku, protože to po nich něco chce“. Tomu lze učinit přítrž jedou provždy. Nebo alespoň po dobu platnosti kořenového certifikátu vaší vlastní certifikační autority. Tím totiž budou podepisovány všechny vaše ostatní certifikáty, které, pokud se klient rozhodne věřit tomu kořenovému, budou považovány za důvěryhodné automaticky.
Věřte - nevěřte
S certifikačními autoritami a jejich kořenovými certifikáty je obecně problém v tom, že jejich implementace a distribuce se vydala už od začátku úplně špatným směrem. Ve výchozích instalacích Windows a po instalaci balíčku ca-certificates i na některých linuxech máte kýbl kořenových certifikátů a najednou, bez toho aby se vás někdo ptal, implicitně věříte kýblu firem, o kterých jste třeba ani vůbec neslyšeli. Nemělo by snad záviset na uživateli, komu bude důvěřovat a čí certifikáty si do počítače natahá? Jedna z firem, kterým spravuji middleware, to řeší tak, že má svých šest kořenových certifikátů, které má na všech firemních počítačích, a žádným jiným implicitně nedůvěřuje. A tak by to podle mě mělo být. Věřte tomu, komu skutečně věříte a ne tomu, kdo si zaplatil, aby jeho certifikáty byly v balíčku. Celá ta idea velmi pravděpodobně opět stojí a padá na přesvědčení, že uživatel je buď líný nebo hloupý (případně oboje) a tak se mu všechno musí naservírovat až pod nos.
Nápomocné OpenSSL
Naštěstí je tu pro nás už více než deset let otevřená kryptografická knihovna OpenSSL, která nám umožní si vytvořit úplnou certifikační autoritu, a pokud zrovna někdo nesmaže kus zdrojového kódu, jako se to debianistům podařilo v roce 2008, je i taková domácí CA bezpečná a bez problémů použitelná i v ostrém provozu.
Následující příklady byly prováděny na Debianu 6 s nainstalovaným balíkem openssl. K vytvoření CA a kořenového certifikátu si nejprve nachystáme prostředí. Vytvoříme si potřebné složky (já se rozhodl pro /etc/myCA), zkopírujeme existující konfiguraci OpenSSL, kterou později budeme upravovat k obrazu svému a vytvoříme soubor index.txt, který bude držet databázi certifikátů a soubor serial, který bude poskytovat sériové číslo certifikátu.
mkdir -p /etc/myCA/{private,certs,newcerts,crl}
cd /etc/myCA
cp /etc/ssl/openssl.cnf myCA.cnf
touch index.txt
echo '01' > serial
Otevřete-li váš zkopírovaný myCa.cnf, zjistíte, že je v něm spousta údajů. Naštěstí není nutno je modifikovat všechny. Bohatě postačí upravit pouze cesty v bloku CA_default. Já třeba modifikoval následující:
...
[ CA_default ]
dir = /etc/myCA
certificate = $dir/certs/CA.crt
private_key = $dir/private/CA.key
default_days = 3650
policy = policy_anything
...
[ req ]
default_bits = 2048
...
[ req_distinguished_name ]
countryName_default = CZ
0.organizationName_default = Disassembler
Vy samozřejmě nemusíte slepě následovat můj návod. Radím vám si soubor projít, pročíst si, co všechno se dá nastavit a k čemu je to dobré, a upravit si jakékoliv další údaje podle svého uvážení. Až budete mít konfigurační soubor upraven a uložen, můžete směle přistoupit k vytvoření toho nejdůležitějšího - kořenového certifikátu.
openssl req -config myCA.cnf -new -x509 -keyout private/CA.key -out certs/CA.crt
Doporučuji zadat nějaké opravdu silné heslo, protože tímto kořenovým certifikátem budete podepisovat všechny ostatní certifikáty. Nový „obyčejný“ certifikát, respektive žádost o podepsání certifikátu vytvoříte příkazem
openssl req -config myCA.cnf -new -nodes -keyout private/service.key -out service.csr
Parametr -nodes značí, že klíč k vygenerovanému certifikátu nebude vyžadovat heslo. Vytváříte-li certifikát osobní, pak budete pravděpodobně tuto volbu chtít vynechat. Certificate signing request pak podepíšete pomocí
openssl ca -config myCA.cnf -in service.csr -out certs/service.crt
*.csr soubor se žádostí pak můžete smazat. Ten už nikdy potřeba nebude. Vygenerovaný certifikát pak můžete použít ve vaší službě, a pokud klient důvěřuje vaší certifikační autoritě, certifikát bude automaticky akceptován.
Minislovníček přípon souborů
- *.crl – Certificate revocation list, tedy seznam neplatných a zamítnutých certifikátů.
- *.crt – Vlastní certifikát bez specifického určení formátu souboru. Ten je možno bez obav šířit.
- *.csr – Certificate signing request, tedy žádost o podepsání certifikační autoritou.
- *.der – Certifikát (tedy totéž jako *.crt) v binárním formátu DER - distinguished encoding rules.
- *.key – Soukromý klíč. Ten si držte pod zámkem a přístup k němu nastavte jen těm, kteří jej nezbytně potřebují.
- *.pem – Certifikát (tedy totéž jako *.crt) v textovém formátu PEM - privacy enhanced mail. Jedná se o DER zakodovaný pomocí Base64.