Článek popisuje postup práce s OpenSSL při přípravě požadavku na certifikát, práci s certifikační autoritou a postup při odvolávání kompromitovaného certifikátu. Napadlo mě, že po odhalení bezpečnostní chyby v OpenSSL se návod na generování a revokaci certifikátů mnohým z vás může hodit. Pokud ještě nemáte připravenu certifikační autoritu, přečtěte si nejprve článek Používáme OpenSSL – příprava certifikační autority.
Vytvoření podepsaného certifikátu
Klasicky, s externí certifikační autoritou proces podepisování funguje tak, že:
- Klient si vytvoří pár klíč + žádost o certifikát
- Klíč si ponechá, certifikační autoritě jej nezasílá (musí být, přirozeně, držen v tajnosti)
- Žádost pošle certifikační autoritě spolu s dokumenty, které prokazují, že to je opravdu on
- Autorita si údaje ověří
- Pokud je vše v pořádku, certifikát podepíše a odešle zpět
Pokud jste sami autoritou, postup je pro vás stejný, nicméně vše děláte vy sami.
Generování požadavku na certifikát
$ openssl req -new -nodes -out pozadavek.pem -keyout klic.pem -days 1098
Popis příkazu
- req – požadavek na certifikát
- -new – vytváříme novou žádost
- -nodes – soukromý klíč nebude zašifrován (důležité!)
- -out soubor – soubor s požadavkem na certifikát
- -keyout klic.pem – klíč zapsán do uvedeného souboru
- -days 1098 – certifikát bude platný po dobu 1098 dní (3 roky)
Generování certifikátu z požadavku v roli certifikační autority
# openssl ca -in pozadavek.pem -out certifikat.crt \ -keyfile ca-key.pem -cert ca-cert.crt
Popis příkazu
- ca – pracujeme v roli certifikační autority
- -in pozadavek.pem – vstupní požadavek
- -out certifikat.crt – výstupní certifikát
- – keyfile – podpisový klíč certifikační autority
- – cert – certifikát certifikační autority
Potvrdíme, že chceme certifikát podepsat. Ve výstupním souboru získáme podepsaný certifikát.
Kontrola vygenerovaných souborů
$ openssl req -in pozadavek.pem -text -noout $ openssl rsa -in klic.pem -text -noout $ openssl x509 -in certifikat.crt -text -noout
vypíšeme požadavek, certifikát a klíč v čitelném formátu.
Popis parametrů příkazů
- req – budeme pracovat s požadavkem na certifikát
- rsa – budeme pracovat s RSA klíčem (základní režim práce openssl)
- x509 – budeme pracovat s certifikátem
- -in soubor – soubor, který se má číst
- -text – výstup příkazu bude v textovém formátu
- -noout – bez výpisu textové hodnoty samotného požadavku, klíče, certifikátu (volitelné)
Změny v adresáři certifikační autority
- V souboru serial se zvýší číslo o 1, tedy např. z 02 na 03
- V adresáři certs se objevil soubor se jménem 02.pem obsahující podepsaný certifikát
- V souboru index.txt se objevil řádek s údaji o certifikátu
- Staré soubory index.txt a serial jsou zálohovány jako index.txt.old a serial.old
Certifikační autorita má všechny podepsané certifikáty uloženy, je možné je dohledat, případně revokovat.
Certifikát podepsaný jen sám sebou
Tento postup obvykle nepoužíváme. Pokud však nemáte k dispozici certifikační autoritu a potřebujete certifikát, například pro testy a ladění, může se vám tento příkaz hodit.
$ openssl req -new -x509 -nodes \ -out certifikat.crt -keyout klic.pem -days 365
Popis příkazu
- req – certifikační žádost
- -new – vytvoříme novou žádost
- -in – variantou je načtení žádosti ze souboru
- -x509 – nebude se vytvářet certifikační požadavek, ale už rovnou certifikát podepsaný sám sebou (self-signed)
- -nodes – soukromý klíč nebude zašifrován (důležité!)
- -out certifikat.crt – certifikát zapsat do uvedeného souboru
- -keyout klic.pem – klíč zapsat do uvedeného souboru
- -days 365 – certifikát bude platný po dobu 365 dní (1 rok)
Při provádění příkazu budeme požádáni o zadání doplňujících informací, jména, organizace, adresy, emailu. A také jména (CN). To je nejdůležitější pole. Zde je třeba vyplni jméno serveru, pro který má být certifikát vystaven, například www.aacomputer.cz.
Odvolání (revokace) certifikátu
# openssl ca -revoke odvolávaný_certifikat.crt
Popis příkazu
- ca – pracujeme v roli certifikační autority
- -revoke odvolávaný_certifikát
Výše uvedeným krokem certifikační autorita certifikát odvolala, ale nikdo o tom neví. Informace je pouze uložena v datech CA samotné. Sdělení této informace se provádí seznamem odvolaných certifikátů.
# openssl ca -gencrl -keyfile /etc/pki/tls/CA/private/ca-klic.pem \
-cert /etc/pki/tls/CA/ca-certifikat.crt \
-out /etc/pki/tls/CA/ca-crl-certifikat.crl
Popis příkazu
- ca – pracujeme v roli certifikační autority
- -gencrl -generuje seznam odvolaných certifikátů (Certifikate Revocation List)
- -keyfile – privátní klíč certifikační autority
- -cert – certifikát certifikační autority
- -out výstupní soubor – seznam odvolaných certifikátů
Komerční certifikační autority vydávají tyto revokační certifikáty obvykle periodicky. Lze pro ně proto určit období platnosti, např. 1 měsíc. My je pro naše zákazníky generujeme pouze poté, co odvoláváme platnost nějakého certifikátu.
Práce se seznamy odvolaných certifikátů na straně klienta
Na straně klientů je nejjednodušší import do standardního úložiště odvolaných certifikátů. Postačí v MS Windows poklepat na název souboru s příponou CRL a spustí se průvodce importem odvolaných certifikátů.
Po restartu prohlížečů a připojení k serveru, co nabízí odvolaný certifikát je spojení klientem odmítnuto s tím, že certifikát byl odvolán. Toto hlášení je třeba odlišit od hlášení, že certifikát je nedůvěryhodný z důvodu, že byl podepsán nedůvěryhodnou certifikační autoritou. Tuto hlášku již mnozí uživatelé standardně ignorují. Hlášku o odvolaném certifikátu je ignorovat velice nebezpečné. Důvod je jasný. Pokud si někdo dává práci s odvoláváním certifikátu, je již zřejmě kompromitován nebo jej nelze dále užívat z jiných důvodů.
Shrnutí postupu při nahrazování certifikátu
1. Příprava nového požadavku na certifikát a generování nového privátního klíče (v roli klienta CA)
# openssl req -new -nodes -out pozadavek.pem -keyout klic.pem -days 1098
2. V úloze certifikační autority podepíšeme požadavek na certifikát
# openssl ca -in pozadavek.pem -out certifikat.crt
3. Odvolání starého certifikátu
# openssl ca -revoke odvolávaný_certifikat.crt
4. Vygenerování nového seznamu odvolaných certifikátů
# openssl ca -gencrl -keyfile /etc/pki/tls/CA/private/ca-klic.pem \ -cert /etc/pki/tls/CA/ca-certifikat.crt \ -out /etc/pki/tls/CA/ca-crl-certifikat.crl
5. Předáte nový seznamu odvolaných certifikátů straně klienta. Více již udělat nemůžete.
A to je vše. Těším se na vaše připomínky a komentáře.