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.
Co se dozvíte v článku
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.
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:
# 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.