 Autor: [Robert Zasilny](/autorzy/robert-zasilny) Ekspert bezpieczeństwa i compliance · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Multi-domain SSL — SAN i certbot

# Multi-domain SSL z certbot — SAN, wildcard i auto-renewal

Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo

Jeden serwer, kilka domen, jeden certyfikat SSL. Certyfikaty SAN (Subject Alternative Name) pozwalają zabezpieczyć wiele domen i subdomen jednym certyfikatem Let's Encrypt — bezpłatnie, automatycznie odnawianym. Ten przewodnik pokazuje konfigurację certbot dla różnych scenariuszy: wiele domen, wildcard, kombinacja wildcard + SAN, deploy-hooks i monitoring wygaśnięcia.

## Certbot — instalacja i podstawy

\# Ubuntu / Debian — instalacja certbot i pluginu Nginx
sudo apt update && sudo apt install -y certbot python3-certbot-nginx

# CentOS / AlmaLinux / Rocky
sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginx

# Alternatywnie przez snap (zalecane przez Let's Encrypt)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# Sprawdź wersję
certbot --version

## Certyfikat SAN — wiele domen jednym poleceniem

Każda flaga `-d` dodaje kolejną domenę do pola SAN certyfikatu. Certbot automatycznie konfiguruje Nginx i ustawia przekierowanie HTTP → HTTPS:

\# Certyfikat SAN dla głównej domeny i subdomen
sudo certbot --nginx \\
  -d mojadomena.pl \\
  -d www.mojadomena.pl \\
  -d sklep.mojadomena.pl \\
  -d blog.mojadomena.pl \\
  --email admin@mojadomena.pl \\
  --agree-tos \\
  --no-eff-email

# Certyfikat SAN dla kilku różnych domen (multi-domain)
sudo certbot --nginx \\
  -d mojadomena.pl \\
  -d www.mojadomena.pl \\
  -d innafirma.com \\
  -d www.innafirma.com \\
  --email admin@mojadomena.pl \\
  --agree-tos

# Sprawdź wystawione certyfikaty
sudo certbot certificates

# Output:
# Certificate Name: mojadomena.pl
# Domains: mojadomena.pl www.mojadomena.pl sklep.mojadomena.pl blog.mojadomena.pl
# Expiry Date: 2026-07-10 (VALID: 89 days)
# Certificate Path: /etc/letsencrypt/live/mojadomena.pl/fullchain.pem
# Private Key Path: /etc/letsencrypt/live/mojadomena.pl/privkey.pem

## Wildcard SSL — certyfikat dla wszystkich subdomen

Certyfikat wildcard (`*.mojadomena.pl`) obejmuje wszystkie subdomeny jednego poziomu. Wymaga weryfikacji przez DNS-01 (nie HTTP-01) — musisz dodać rekord TXT do DNS. Wiele providerów DNS ma pluginy certbot do automatyzacji:

\# Wildcard + domena główna (oba naraz)
# Uwaga: \*.mojadomena.pl NIE obejmuje mojadomena.pl — dodaj osobno
sudo certbot certonly \\
  --manual \\
  --preferred-challenges dns \\
  -d "\*.mojadomena.pl" \\
  -d "mojadomena.pl" \\
  --email admin@mojadomena.pl \\
  --agree-tos

# Certbot wyświetli rekord TXT do dodania w DNS:
# Please deploy a DNS TXT record under the name:
# \_acme-challenge.mojadomena.pl
# with the following value:
# ABC123XYZ...
# Dodaj rekord → poczekaj na propagację → naciśnij Enter

# Automatyczna weryfikacja DNS przez plugin Cloudflare
sudo pip install certbot-dns-cloudflare

# Plik z API token Cloudflare (chmod 600!)
cat > /etc/letsencrypt/cloudflare.ini <<'EOF'
dns\_cloudflare\_api\_token = TWOJ\_API\_TOKEN\_CLOUDFLARE
EOF
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

sudo certbot certonly \\
  --dns-cloudflare \\
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \\
  -d "\*.mojadomena.pl" \\
  -d "mojadomena.pl" \\
  --email admin@mojadomena.pl \\
  --agree-tos

## Kombinacja wildcard + SAN — elastyczna konfiguracja

