HSTS: bezpieczna konfiguracja domeny krok po kroku

Jak skonfigurować HSTS dla domeny? To pytanie wraca wszędzie tam, gdzie priorytetem jest bezpieczeństwo, wydajność i SEO. Jeśli chcesz, by Twoja witryna była ładowana wyłącznie przez HTTPS, a przeglądarki twardo egzekwowały to wymaganie, nagłówek HSTS jest jednym z najprostszych i najskuteczniejszych sposobów. Poniżej znajdziesz praktyczny przewodnik z krokami, przykładami i pułapkami, które warto znać, zanim włączysz tę politykę na produkcji.

Czym jest HSTS i dlaczego warto?

HSTS to dyrektywa w nagłówku HTTP, która mówi przeglądarce: “Łącz się z tą domeną tylko po HTTPS”.

HSTS (HTTP Strict Transport Security) to mechanizm bezpieczeństwa definiowany w RFC 6797. Działa po stronie przeglądarki: jeśli strona zwróci nagłówek Strict-Transport-Security, przeglądarka zapamięta politykę i przy kolejnych wizytach automatycznie wymusi połączenie szyfrowane.

Co to daje w praktyce:

  • Chroni przed atakami typu SSL stripping i man-in-the-middle.
  • Minimalizuje ryzyko przypadkowego łączenia się po HTTP.
  • Może poprawić Core Web Vitals i SEO (mniej przekierowań, spójne adresy).
  • Upraszcza politykę linkowania (nie martwisz się, że ktoś doda http:// przez pomyłkę).

Jak wygląda przykładowy nagłówek:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Najważniejsze elementy:

  • max-age: czas w sekundach, przez jaki przeglądarka ma pamiętać politykę (np. 31536000 = 1 rok).
  • includeSubDomains: obejmuje wszystkie subdomeny (np. blog.twojadomena.pl).
  • preload: zgoda na dodanie domeny do listy preloading w przeglądarkach (więcej o tym niżej).

Warunki wstępne i najczęstsze pułapki

Zadbaj o poprawny HTTPS wszędzie, zanim włączysz HSTS z includeSubDomains i preload.

Zanim wdrożysz HSTS:

  • Upewnij się, że certyfikat SSL/TLS jest ważny, obejmuje domenę i subdomeny (jeśli planujesz includeSubDomains) i jest automatycznie odnawiany.
  • Włącz stałe przekierowanie 301 z HTTP do HTTPS dla całej domeny.
  • Usuń mixed content (zasoby po HTTP osadzone na stronach HTTPS).
  • Zidentyfikuj subdomeny, które nie powinny lub nie mogą działać po HTTPS (np. stare systemy, niestandardowe porty, niektóre usługi mailowe). includeSubDomains zablokuje je użytkownikom przeglądarek wspierających HSTS.
  • Nie spiesz się z preload, jeśli nie masz pewności, że wszystkie subdomeny obsługują HTTPS. Z preloadingiem prawie nie ma odwrotu.

Typowe błędy:

  • Zbyt długi max-age na starcie (zablokujesz sobie drogę odwrotu).
  • Brak nagłówka na wersji www lub apex (bez “preload” nie spełnisz wymagań listy).
  • Wysyłanie HSTS po HTTP (przeglądarki to ignorują; nagłówek ma sens tylko po HTTPS).
  • Dodanie “preload” przed testami (ryzyko trwałych problemów).

Jak skonfigurować HSTS dla domeny? — przewodnik krok po kroku

Najpierw test na krótkim max-age, dopiero potem pełna produkcja z includeSubDomains i preload.

Krok 1. Wybierz bezpieczny max-age na start

  • Zacznij od 300–86400 sekund (5 minut do 1 dnia) na środowisku testowym lub ograniczonym ruchu.
  • Jeśli wszystko działa, podnieś do 15552000 (180 dni) lub 31536000 (1 rok).
  • W praktyce standardem jest 31536000.

Krok 2. Zdecyduj o includeSubDomains i preload

  • includeSubDomains włączaj tylko, gdy wszystkie subdomeny są gotowe na HTTPS.
  • preload włącz dopiero, gdy masz: 1) max-age ≥ 31536000, 2) includeSubDomains, 3) preload w nagłówku, 4) stałe przekierowanie z HTTP do HTTPS dla całej domeny i subdomen, 5) poprawne certyfikaty.

Krok 3. Wdrażaj stopniowo

  • Włącz najpierw bez includeSubDomains i preload.
  • Sprawdź logi błędów, raporty monitoringu, narzędzia typu securityheaders.com.
  • Po kilku dniach bez problemów – dodaj includeSubDomains.
  • Po kolejnych testach – rozważ preload.

