Hlavní navigace

HTTPS certifikát Let's Encrypt pomocí Apache a vestavěného modulu mod_md

18. 3. 2022
Doba čtení: 6 minut

Sdílet

 Autor: Depositphotos
Existuje řada způsobů, jak získat certifikát od Let's Encrypt. Můžeme použít oficiálního klienta Certbot, některého z mnoha alternativních klientů či můžeme nasadit web server, který se o vše postará sám.

Certifikát od Let's Encrypt je možné například pomocí klienta Certbot, psali jsme i o populárním ACME.sh nebo jednoduchém klientovi Dehydrated. Některé nástroje mají podporu přímo zabudovanou, jako například web server Caddy.

Mozilla před časem iniciovala a zaplatila vývoj modulu mod_md, který je určen pro web server Apache. Modul je hotový, plně funkční a je součástí aktuálních linuxových distribucí. Pro jeho použití nebudete potřebovat nic speciálního, stačí si jen v konfiguraci serveru říct, že pro dané doménové jméno chcete vystavit certifikát. Všechno ostatní se stane samo. Jednodušší už to ani být nemůže.

Postup si ukážeme na aktuální verzi distribuce Debian 11 Bullseye, která spatřila světlo světa v srpnu roku 2021. Následující postup předpokládá, že na veřejnou IP adresu serveru je namířeno alespoň jedno doménové jméno a že je server dostupný z internetu. Autorita Let's Encrypt totiž bude během vydávání certifikátu ověřovat, zda máte možnost s obsahem na doméně manipulovat a Apache jí musí vracet ve správnou chvíli správné odpovědi.

Co se dozvíte v článku
  1. Instalace Apache
  2. Zapínáme mod_md
  3. Konfigurujeme mod_md
  4. Konfigurujeme hostitele
  5. Startujeme a zkoušíme

Instalace Apache

Předpokládejme, že máme spuštěný linuxový server s nejnovějším Debianem a že jsme upravili zónu v DNS tak, aby A a AAAA záznamy mířily na IPv4 a IPv6 adresu serveru. Samozřejmě předpokládáme, že jsme zvolili to doménové jméno, na kterém pak poběží náš nový web s HTTPS.

Instalace je velmi jednoduchá, nebudeme vlastně potřebovat nic víc než samotný Apache. Můžeme tedy rovnou volat:

# apt install apache2

Systém sám vyřeší všechny závislosti a nainstaluje potřebné balíčky. Můžeme se přesvědčit, že je mod_md součástí instalace. Najdeme ho v balíčku apache2-bin, který se nám automaticky nainstaloval.

# dpkg-query -L apache2-bin|grep md
/usr/lib/apache2/modules/mod_md.so

Je tam a je připraven pro nás pracovat.

Zapínáme mod_md

Modul je hned po instalaci vypnutý a Apache jej nenačítá. Snadná pomoc, prostě si řekneme, že ho chceme zapnout. Cesta k souboru pro načítání modulu se nalinkuje do adresáře  /etc/apache2/mods-enabled/, který Apache prohledává a načítá z něj obsah. Pro praktické použití to ale nepotřebujeme vědět, protože to celé lze ovládat příkazy začínajícími na  a2.

# a2enmod md
Enabling module md.
To activate the new configuration, you need to run:
  systemctl restart apache2

Modul je zapnut, pro jeho použití je ještě potřeba restartovat Apache. My to zatím dělat nebudeme, protože potřebujeme doplnit další konfiguraci. Zda je modul zapnutý, se můžete kdykoliv přesvědčit:

# a2query -m md
md (enabled by site administrator)

Budeme rozhodně potřebovat ještě modul pro podporu šifrování, takže si ho rovnou taky zapneme:

# a2enmod ssl

Konfigurujeme mod_md

Přichází to podstatné: musíme modulu říct, co po něm budeme potřebovat, aby zařídil. Vytvoříme nový konfigurační soubor  /etc/apache2/conf-available/acme.conf. Ten bude obsahovat volby pro modul, které budou společné všem virtuálním hostitelům – doménám.

MDCertificateAgreement    https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
ServerAdmin               admin@example.com

MDCertificateProtocol     ACME
MDCAChallenges            http-01
MDPrivateKeys             RSA 2048
MDRenewWindow             33%
MDStoreDir                md
MDCertificateAuthority    https://acme-v02.api.letsencrypt.org/directory

Zásadní jsou dvě první volby, které zajistí hladkou komunikaci s certifikační autoritou. Zajistí automatické potvrzení souhlasu s podmínkami užívání a předají autoritě povinný kontaktní e-mail.

Následující blok voleb je tu jen pro demonstraci a obsahuje výchozí konfigurační varianty. Pokud je takto neuvedete vůbec, budou platit stejná pravidla. Je na nich ale dobře vidět, co je možné rozumně nastavit: použitý komunikační protokol, typ validačního procesu, typ a délku klíčů, časové okno pro obnovu certifikátů, adresář pro ukládání certifikátů a odkaz na API vybrané autority. Pokud chcete experimentovat a použít testovací instanci autority Let's Encrypt, změňte hodnotu poslední volby na  https://acme-staging-v02.api.letsencrypt.org/directory.

