SSLmentor

Kvalitní TLS/SSL certifikáty pro webové stránky a internetové projekty.

Certbot DNS-01

Certbot DNS-01

Certum WildCard ACME SSL (Certbot + DNS-01)

Návod popisuje ruční vydání hvězdičkového WildCard SSL certifikátu přes ACME klienta Certbot s validací DNS-01. Postup je vhodný pro test nebo jednorázové vydání certifikátu, ne pro plně automatickou obnovu. V návodu je použit ACME certifikát od certifikační autority Certum. Použitý certifikát slouží pouze jako příklad – princip fungování i postup nasazení ACME jsou stejné u všech certifikačních autorit.

Základní pojmy

  • WildCard SSL – certifikát pro subdomény, například *.example.com.
  • Apex doména – samotná doména example.com. Wildcard ji nepokrývá, proto se do certifikátu přidává zvlášť.
  • DNS-01 – validace přes TXT záznam _acme-challenge.example.com.
  • EAB kid + hmac – External Account Binding (EAB) údaje od certifikační autority. Propojují Certbot s účtem nebo produktem.

V příkladech nahraďte example.com vlastní doménou.

Certbot v režimu --manual --preferred-challenges dns-01 neumí bez další automatizace sám měnit DNS TXT záznamy při RENEW. Pro produkční automatickou obnovu wildcard certifikátů doporučujeme například ACME klienta Lego s DNS API.

Registrace Certum ACME účtu

Pokud na serveru ještě není zaregistrovaný odpovídající Certum ACME účet, použijte přidělené EAB údaje. Před spuštěním nahraďte certum@example.com vlastním kontaktním e-mailem, KID hodnotou KID a HMAC tajným HMAC klíčem.

certbot register \
  --server https://acme.certum.pl/directory \
  --email certum@example.com \
  --agree-tos \
  --eab-kid 'KID' \
  --eab-hmac-key 'HMAC'
Příkaz / hodnota Co dělá / čím nahradit
certbot register Zaregistruje ACME účet.
--server Certum ACME endpoint.
--email Kontaktní e-mail.
--agree-tos Souhlas s podmínkami.
--eab-kid / --eab-hmac-key EAB údaje.

Workaround pro více Certum EAB účtů

›› Zobrazit/Skrýt sekci

Pokud Certbot odmítne registraci dalšího účtu pro stejný ACME server, dočasně odsuňte existující account adresáře, zaregistrujte nový účet a původní účty vraťte zpět. V registračním příkazu níže opět nahraďte certum@example.com, KID a HMAC vlastními hodnotami.

ACME_ACCOUNT_DIR="/etc/letsencrypt/accounts/acme.certum.pl/directory"
BACKUP_DIR="/root/certbot-certum-accounts-backup-$(date +%Y%m%d-%H%M%S)"

mkdir -p "$BACKUP_DIR"
find "$ACME_ACCOUNT_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$BACKUP_DIR"/ \;
Příkaz / hodnota Co dělá / čím nahradit
ACME_ACCOUNT_DIR Adresář s Certum ACME účty Certbotu.
BACKUP_DIR Dočasná záloha existujících účtů.
find ... mv Dočasně přesune existující účty mimo hlavní adresář.
certbot register \
  --server https://acme.certum.pl/directory \
  --email certum@example.com \
  --agree-tos \
  --eab-kid 'KID' \
  --eab-hmac-key 'HMAC'

Zjištění nového account ID a vrácení původních účtů:

ls -1 "$ACME_ACCOUNT_DIR"
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$ACME_ACCOUNT_DIR"/ \;
Příkaz / hodnota Co dělá / čím nahradit
ls -1 "$ACME_ACCOUNT_DIR" Vypíše nově vytvořené account ID.
find "$BACKUP_DIR" ... mv Vrátí původní účty zpět.

Vydání wildcard certifikátu

V CertManageru musí být deklarované obě domény: example.com i *.example.com. Před spuštěním nahraďte ACCOUNT_ID_Z_CERTBOTU ID účtu z výpisu Certbotu, example.com vlastní apex doménou a *.example.com wildcard doménou. Pokud používáte jen jeden správný ACME účet, lze parametr --account vynechat.

ACCOUNT_ID="ACCOUNT_ID_Z_CERTBOTU"

certbot certonly \
  --manual \
  --preferred-challenges dns-01 \
  --server https://acme.certum.pl/directory \
  --account "$ACCOUNT_ID" \
  --cert-name example.com-wildcard \
  -d example.com \
  -d '*.example.com'
Příkaz / hodnota Co dělá / čím nahradit
ACCOUNT_ID ID Certbot účtu, pokud je potřeba vybrat konkrétní účet.
certbot certonly Vydá certifikát bez automatické úpravy Apache.
--manual Ruční validace.
--preferred-challenges dns-01 Vynutí DNS TXT validaci.
--cert-name Název certifikátu v Certbotu.
-d Domény v certifikátu.

Hodnota --cert-name example.com-wildcard určuje název certifikátu v Certbotu. Doporučujeme ji upravit podle názvu vlastní domény.

DNS TXT záznamy

Certbot vypíše hodnoty, které je nutné vložit do DNS. Pro apex i wildcard může být potřeba zadat dva TXT záznamy se stejným názvem.