Krok 4. Konfiguracja na serwerze lub w CDN
Poniżej przykładowe ustawienia. Zastosuj je tylko na HTTPS.

  • Nginx (w bloku server dla 443):
    add_header Strict-Transport-Security “max-age=31536000; includeSubDomains; preload” always;

    Uwaga: “always” sprawia, że nagłówek będzie dodany także na odpowiedzi 4xx/5xx.

  • Apache (httpd.conf lub .htaccess, VirtualHost na 443):
    Header always set Strict-Transport-Security “max-age=31536000; includeSubDomains; preload”

    Upewnij się, że moduł headers jest włączony (LoadModule headers_module modules/mod_headers.so).

  • Cloudflare (Transform Rules lub Zarządzanie nagłówkami; ewentualnie Strict-Transport-Security w ustawieniach SSL/TLS):
    Ustaw “Always Use HTTPS” i włącz HSTS z odpowiednim max-age, includeSubDomains, preload.
    Dodatkowo skonfiguruj “Automatic HTTPS Rewrites”, aby zredukować mixed content.

  • IIS (web.config w witrynie HTTPS):
    W sekcji <system.webServer><httpProtocol><customHeaders> dodaj:
    <add name=“Strict-Transport-Security” value=“max-age=31536000; includeSubDomains; preload” />

  • Aplikacje (np. Express.js, Django, Laravel):
    Użyj middleware: helmet.hsts w Node.js, SecurityMiddleware w Django, pakietów do nagłówków w Laravel.
    Upewnij się, że serwer brzegowy (reverse proxy/CDN) nie nadpisuje nagłówka.

Testowanie i weryfikacja

Sprawdź nagłówek lokalnie, zewnętrznie i w różnych przeglądarkach.

  • curl (szybka weryfikacja):
    curl -s -D- https://twojadomena.pl -o /dev/null | grep -i strict-transport-security

  • Nagłówki i oceny bezpieczeństwa:

  • Przeglądarki i cache:

    • Pamiętaj, że HSTS jest cache’owany w profilu przeglądarki.
    • Testuj w czystym profilu/trybie prywatnym i na innym urządzeniu.
    • Jeśli używasz CDN, odczekaj na propagację i wyczyść cache.

Preload: kiedy, jak i czego się wystrzegać

Preload to “twardy” tryb HSTS — przeglądarki wymuszają HTTPS, nawet przy pierwszej wizycie.

Zwykły HSTS wymaga przynajmniej jednej wizyty po HTTPS, aby przeglądarka zapisała politykę. Preload eliminuje ten warunek: domena trafia do wbudowanej listy w przeglądarkach i od razu wymusza HTTPS.

Aby zakwalifikować domenę:

  • Nagłówek na apex i wszystkich subdomenach: max-age ≥ 31536000, includeSubDomains, preload.
  • Stałe przekierowanie 301 z HTTP do HTTPS dla całej domeny.
  • Brak wyjątków (np. subdomena po HTTP).
  • Zgłoszenie w hstspreload.org i pozytywna weryfikacja.

Uwaga praktyczna:

  • Dodanie do listy trwa, a usunięcie jest trudne i powolne.
  • Jeśli chociaż jedna subdomena nie może działać po HTTPS, nie używaj preload.
  • Najpierw zakończ pełną migrację do HTTPS (w tym systemy wewnętrzne, jeśli są publicznie dostępne).

Cofanie lub zmiana ustawień HSTS

Raz ustawiony długi max-age będzie respektowany do jego wygaśnięcia — zmiany działają z opóźnieniem.

Co zrobić, gdy chcesz złagodzić politykę:

  • Zmień max-age na mniejszy (np. z 31536000 na 300) i odczekaj, aż większość użytkowników odświeży politykę.
  • Aby wyłączyć HSTS, ustaw max-age=0 (przeglądarki usuną politykę przy kolejnej wizycie po HTTPS).
  • Jeśli domena jest na preload liście, złagodzenie lokalne nie wystarczy — musisz zgłosić prośbę o usunięcie w hstspreload.org (to może trwać tygodnie).

Dobre praktyki:

  • Zanim podniesiesz max-age do 1 roku, utrzymuj HSTS przez kilka tygodni na krótszym TTL.
  • Dokumentuj zmiany i powiadamiaj zespoły odpowiedzialne za subdomeny i usługi.

Praktyczne porady i dobre praktyki