Varování: mail na admina je potřeba vyplnit rozumně, certifikační autorita například nedovoluje uvádět zmíněnou doménu example.com. Pokud to uděláte přesně jako v příkladu, certifikát vám nebude vystaven. Chybu najdete samozřejmě v logu.

Zastavíme se ještě u volby  MDRenewWindow, která říká, po jaké době je potřeba certifikát obnovit. Let's Encrypt má certifikáty s platností 90 dnů, před uplynutím této doby je potřeba požádat o obnovu. Apache se o to postará sám, my mu jen můžeme říct, kdy to má dělat. Ve výchozím stavu má nastaveno 33 % doby platnosti, tedy zhruba 30 dnů před vypršením certifikátu. Tuto procentuální hodnotu můžeme upravit nebo nahradit za časový údaj: třeba  14d.

Je užitečné do konfiguračního souboru ještě přidat monitorovací funkci, kdy bude na vybrané URL web server Apache ukazovat informace o jednotlivých certifikátech. Pokud nechceme tuto stránku otevírat do světa, můžeme jednoduše zvolit, pro jaké adresy se má obsah objevovat. Na konec souboru tedy můžeme připsat například:

<Location "/md-status">
    SetHandler md-status
    Require ip 127.0.0.1 10.0.0.0/24
</Location>

Kompletní dokumentaci k těmto volbám i dalším možnostem naleznete v dokumentaci modulu mod_md.

Soubor uložíme a přidáme mezi konfigurační soubory, které bude Apache při dalších startech zpracovávat:

# a2enconf acme
Enabling conf acme.
To activate the new configuration, you need to run:
  systemctl reload apache2

Konfigurujeme hostitele

Máme vše připraveno, zbývá nastavit virtuálního hostitele. Tedy část konfigurace, která se bude týkat jednoho našeho webu. Vytvoříme tedy soubor /etc/apache2/sites-available/example.conf a připíšeme do něj základní konfiguraci pro Apache, doplněnou o pár voleb kvůli šifrování.

MDomain example.com
DirectoryIndex index.html

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com/
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    ServerName example.com
    DocumentRoot /var/www/example.com/
</VirtualHost>

Po uložení musíme opět nechat Apache, aby přidal tento nový konfigurační soubor do svého adresáře a počítal s ním při dalším načtení:

# a2ensite example
Enabling site example.
To activate the new configuration, you need to run:
  systemctl reload apache2

Startujeme a zkoušíme

Je čas restartovat Apache a nechat ho udělat práci podle nové konfigurace. Stačí tedy zavolat:

# systemctl restart apache2

Pokud se objeví nějaké potíže, budou ve /var/log/apache2/error.log. Jelikož jsme všechno udělali dobře, objeví se tam jen hláška:

[md:notice] [pid 9321:tid 140048456062720] AH10059: The Managed Domain example.com has been setup and changes will be activated on next (graceful) server restart.

Zároveň se objevil kryptografický materiál v adresáři /etc/apache2/md/. Najdeme tam v podadresářích informace o účtu vytvořeném u certifikační autority, soukromý klíč i vystavený certifikát a v souboru md.json pak u každé domény nalezneme konfiguraci týkající se daného certifikátu.

Teď tedy musíme zařídit ještě jedno „kultivované“ otočení serveru, po kterém už bude všechno fungovat:

CS24_early

# systemctl reload apache2

Teď už se nám rozběhne HTTPS a web server začne podávat statický obsah z kořenového adresáře. Protože jsme si nakonfigurovali stavovou stránku, můžeme otevřít https://example.com/md-status a podívat se na výsledek, který se zobrazí ve formátu JSON.

{
  "version": "2.4.10",
  "managed-domains": [
    {
      "name": "example.com",
      "domains": [
        "example.com"
      ],
      "contacts": [
        "mailto:admin@example.com"
      ],
      "transitive": 1,
      "ca": {
        "account": "ACME-.letsencrypt.org-0000",
        "proto": "ACME",
        "url": "https://acme-v02.api.letsencrypt.org/directory",
        "agreement": "https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf",
        "challenges": [
          "http-01"
        ]
      },
      "privkey": {
        "type": "RSA",
        "bits": 2048
      },
      "state": 2,
      "renew-mode": 1,
      "renew-window": "33%",
      "warn-window": "10%",
      "must-staple": false,
      "proto": {
        "acme-tls/1": []
      },
      "stapling": false,
      "cert": {
        "rsa": {
          "valid": {
            "from": "Thu, 17 Mar 2022 10:10:59 GMT",
            "until": "Wed, 15 Jun 2022 10:10:58 GMT"
          },
          "serial": "FA3948B936C1A04F8B216621C2E31D56864F",
          "sha256-fingerprint": "701b89007e1268286c87b111e90f3b33840fc6a2da00b6e6565ed969fa9f10c6"
        },
        "valid": {
          "from": "Thu, 17 Mar 2022 10:10:59 GMT",
          "until": "Wed, 15 Jun 2022 10:10:58 GMT"
        }
      },
      "renew-at": "Mon, 16 May 2022 17:22:59 GMT",
      "watched": true
    }
  ]
}

Hotovo, certifikát je funkční, o jeho správu se nám stará Apache a za dva měsíce ho automaticky obnoví. Nám už to celé stačí jen nějak rozumně monitorovat a přidat na server obsah.

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.