_acme-challenge.example.com TXT "HODNOTA_1_OD_CERTBOTU"
_acme-challenge.example.com TXT "HODNOTA_2_OD_CERTBOTU"
Příkaz / hodnota Co dělá / čím nahradit
_acme-challenge.example.com Název TXT záznamu pro ACME DNS-01 validaci.
HODNOTA_1 / HODNOTA_2 Přesné hodnoty zobrazené Certbotem. Obě musí být v DNS současně.

Obě hodnoty musí existovat současně. Nestačí jednou hodnotou nahradit druhou. U běžného hostingu počítejte přibližně s 30 až 60 minutami propagace záznamů do internetu.

dig TXT _acme-challenge.example.com +short

V dalším kroku ověříte, že jsou obě TXT hodnoty skutečně viditelné v DNS. Do té doby v Certbotu nepotvrzujte pokračování.

Kontrola DNS záznamů

Jakmile zadáte TXT hodnoty do DNS, ověřte jejich viditelnost nástrojem dig. Až když se vrací obě hodnoty, pokračujte v běžícím Certbot procesu. Před použitím příkazu nahraďte example.com vlastní doménou.

apt-get install dnsutils
dig TXT _acme-challenge.example.com +short
Příkaz / hodnota Co dělá / čím nahradit
apt-get install dnsutils Nainstaluje nástroj dig.
dig TXT _acme-challenge... Ověří TXT záznamy pro DNS-01 validaci.

Apache, webroot

Apache není použitý pro validaci wildcard certifikátu, ale je potřeba pro provoz webu a následné nasazení certifikátu.

›› Zobrazit/Skrýt sekci

Před spuštěním nahraďte hodnotu example.com v řádku DOMAIN="example.com" vlastní doménou bez hvězdičky. Proměnná $DOMAIN se použije pro webroot, Apache vhost a testovací stránku.

cd /var/www
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2

DOMAIN="example.com"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
Příkaz / hodnota Co dělá / čím nahradit
cd /var/www Přejde do adresáře pro webové soubory.
apt update / apt install Aktualizuje balíčky a nainstaluje Apache.
systemctl enable --now apache2 Zapne a spustí Apache.
DOMAIN="example.com" Nastaví vlastní doménu pro další příkazy.
mkdir/chown/chmod/echo Připraví webroot, práva a testovací stránku.

Vytvoření Apache HTTP virtual hostu


cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
    ServerName $DOMAIN
    ServerAlias *.$DOMAIN

    DocumentRoot /var/www/$DOMAIN/public
    <Directory /var/www/$DOMAIN/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
    CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF

a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
Příkaz / hodnota Co dělá / čím nahradit
cat > ... <<EOF Vytvoří Apache HTTP vhost.
ServerName / ServerAlias Nastaví hlavní doménu a případné subdomény pro HTTP vhost.
DocumentRoot Určuje adresář webu.
a2ensite Zapne vhost.
apache2ctl configtest Ověří konfiguraci.
curl -I Ověří HTTP odpověď.

 

Nasazení certifikátu do Apache

Před vytvořením HTTPS vhostu nahraďte example.com vlastní doménou ve jménu souboru, hodnotách ServerName, ServerAlias, cestách k webrootu i cestách k certifikátu. Cesta v SSLCertificateFile musí odpovídat hodnotě --cert-name z předchozího kroku.


cat > /etc/apache2/sites-available/example.com-le-ssl.conf <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com

    DocumentRoot /var/www/example.com/public
    <Directory /var/www/example.com/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com-wildcard/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com-wildcard/privkey.pem

    ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF

a2ensite example.com-le-ssl.conf
apache2ctl configtest
systemctl reload apache2

curl -I https://example.com
curl -I https://test.example.com
Příkaz / hodnota Co dělá / čím nahradit
cat > ...-le-ssl.conf Vytvoří Apache HTTPS vhost.
ServerName / ServerAlias Svazuje HTTPS vhost s apex doménou a wildcard subdoménami pokrytými certifikátem.
SSLCertificateFile Cesta k fullchain certifikátu Certbotu.
SSLCertificateKeyFile Cesta k privátnímu klíči Certbotu.
a2ensite / reload Zapne vhost a načte konfiguraci.
curl -I https://... Ověří HTTPS odpověď.

Renewal a omezení ručního postupu

Certifikát vydaný přes ruční DNS-01 validaci není vhodný pro bezobslužné AUTORENEW, protože při každé obnově vzniknou nové TXT hodnoty. Certbot je nebude umět sám zapsat do DNS bez hooku nebo DNS API integrace.

Pro produkční WildCard ACME SSL doporučujeme navazující návod ACME klient Lego + API DNS, kde Lego vytváří TXT záznamy přes webhostingové WAPI automaticky.

Ověřovací checklist

  • apache2ctl configtest vrací Syntax OK.
  • certbot certificates zobrazuje example.com-wildcard.
  • V DNS byly během validace zadané obě TXT hodnoty.
  • curl -I https://example.com odpovídá přes HTTPS.
  • Je zdokumentováno, že tento postup nemá plně automatický renewal.

Zpět na Nápovědu
Našli jste chybu nebo něčemu nerozumíte? Napište nám!

CA Sectigo
CA RapidSSL
CA Thawte
CA GeoTrust
CA DigiCert
CA Certum