HSTS jest proste w konfiguracji, ale wymaga dyscypliny w utrzymaniu.

  • Środowiska testowe i staging: nie dodawaj ich do preload i nie używaj includeSubDomains, jeśli współdzielą domenę z produkcją. Najlepiej używaj osobnych domen testowych.
  • Automatyzacja: połącz odnowienia certyfikatów (np. ACME/Let’s Encrypt) z monitoringiem HSTS i testami po wdrożeniu.
  • Monitoring: skonfiguruj alerty na brak lub zmianę nagłówka Strict-Transport-Security.
  • Mixed content: rozważ Content-Security-Policy z upgrade-insecure-requests, aby automatycznie podnosić zasoby HTTP do HTTPS.
  • SEO: ustaw kanoniczne adresy na wersję HTTPS, w Google Search Console dodaj właściwość HTTPS.
  • CDN i reverse proxy: upewnij się, że HSTS nie jest usuwany po drodze.
  • Zgodność: sprawdź, czy serwisy legacy (np. stare subdomeny, zasoby plikowe) nie wymagają HTTP. Jeśli tak — nie używaj includeSubDomains ani preload, dopóki nie zmodernizujesz tych usług.
  • Wielodomenowość: dla domen międzynarodowych (np. .pl, .com) skonfiguruj HSTS osobno i testuj każdą.
  • E-maile i MTA-STS: pamiętaj, że HSTS dotyczy HTTP(S), a nie SMTP. Dla poczty rozważ MTA-STS, TLS-RPT i DANE.

FAQ: szybkie odpowiedzi

Krótko i na temat — najczęstsze pytania o HSTS.

  • Czy mogę dodać HSTS tylko na części serwisu?
    Technicznie tak, ale to słabe podejście. HSTS powinien obowiązywać całą domenę. Przeglądarki reagują na bazie domeny, nie pojedynczych ścieżek.

  • Czy HSTS działa, gdy ktoś wpisze http:// przed pierwszą wizytą?
    Nie, chyba że domena jest na liście preload. Inaczej pierwszy kontakt może iść po HTTP, a dopiero potem HSTS zadziała.

  • Jak szybko działa zmiana nagłówka?
    Zależy od max-age zapisanej w przeglądarce użytkownika. Zmiany nie są natychmiastowe. Dlatego warto testować na krótkim TTL.

  • Jak wyłączyć HSTS?
    Ustaw max-age=0 i poczekaj, aż użytkownicy odświeżą politykę. Jeśli jesteś na preload, zgłoś usunięcie w hstspreload.org.

  • Jaki max-age jest zalecany?
    Docelowo 31536000 (1 rok). Na start wybierz niższy (np. 1 dzień), obserwuj i stopniowo podnoś.

  • Czy konieczne jest includeSubDomains?
    Nie, ale to najlepsza ochrona, jeśli WSZYSTKIE subdomeny są gotowe na HTTPS. W przeciwnym razie możesz zablokować dostęp do części usług.

  • Czy HSTS wpływa na wydajność?
    Pozytywnie — przeglądarka pomija krok HTTP i od razu łączy się przez HTTPS, redukując liczbę przekierowań.

  • Co z serwerami API i klientami niestrumieniowymi?
    Przeglądarki respektują HSTS. Klienci API i narzędzia CLI nie zawsze. Po stronie serwera nadal wymuszaj HTTPS i blokuj HTTP.

Podsumowanie i rekomendowany schemat wdrożenia

Testuj krótko, wdrażaj świadomie, a na końcu włącz includeSubDomains i preload.

Rekomendowany plan:

  • Krok 1: Napraw mixed content, włącz 301 z HTTP do HTTPS, sprawdź certyfikaty na wszystkich subdomenach.
  • Krok 2: Włącz HSTS z krótkim max-age bez includeSubDomains i bez preload.
  • Krok 3: Monitoruj i testuj. Jeśli jest stabilnie — podnieś max-age do 31536000.
  • Krok 4: Dodaj includeSubDomains, przetestuj subdomeny.
  • Krok 5: Jeśli cała domena jest gotowa — dodaj preload i zgłoś domenę na hstspreload.org.

Wdrażając te kroki, zyskasz silne bezpieczeństwo na poziomie transportu, mniejszą liczbę błędów związanych z protokołem i spójny, nowoczesny profil witryny w oczach użytkowników i wyszukiwarek. Zrób to raz, ale porządnie — i pamiętaj o utrzymaniu oraz monitoringu, bo to one decydują, czy HSTS będzie Twoim sprzymierzeńcem, a nie źródłem niespodzianek.

Kacper Jedynak

Zostaw swój numer - oddzwonię

Cześć! Zadzwoń +48 572 651 439 lub napisz lub zostaw numer telefonu, a oddzwonię w ciągu 1h i porozmawiamy o ofercie.

Picture of Łukasz Janeczko

Łukasz Janeczko

Programista - DropDigital.pl