Let's Encrypt Wildcard certyfikaty — certbot i DNS challenge
Wildcard vs standardowy certyfikat SSL
Standardowy certyfikat SSL (DV) z Let's Encrypt obejmuje jedną domenę lub kilka
jawnie wymienionych (SAN). Certyfikat wildcard (*.domena.pl)
obejmuje
wszystkie subdomeny pierwszego poziomu: www.domena.pl, sklep.domena.pl,
api.domena.pl itd. — w ramach jednego certyfikatu.
| Typ | Obejmuje | Weryfikacja | Cena |
|---|---|---|---|
| DV (standardowy) | Jedna domena + www | HTTP-01 lub DNS-01 | Darmowy (Let's Encrypt) |
| Wildcard *.domena.pl | Wszystkie subdomeny | TYLKO DNS-01 | Darmowy (Let's Encrypt) |
| OV / EV | Wybrane domeny | Weryfikacja organizacji | Płatny (CA komercyjne) |
Powiązane tematy: automatyzacja Let's Encrypt, konfiguracja Nginx vhost, Cloudflare z hostingiem oraz SPF/DKIM/DMARC konfiguracja. Do wyboru hostingu z darmowym SSL sprawdź kalkulator kosztów.
Dlaczego wildcard wymaga DNS-01?
Let's Encrypt wymaga DNS challenge dla certyfikatów wildcard, ponieważ nie można
zweryfikować własności *.domena.pl przez żądanie HTTP (nie wiadomo które subdomeny
istnieją). DNS-01 polega na dodaniu rekordu TXT _acme-challenge.domena.pl do DNS
— dowód kontroli nad całą domeną.
Instalacja Certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot
# Lub przez snap (najnowsza wersja)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot Dla DNS-01 potrzebujesz wtyczki DNS odpowiedniej do twojego dostawcy DNS:
# Cloudflare
sudo apt install python3-certbot-dns-cloudflare
# lub: pip3 install certbot-dns-cloudflare
# DigitalOcean
pip3 install certbot-dns-digitalocean
# Route53 (AWS)
pip3 install certbot-dns-route53
# Inne (OVH, Hetzner, Gandi) — szukaj certbot-dns-PROVIDER
# Pełna lista: https://certbot.eff.org/docs/using.html#dns-plugins Wildcard z Cloudflare DNS — krok po kroku
1. Konfiguracja API token Cloudflare
# Stwórz plik z tokenem
sudo mkdir -p /etc/letsencrypt/credentials
sudo nano /etc/letsencrypt/credentials/cloudflare.ini # cloudflare.ini
dns_cloudflare_api_token = TWOJ_CLOUDFLARE_API_TOKEN sudo chmod 600 /etc/letsencrypt/credentials/cloudflare.ini Token Cloudflare: Dashboard → My Profile → API Tokens → Create Token → Template "Edit zone DNS" → ogranicz do swojej domeny.
2. Wydanie certyfikatu wildcard
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/credentials/cloudflare.ini \
-d "domena.pl" \
-d "*.domena.pl"
Certbot automatycznie doda rekord TXT _acme-challenge.domena.pl do DNS Cloudflare,
poczeka na propagację (domyślnie 10 sekund), zweryfikuje i wyda certyfikat.
Wildcard bez wtyczki DNS — ręczny DNS challenge
Jeśli twój dostawca DNS nie ma wtyczki Certbot, użyj trybu --manual:
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d "domena.pl" \
-d "*.domena.pl" Certbot wyświetli instrukcję — ręcznie dodasz rekord TXT w panelu DNS:
Please deploy a DNS TXT record under the name:
_acme-challenge.domena.pl
with the following value:
AbCdEfGhIjKlMnOpQrStUvWxYz1234567890abc
Press Enter to Continue Uwaga: Tryb manual nie obsługuje automatycznego odnawiania — musisz powtarzać ten proces co 90 dni. Użyj wtyczki DNS jeśli możliwe.
Konfiguracja Nginx z certyfikatem wildcard
server {
listen 443 ssl http2;
server_name domena.pl www.domena.pl sklep.domena.pl api.domena.pl;
ssl_certificate /etc/letsencrypt/live/domena.pl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domena.pl/privkey.pem;
# Nowoczesne ustawienia SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
include /etc/letsencrypt/options-ssl-nginx.conf;
} Automatyczne odnawianie
# Sprawdź czy timer systemd działa
sudo systemctl status certbot.timer
# Lub cron (starsze systemy)
sudo crontab -l
# 0 12 * * * /usr/bin/certbot renew --quiet
# Test odnawiania (dry run — nie pobiera nowego certyfikatu)
sudo certbot renew --dry-run
# Wymuś odnawianie (jeśli <30 dni do wygaśnięcia)
sudo certbot renew --force-renewal Let's Encrypt certyfikaty ważne są 90 dni. Certbot automatycznie odnawia gdy zostaje mniej niż 30 dni. Dla wildcard z Cloudflare — odnowienie w pełni automatyczne (nowy TXT rekord jest dodawany przez API).
Certyfikat multi-domain (SAN)
Alternatywa dla wildcard — certyfikat pokrywający kilka konkretnych domen:
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/credentials/cloudflare.ini \
-d "domena.pl" \
-d "www.domena.pl" \
-d "sklep.domena.pl" \
-d "api.domena.pl" \
-d "innादomain.pl" Limit Let's Encrypt: maksymalnie 100 domen w jednym certyfikacie SAN i 50 certyfikatów tygodniowo per rejestrowana domena.
Lokalizacja plików certyfikatu
/etc/letsencrypt/live/domena.pl/
├── cert.pem # certyfikat końcowy
├── chain.pem # łańcuch pośredni CA
├── fullchain.pem # cert.pem + chain.pem (używaj tego w Nginx/Apache)
└── privkey.pem # klucz prywatny (chmod 600, tylko root) # Sprawdź datę wygaśnięcia
sudo certbot certificates
# Lub bezpośrednio
openssl x509 -enddate -noout -in /etc/letsencrypt/live/domena.pl/fullchain.pem