Při získávání certifikátů od CA Let's Encrypt se zpravidla používá http-01 challenge, kdy se ověřuje kontrola nad doménou pomocí HTTP requestu na definovanou URL. To je velice snadné a dá se to jednoduše automatizovat. Na Linuxu můžete použít Certbot, na Windows + IIS třeba AutoACME nebo win-acme.

Někdy se ale hodí dns-01 challenge, kdy se kontrola nad doménou ověřuje pomocí DNS záznamů. To je náročnější (protože je třeba mít možnost vytvořit patřičné DNS záznamy pomocí nějakého API, což ne každé řešení umožňuje), ale má to své výhody:

V tomto labu si ukážeme, jak takový certifikát získat, pokud je váš DNS provozován u Cloudflare. Návod je psán pro Raspberry Pi OS, ale bude přiměřeně platit i pro ostatní distribuce Linuxu.

Získání API tokenu od Cloudflare

Nejprve budeme muset získat autentizační údaj, který umožní pracovat s danou doménou (zónou). Cloudflare rozeznává dva druhy takových údajů:

Budeme používat tokeny, protože je to bezpečnější.

1.

Přihlašte se do Cloudflare Dashboard na adrese https://dash.cloudflare.com/.

2.

Klepněte v pravém horním rohu na ikonu uživatele a pak na My Profile.

3.

Klepněte v levém menu na API Tokens a poté na Create Token.

4.

Vyberte šablonu Edit zone DNS.

5.

Vyberte jednu nebo více zón, které má mít tento token možnost editovat a klepněte na Continue to summary.

Můžete také nastavit časové omezení platnosti tokenu a případě omezení IP adres, z nichž smí být používán.

6.

V potvrzovacím dialogu klepněte na Create token.

7.

Zobrazí se vám token, který si pečlivě poznamenejte. Nebudete ho moci později zobrazit, ale budete ho později potřebovat.

Pomocí příkazu curl si můžete ověřit, že je zadaný token funkční. Pokud ano, vrátí se vám odpověď v následujícím tvaru:

{
"result": {
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "status": "active"
},
"success": true,
"errors": [],
"messages": [
    {
    "code": 10000,
    "message": "This API Token is valid and active",
    "type": null
    }
]
}

Pozor, Cloudflarem nabídnutý příkaz bude fungovat jenom v Bashi. Ve Windows s cmd musíte příkaz napsat na jeden řádek nebo místo \ použít ^, např.:

curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" ^
     -H "Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ^
     -H "Content-Type:application/json"

V PowesShellu musíte název příkazu napsat včetně přípony .exe a pro pokračování řádku se používá zpětný apostrof:

curl.exe -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" `
         -H "Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" `
         -H "Content-Type:application/json"

Instalace utility Certbot

Certbot je program od EFF, který se stará o získávání a obnovování certifikátů. Bohužel nefunguje na Windows, ale na Linuxu funguje výborně.

8.

Pokud váš systém podporuje Snap (Ubuntu a některé další distribuce), naninstalujte ho následujícím příkazem:

sudo snap install --classic certbot
9.

Pokud příkaz skončil chybou, např. sudo: snap: command not found, musíte nejprve nainstalovat snap, což učiníte následující sekvencí příkazů:

sudo apt-get update
sudo apt-get install snapd -y
sudo snap install core

Poté znovu zadejte příkaz pro instalaci Certbota:

sudo snap install --classic certbot
10.

Následujícím příkazem vytvořte symlink, pomocí kterého bude možné Certbota snadno spouštět:

sudo ln -s /snap/bin/certbot /usr/bin/certbot
11.

Následujícími příkazy nainstalujte plugin pro Cloudflare a určíte, že má běžet ve stejném kontextu, jako certbot sám:

sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-cloudflare
12.

Vytvořte adresář /root/.secrets:

sudo mkdir /root/.secrets
13.

Následujícím příkazem vytvořte soubor /root/.secrets/cloudflare.ini pomocí editoru nano:

sudo nano /root/.secrets/cloudflare.ini
14.

Zadejte do souboru následující obsah (použijte token, který jste vytvořili v kroku 7):

dns_cloudflare_api_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
15.

Uložte provedené změny klávesovou zkratkou Ctrl+S a ukončete editor pomocí Ctrl+X.

16.

Následujícími příkazy zajistěte, že k souboru nebude mít přístup nikdo jiný, než root:

sudo chmod 0700 /root/.secrets/
sudo chmod 0400 /root/.secrets/cloudflare.ini

Žádost o certifikát

17.

Následujícím příkazem pošlete žádost o certifikát (samozřejmě nahraďte www.example.com vlastním názvem serveru):

sudo certbot certonly \
    --dns-cloudflare \
    --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
    --preferred-challenges dns-01 \
    -d www.example.com

Při prvním spuštění budete požádáni o zadání e-mailové adresy, souhlas s licenčními podmínkami a souhlas se zasíláním zpráv od EFF (ten je volitelný).

Pokud chcete vydat certifikát platný pro více DNS jmen, použijte parametr -d vícekrát, např.:

sudo certbot certonly \
    --dns-cloudflare \
    --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
    --preferred-challenges dns-01 \
    -d www.example.com -d example.com

Pokud chcete požádat o wildcard certifikát, použijte hvězdičku:

sudo certbot certonly \
    --dns-cloudflare \
    --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
    --preferred-challenges dns-01 \
    -d *.example.com -d example.com

Pozor, wildcard certifikát *.example.com bude fungovat například pro www.example.com nebo praha.example.com. Nebude ale fungovat pro example.com (to musíte uvést zvlášť) nebo www.praha.example.com.

Wildcard * je povolen jenom před první tečkou ve jméně. Můžete tedy požádat o *.praha.example.com ale ne třeba o www.*.example.com.

18.

Nyní máte v adresáři /etc/letsencrypt/live/www.example.com/ vše, co potřebujete k použití certifikátu. Najdete tam následující soubory:

  • privkey.pem je privátní klíč k certifikátu.
  • fullchain.pem certifikát (veřejný klíč) a všechny certifikáty potřebné pro jeho ověření.
  • cert.pem je pouze certifikát.
  • chain.pem jsou certifikáty potřebné pro jeho ověření.

Záleží na použitém serverovém software, zda bude chtít certifikát a chain dohromady nebo zvlášť a jakou formou má být konfigurován.