Wildcard nie obejmuje subdomen wielopoziomowych (`*.*.mojadomena.pl` nie jest obsługiwane przez Let's Encrypt). Dla takich przypadków łącz wildcard z konkretnymi wpisami SAN:

\# Wildcard + konkretne subdomeny drugiego poziomu
sudo certbot certonly \\
  --dns-cloudflare \\
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \\
  -d "\*.mojadomena.pl" \\
  -d "mojadomena.pl" \\
  -d "api.sklep.mojadomena.pl" \\
  -d "admin.sklep.mojadomena.pl"

# Wynikowy certyfikat SAN:
# DNS: \*.mojadomena.pl
# DNS: mojadomena.pl
# DNS: api.sklep.mojadomena.pl
# DNS: admin.sklep.mojadomena.pl

# Użyj certyfikatu w Nginx dla wszystkich wirtualnych hostów
# /etc/nginx/snippets/ssl-mojadomena.conf
ssl\_certificate     /etc/letsencrypt/live/mojadomena.pl/fullchain.pem;
ssl\_certificate\_key /etc/letsencrypt/live/mojadomena.pl/privkey.pem;
ssl\_trusted\_certificate /etc/letsencrypt/live/mojadomena.pl/chain.pem;

# Include w każdym vhoście
# include /etc/nginx/snippets/ssl-mojadomena.conf;

## Deploy-hooks — akcje po odnowieniu certyfikatu

\# Deploy-hook uruchamiany po KAŻDYM udanym odnowieniu
# Umieść skrypt w /etc/letsencrypt/renewal-hooks/deploy/

cat > /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh <<'EOF'
#!/bin/bash
# Reload Nginx po odnowieniu certyfikatu
systemctl reload nginx

# Jeśli używasz HAProxy lub innych serwerów
# systemctl reload haproxy

# Jeśli certyfikat jest kopiowany do innej lokalizacji
# cp /etc/letsencrypt/live/mojadomena.pl/fullchain.pem /etc/haproxy/certs/
# cat /etc/letsencrypt/live/mojadomena.pl/privkey.pem >> /etc/haproxy/certs/mojadomena.pl.pem

# Powiadomienie Discord
WEBHOOK\_URL="https://discord.com/api/webhooks/ID/TOKEN"
curl -s -X POST ${WEBHOOK\_URL} \\
  -H "Content-Type: application/json" \\
  -d "{\\"content\\": \\"SSL cert renewed for ${RENEWED\_DOMAINS} — valid 90 more days\\"}"
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-services.sh

# Test odnowienia (dry-run)
sudo certbot renew --dry-run

# Sprawdź status timera (systemd)
systemctl list-timers | grep certbot
systemctl status snap.certbot.renew.timer

## Monitoring wygaśnięcia certyfikatów

\# Skrypt monitorujący wygaśnięcie — /usr/local/bin/ssl-check.sh
#!/bin/bash
DOMAINS="mojadomena.pl innafirma.com sklep.mojadomena.pl"
WARN\_DAYS=14
ALERT\_WEBHOOK="https://discord.com/api/webhooks/ID/TOKEN"

for DOMAIN in ${DOMAINS}; do
  EXPIRY=$(echo | openssl s\_client -connect ${DOMAIN}:443 \\
    -servername ${DOMAIN} 2>/dev/null | \\
    openssl x509 -noout -enddate | cut -d= -f2)

  EXPIRY\_EPOCH=$(date -d "${EXPIRY}" +%s)
  NOW\_EPOCH=$(date +%s)
  DAYS\_LEFT=$(( (${EXPIRY\_EPOCH} - ${NOW\_EPOCH}) / 86400 ))

  echo "${DOMAIN}: ${DAYS\_LEFT} days until expiry (${EXPIRY})"

  if \[ ${DAYS\_LEFT} -lt ${WARN\_DAYS} \]; then
    curl -s -X POST ${ALERT\_WEBHOOK} \\
      -H "Content-Type: application/json" \\
      -d "{\\"content\\": \\"ALERT: SSL cert for ${DOMAIN} expires in ${DAYS\_LEFT} days!\\"}"
  fi
done

# Uruchamiaj codziennie przez cron
# 0 9 \* \* \* /usr/local/bin/ssl-check.sh >> /var/log/ssl-check.log 2>&1

# Sprawdź certyfikat lokalnie (z pliku PEM)
openssl x509 -in /etc/letsencrypt/live/mojadomena.pl/cert.pem -noout -dates -text | grep -E "Subject:|DNS:|Not After"

## Konwersja formatów certyfikatów

Format

Rozszerzenia

Używany przez

Polecenie konwersji z PEM

PEM

.pem, .crt, .cer, .key

Nginx, Apache, Linux

— (format natywny certbot)

DER

.der, .cer

Java, Android, niektóre urządzenia

openssl x509 -in cert.pem -outform DER -out cert.der

PKCS#12 / PFX

.pfx, .p12

Windows IIS, Azure, .NET

openssl pkcs12 -export -out cert.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem

PKCS#7

.p7b, .p7c

Windows, Java keystores

openssl crl2pkcs7 -nocrl -certfile fullchain.pem -out cert.p7b

\# Konwersja PEM → PFX (dla IIS / Azure)
DOMAIN="mojadomena.pl"
LIVE="/etc/letsencrypt/live/${DOMAIN}"

openssl pkcs12 -export \\
  -out /tmp/${DOMAIN}.pfx \\
  -inkey ${LIVE}/privkey.pem \\
  -in ${LIVE}/cert.pem \\
  -certfile ${LIVE}/chain.pem \\
  -name "${DOMAIN}"
# Hasło eksportu: wpisz i zapamiętaj

# Konwersja PEM → DER (dla Java / Android)
openssl x509 \\
  -in ${LIVE}/cert.pem \\
  -outform DER \\
  -out /tmp/${DOMAIN}.der

# Weryfikacja certyfikatu PFX
openssl pkcs12 -in /tmp/${DOMAIN}.pfx -noout -info

## Najczęstsze pytania

Czym jest certyfikat SAN i czym różni się od wildcard? +

SAN (Subject Alternative Name) to certyfikat SSL obejmujący wiele konkretnych domen wymienionych w polu SAN: np. mojadomena.pl, www.mojadomena.pl, sklep.mojadomena.pl, innafirma.com. Wildcard (\*.mojadomena.pl) obejmuje wszystkie subdomeny jednego poziomu — ale nie samą domenę główną bez www. Certbot (Let's Encrypt) obsługuje oba: SAN przez -d domain1 -d domain2, wildcard przez -d \*.mojadomena.pl (wymaga weryfikacji DNS-01). Oba typy są darmowe przez Let's Encrypt i ważne 90 dni.

Jak certbot odnawia certyfikaty automatycznie? +

Certbot instaluje systemd timer (lub wpis cron) który uruchamia certbot renew dwa razy dziennie. Odnowienie jest próbowane gdy certyfikat ma mniej niż 30 dni ważności. Po udanym odnowieniu certbot uruchamia deploy-hook — zwykle restart nginx lub apache. Sprawdź timer: systemctl list-timers | grep certbot. Testuj odnowienie bez faktycznej zmiany: certbot renew --dry-run.

Jak sprawdzić datę wygaśnięcia certyfikatu SSL przez wiersz poleceń? +

Przez OpenSSL: echo | openssl s\_client -connect mojadomena.pl:443 -servername mojadomena.pl 2>/dev/null | openssl x509 -noout -dates. Wynik to notBefore i notAfter. Lokalnie dla certyfikatu z pliku: openssl x509 -in /etc/letsencrypt/live/mojadomena.pl/cert.pem -noout -dates. Certbot też pokazuje daty: certbot certificates. Zewnętrznie monitoruj przez SSL Labs (ssllabs.com/ssltest), UptimeRobot (SSL alert) lub własny skrypt cron z openssl.

Jak przekonwertować certyfikat Let's Encrypt do formatu PFX/P12 dla Windows? +

Certbot przechowuje certyfikaty jako PEM. Konwersja do PKCS#12 (PFX/P12) przez OpenSSL: openssl pkcs12 -export -out cert.pfx -inkey /etc/letsencrypt/live/domain/privkey.pem -in /etc/letsencrypt/live/domain/cert.pem -certfile /etc/letsencrypt/live/domain/chain.pem. Zostaniesz poproszony o hasło eksportu. Format PFX jest wymagany przez IIS (Windows Server), Azure App Service i niektóre urządzenia sieciowe.

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z pełną kontrolą nad SSL — instaluj własne certyfikaty i konfiguruj Nginx

VPS

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikr.us

Tani VPS do testów certbot i konfiguracji multi-domain SSL

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting z darmowym SSL Let's Encrypt — auto-odnawianie bez konfiguracji

Auto-SSL

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [Let's Encrypt — automatyzacja certyfikatów SSL](/baza-wiedzy/ssl-lets-encrypt-automatyzacja)
-   [OpenSSL — generowanie certyfikatów i kluczy](/baza-wiedzy/openssl-certyfikaty-konfiguracja)
-   [Nginx — konfiguracja virtual hostów](/baza-wiedzy/nginx-vhost-konfiguracja)
-   [DNS troubleshooting — dig, nslookup i propagacja](/baza-wiedzy/dns-troubleshooting-narzedzia)
-   [Wszystkie artykuły](/baza-wiedzy/)