Od nas: Tym wpisem/artykułem rozpoczynamy nowy cykl publikacji w naszym serwisie: HEXSSL Insight. Będą to obszerne artykuły zawierające naszą wiedzę popartą wieloma przykładami z naszego doświadczenia. Mamy nadzieję, że zawarte, w tych artykułach, informacje pozwolą na lepsze zrozumienie wszelkich aspektów związanych z szeroko pojętym bezpieczeństwem online.
Każda bezpieczna sesja HTTPS zaczyna się od jednego, fundamentalnego pytania: czy można zaufać stronie, z którą nawiązuję połączenie? Odpowiedź nie zależy wyłącznie od szyfrowania – kluczowe jest to, kto poświadczył tożsamość serwera. Ten mechanizm stanowi rdzeń infrastruktury PKI (Public Key Infrastructure), która tworzy i utrzymuje globalny łańcuch zaufania SSL/TLS.
W praktyce przeglądarka ufa stronom nie dlatego, że serwer posiada certyfikat, ale dlatego, że ten certyfikat został podpisany przez urząd certyfikacji (CA) znajdujący się w jej zaufanym magazynie (trust store). Jeśli przeglądarka lub system operacyjny zna i ufa danemu rootowi CA, a ten root pośrednio lub bezpośrednio potwierdził autentyczność certyfikatu serwera – połączenie jest uznane za bezpieczne.
Mechanizm ten gwarantuje trzy rzeczy:
Dopiero po spełnieniu tych warunków przeglądarka wyświetla symbol kłódki 🔒. Warto pamiętać, że samo szyfrowanie (HTTPS) bez zaufania nie oznacza bezpieczeństwa – serwer może korzystać z samopodpisanego certyfikatu (self-signed), którego nikt poza nim nie zweryfikował.
Spis Treści
Public Key Infrastructure to rozproszony system podmiotów, zasad i mechanizmów kryptograficznych, który umożliwia wzajemne potwierdzanie tożsamości.
Jego strukturę można przedstawić w formie trzech warstw:
Każdy certyfikat w łańcuchu zawiera podpis cyfrowy – hash swojej treści zaszyfrowany kluczem prywatnym wystawcy. Przeglądarka weryfikuje ten podpis za pomocą klucza publicznego z certyfikatu nadrzędnego. Proces powtarza się aż do roota, który jest samopodpisany i przechowywany lokalnie w systemie operacyjnym lub przeglądarce.
Jeżeli którykolwiek element łańcucha jest niepoprawny (np. brak intermediate lub błędny podpis), połączenie zostanie odrzucone.
Hierarchiczna struktura PKI zapewnia kontrolę i odporność. Rooty CA są fizycznie odseparowane, często przechowywane w specjalnych modułach HSM i aktywizowane jedynie przy wydawaniu nowych intermediates. Dzięki temu ryzyko kompromitacji klucza roota jest minimalne. Jeśli natomiast zostanie naruszony Intermediate CA, root może go unieważnić bez konieczności resetu całego ekosystemu.
Każdy certyfikat zawiera pola takie jak:
Administratorzy mogą przeglądać te pola lokalnie:
openssl x509 -in cert.pem -noout -text
Dzięki temu łatwo sprawdzić Issuer, algorytm, okres ważności oraz łańcuch podpisów.
Root CA to najwyższy poziom hierarchii PKI – „źródło prawdy”, od którego zaczyna się wszystko. Jest to certyfikat samopodpisany, który nie ma nadrzędnego wystawcy. Jego klucz publiczny zostaje wbudowany w system operacyjny lub przeglądarkę jako element zaufanego magazynu certyfikatów.
Rooty CA mają zazwyczaj długi okres ważności – 20 do 30 lat. W tym czasie wydają kilka pokoleń intermediates. Ich klucze prywatne są przechowywane w odseparowanych modułach HSM, a fizyczny dostęp jest ściśle kontrolowany. Z uwagi na ogromne zaufanie, jakim są obdarzone, rooty CA są aktywowane niezwykle rzadko – często tylko raz na rok lub dwa, w trakcie ceremonii wydania nowego Intermediate CA.
Każdy duży ekosystem utrzymuje własny root program:
Root CA musi spełnić szereg wymogów (bezpieczeństwo operacyjne, audyt WebTrust, compliance z CA/B Forum), aby zostać zaakceptowanym.
W 2024-2025 roku wielu dostawców certyfikatów (m.in. Sectigo) zaczęło migrację z historycznych rootów USERTrust RSA Root CA na nowe rooty R46/E46 z dłuższymi kluczami i algorytmem SHA-384. Dla administratorów oznacza to, że stary łańcuch może zostać zastąpiony nowym, a niewłaściwe zaufanie w starszych urządzeniach może powodować błędy walidacji.
Aby sprawdzić, z którego roota korzysta Twój certyfikat:
openssl s_client -connect example.com:443 -showcerts
lub skorzystaj z narzędzia HEXSSL SSL Checker, które automatycznie identyfikuje łańcuch i jego punkt zakotwiczenia (root anchor).
Intermediate CA (urząd pośredni) pełni rolę łącznika między rootem a certyfikatami końcowymi. To one faktycznie podpisują certyfikaty dla stron internetowych, API czy poczty. Dzięki temu root może pozostać offline, a infrastruktura może elastycznie wydawać i odnawiać certyfikaty.
Najczęstszy błąd wdrożeniowy to brak pełnego łańcucha pośrednich certyfikatów na serwerze. W rezultacie przeglądarka nie jest w stanie zbudować pełnej ścieżki zaufania i wyświetla błąd „incomplete chain”.
Konfiguracja poprawna dla Nginx:
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/domain.key;
Plik fullchain.pem musi zawierać najpierw certyfikat domeny, a następnie wszystkie intermediates aż do roota (z pominięciem samego roota).
W Apache analogicznie:
SSLCertificateFile /etc/ssl/certs/domain.crt
SSLCertificateChainFile /etc/ssl/certs/intermediate.crt
SSLCertificateKeyFile /etc/ssl/private/domain.key
Brak łańcucha można natychmiast zdiagnozować przy pomocy HEXSSL SSL Checker, który analizuje strukturę i poprawność certyfikatów pośrednich.
Intermediates mają zwykle okres ważności 3-7 lat, co pozwala na rotację i wprowadzanie nowych algorytmów. Po upływie tego czasu root CA wydaje nowy certyfikat pośredni – proces transparentny dla użytkowników, ale krytyczny dla ciągłości zaufania.
Gdy użytkownik wpisuje adres strony i nawiązywane jest połączenie HTTPS, przeglądarka nie ogranicza się do sprawdzenia, czy certyfikat jest obecny. Wykonuje szereg szczegółowych testów, które mają potwierdzić, że:
Proces walidacji można podzielić na kilka kroków:
Administratorzy mogą samodzielnie przeprowadzić test walidacji łańcucha:
openssl verify -CAfile chain.pem cert.pem
lub bezpośrednio z serwera:
openssl s_client -connect example.com:443 -showcerts -verify 5
Parametr -verify określa głębokość weryfikacji (ile ogniw ma łańcuch). Komenda wypisze pełną ścieżkę do root CA oraz status każdego ogniwa. Jeśli pojawia się błąd typu unable to get local issuer certificate lub self-signed certificate in chain, oznacza to, że serwer nie przesyła pełnego zestawu certyfikatów pośrednich.
Każdy ekosystem ma własny mechanizm walidacji:
ca-bundle.crt.cacerts.Dlatego konfiguracje działające w jednym środowisku mogą powodować błędy w innym. Zalecamy testowanie wdrożeń w kilku przeglądarkach i systemach.
Weryfikacja zaufania to nie tylko podpisy i daty. Certyfikat, który został wydany poprawnie, może w dowolnym momencie utracić ważność – np. gdy klucz prywatny wycieknie lub zostanie wydany omyłkowo. Dlatego istnieją mechanizmy revocation, które pozwalają sprawdzić, czy certyfikat został cofnięty przed upływem terminu ważności.
CRL to najstarszy i najprostszy mechanizm unieważniania. Urząd certyfikacji publikuje okresowo listę numerów seryjnych certyfikatów, które utraciły ważność. Każdy certyfikat zawiera atrybut CRL Distribution Points z adresem URL (HTTP lub LDAP), z którego można pobrać listę.
Sprawdzenie CRL lokalnie:
openssl crl -in crl.pem -noout -text
lub
openssl verify -crl_check -CAfile ca.crt cert.pem
Wady CRL:
Z tego powodu w praktyce CRL ustępuje miejsca OCSP.
OCSP to protokół, który umożliwia sprawdzenie statusu certyfikatu w czasie rzeczywistym. Zamiast pobierać całą listę, klient wysyła zapytanie do serwera OCSP urzędu certyfikacji, podając numer seryjny certyfikatu, a w odpowiedzi otrzymuje informację: good, revoked lub unknown.
Przykład zapytania z OpenSSL:
openssl ocsp -issuer intermediate.pem -cert cert.pem -url http://ocsp.sectigo.com
Aby przyspieszyć działanie i uniknąć blokad sieciowych, serwer WWW może sam dołączyć najnowszą odpowiedź OCSP do handshaku TLS. To tzw. OCSP Stapling. Przeglądarka nie musi wtedy kontaktować się z zewnętrznym serwerem OCSP – wystarczy podpisany status przekazany przez serwer.
Przykład konfiguracji dla Nginx:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/ca-bundle.crt;
resolver 8.8.8.8;
Zaleca się również włączenie rozszerzenia OCSP Must-Staple, które wymusza obecność odpowiedzi OCSP w każdej sesji TLS. Jeśli stapling jest nieaktywny – przeglądarka zgłasza błąd.
Choć te rozwiązania nie są jeszcze standardem powszechnym, pokazują kierunek: odchodzimy od ciężkich list CRL w stronę lekkich, aktualnych i automatycznych systemów walidacji.
Świat PKI jest żywy – rooty wygasają, pojawiają się nowe algorytmy, zmieniają się wymagania przeglądarek. Aby utrzymać kompatybilność, urzędy certyfikacji stosują cross-signing – czyli wydanie certyfikatu pośredniego podpisanego przez dwa różne rooty.
Załóżmy, że CA wprowadza nowy root, który nie jest jeszcze zaufany w starszych urządzeniach. Wydaje więc intermediate podpisany zarówno przez nowego, jak i starego roota. Dzięki temu nowsze systemy użyją nowego łańcucha, a starsze – starego. To zapewnia ciągłość zaufania.
Przykład praktyczny:
Let’s Encrypt stosował cross-signing między nowym rootem ISRG Root X1 a starszym DST Root CA X3, aby utrzymać wsparcie dla Androida 7 i starszych.
Cross-signing, choć potrzebny, może prowadzić do niejednoznaczności. Przeglądarka może zbudować więcej niż jeden możliwy łańcuch. Jeśli jeden z rootów zostanie unieważniony lub wygaśnie, część użytkowników zacznie otrzymywać błędy „certificate not trusted”. W przypadku migracji rootów – jak np. USERTrust RSA → R46/E46 (Sectigo) – problem jest podobny.
Nowy root nie zawsze znajduje się w starszych trust storach, dlatego CA utrzymuje przez pewien czas cross-signed intermediates. To okres przejściowy, w którym administratorzy powinni testować swoje serwery w obu wariantach.
My ze swojej strony zalecamy, aby przy każdej aktualizacji certyfikatu:
Załóżmy, że serwer prezentuje następujące certyfikaty:
OpenSSL zwróci:
depth=2 CN = USERTrust RSA Certification Authority
verify return:1
depth=1 CN = Sectigo RSA Domain Validation Secure Server CA
verify return:1
depth=0 CN = example.com
verify return:1
Status verify return:1 oznacza poprawną weryfikację wszystkich poziomów.
Jeśli zamiast tego pojawi się:
verify error:num=20:unable to get local issuer certificate
oznacza to, że lokalny system nie zna odpowiedniego roota lub intermediate nie został przesłany przez serwer.
Poza narzędziami typu openssl, najprostszym sposobem jest użycie HEXSSL SSL Checker. Analizuje on nie tylko poprawność łańcucha, ale także:
HEXSSL Checker generuje również raport z oceną bezpieczeństwa (A-F) i rekomendacjami poprawek. To narzędzie może być wykorzystane jako element audytu TLS w ramach polityki NIS2 lub ISO 27001.
W teorii wdrożenie certyfikatu SSL/TLS wydaje się proste – wystarczy zainstalować certyfikat, prywatny klucz i intermediate. W praktyce jednak nawet drobny błąd w konfiguracji może skutkować brakiem zaufania, ostrzeżeniem w przeglądarce lub całkowitym zablokowaniem dostępu do strony. Poniżej zestawiliśmy najczęstsze problemy obserwowane podczas audytów HEXSSL.
To zdecydowanie najczęstszy błąd, szczególnie w starszych instalacjach Apache, Tomcata czy load balancerach. Serwer prezentuje jedynie certyfikat domeny (leaf), ale nie przekazuje pełnego zestawu certyfikatów pośrednich.
Objaw:
Przeglądarka zgłasza błąd „certificate chain incomplete” lub „unable to get local issuer certificate”.
Konsekwencje:
Rozwiązanie:
Zawsze dostarczaj tzw. full chain – czyli certyfikat domeny wraz z intermediate w jednym pliku.
Dla Nginx:
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/domain.key;
Dla Apache:
SSLCertificateFile /etc/ssl/certs/domain.crt
SSLCertificateChainFile /etc/ssl/certs/intermediate.crt
Certyfikaty samopodpisane są użyteczne do testów i środowisk wewnętrznych, ale nie zapewniają zaufania zewnętrznego. Każda przeglądarka potraktuje taki certyfikat jako niezaufany.
Objaw:
Komunikat „Your connection is not private” (NET::ERR_CERT_AUTHORITY_INVALID).
Konsekwencje:
Rozwiązanie:
Używaj certyfikatów od uznanych CA – nawet darmowych Let’s Encrypt, o ile środowisko nie wymaga walidacji organizacyjnej (OV/EV). Dla serwisów komercyjnych rekomendujemy certyfikaty Sectigo OV lub EV z pełnym łańcuchem zaufania.
Od czasu wprowadzenia wymogu SAN przez CA/B Forum (2017), przeglądarki ignorują pole Common Name (CN) i opierają się wyłącznie na polu Subject Alternative Name.
Objaw:
Połączenie działa dla jednej domeny, ale nie dla subdomen lub aliasów.
Rozwiązanie:
Przed generacją CSR należy określić wszystkie nazwy, jakie będą obsługiwane przez serwer:
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[ dn ]
CN = www.example.com
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = www.example.com
DNS.2 = example.com
DNS.3 = api.example.com
Na naszej stronie znajdziesz Generator CSR online, który automatycznie tworzy plik CSR z poprawnym zestawem pól CN i SAN.
Certyfikaty mają ograniczoną ważność – maksymalnie 398 dni (1 rok + 33 dni). Wiele incydentów wynika z przeoczenia terminu odnowienia, szczególnie w środowiskach z dziesiątkami domen.
Objaw:
„Certificate has expired” lub „ERR_CERT_DATE_INVALID”.
Rozwiązanie:
Wprowadź monitoring i automatyzację.
Nasze narzędzie HEXSSL SSL Expiry Monitor pozwala monitorować ważność certyfikatów w wielu domenach i wysyłać alerty e-mail przed wygaśnięciem.
Choć certyfikat jest poprawny, część elementów strony (grafiki, JS, iframe) może być ładowana po HTTP. Przeglądarka ostrzega wtedy użytkownika lub blokuje treść.
Objaw:
„This page is not fully secure” lub ikona ⚠️ obok kłódki.
Rozwiązanie:
Wymusić HTTPS dla wszystkich zasobów:
Content-Security-Policy: upgrade-insecure-requests;
W przypadku WordPress można też wymusić protokół w konfiguracji wp-config.php lub użyć wtyczki Really Simple SSL.
Błąd ten pojawia się, gdy serwer prezentuje przestarzałą lub nieważną odpowiedź OCSP. Często wynika z braku aktualizacji lub błędów sieciowych.
Objaw:
„OCSP response invalid” lub „revocation check failed”.
Rozwiązanie:
Zresetować cache OCSP, wymusić pobranie nowej odpowiedzi i upewnić się, że ścieżka do pliku ssl_trusted_certificatewskazuje na aktualny CA bundle.
Administratorzy powinni okresowo sprawdzać swoje wdrożenia – nie tylko przy pierwszej instalacji, ale po każdej aktualizacji serwera, zmianie CA lub wdrożeniu nowego root chain.
Najprostsze testy można wykonać przy pomocy OpenSSL:
openssl s_client -connect domain.tld:443 -showcerts
openssl verify -CAfile ca-bundle.crt cert.pem
openssl ocsp -issuer intermediate.pem -cert cert.pem -url http://ocsp.sectigo.com
HEXSSL SSL Checker wykonuje wszystkie powyższe kroki automatycznie i prezentuje wynik w czytelnej formie:
Przykładowy wynik:
Czasami po odnowieniu certyfikatu przeglądarka korzysta z pamięci podręcznej i pokazuje błędny status lub nieprawidłowy łańcuch.
Rozwiązanie: wyczyścić cache SSL (certutil -urlcache * delete w Windows) lub przetestować w trybie incognito.
Android, iOS, Windows i Linux używają różnych zestawów zaufanych rootów. Certyfikat, który działa na macOS, może być odrzucony na Androidzie 7. W środowiskach produkcyjnych warto testować zgodność przynajmniej na 3 platformach.
Jeśli serwer obsługuje wiele domen, ale certyfikat nie jest przypisany do właściwego hosta w konfiguracji SNI, użytkownicy mogą widzieć błędny certyfikat.
Rozwiązanie:
server_name w Nginx,VirtualHost w Apache,Z naszego doświadczenia zalecamy przyjąć kilka kluczowych zasad, które minimalizują ryzyko błędów i zapewniają zgodność z regulacjami bezpieczeństwa (NIS2, eIDAS 2.0, ISO 27001).
Certyfikat to nie tylko „zielona kłódka”. Każdy element łańcucha musi być przemyślany – od wyboru CA po długość klucza i algorytm. Używaj tylko zaufanych CA, unikaj samopodpisanych certyfikatów i testuj chain po każdej aktualizacji.
Preferowane obecnie algorytmy:
Nie stosuj już SHA-1 ani RSA 1024 – są niezgodne z wymaganiami CA/B Forum.
Zautomatyzuj generację CSR, instalację i reload usług (nginx, apache). W przypadku dużych środowisk warto wdrożyć centralne rozwiązanie typu ACME client (np. certbot, acme.sh) z integracją API.
Nasze narzędzie HEXSSL SSL Expiry Monitor umożliwia dodanie wielu domen i monitorowanie ich ważności. Rekomendowane, przez nas, progi alertów:
Audyt powinien obejmować:
W naszej ofercie znajdziesz również usługi audytu SSL/TLS i certyfikatów dla środowisk serwerowych i chmurowych. O szczegóły zapytaj nasz dział sprzedaży.
Wraz z wejściem w życie dyrektywy NIS2 oraz rozporządzenia eIDAS 2.0, znaczenie certyfikatów SSL/TLS wzrosło z poziomu technicznego wymogu do poziomu obowiązku prawnego.
Wspieramy organizacje w dopasowaniu swojej infrastruktury TLS do wymagań NIS2 i eIDAS poprzez audyty, rekomendacje i narzędzia diagnostyczne (SSL Checker, OCSP Validator).
Łańcuch zaufania SSL/TLS to fundament globalnego bezpieczeństwa komunikacji w Internecie. Dzięki hierarchicznej strukturze PKI i rygorystycznym zasadom weryfikacji możliwe jest nie tylko szyfrowanie danych, ale przede wszystkim potwierdzenie tożsamości stron uczestniczących w transmisji. Każdy element łańcucha – od roota po certyfikat końcowy – pełni kluczową rolę w utrzymaniu tego zaufania. Jedno ogniwo błędne lub pominięte może doprowadzić do utraty wiarygodności całego systemu, błędów w przeglądarkach i realnych zagrożeń dla użytkowników.
W praktyce poprawne wdrożenie certyfikatów SSL/TLS wymaga nie tylko instalacji, ale również:
Wspieramy administratorów i firmy w tym procesie, dostarczając narzędzia, które upraszczają każdy etap cyklu życia certyfikatu – od generacji CSR po pełną walidację łańcucha i monitorowanie ważności.
1. Czym różni się Root CA od Intermediate CA?
Root CA to nadrzędny urząd certyfikacji, który podpisuje certyfikaty pośrednie (Intermediate). Intermediate CA z kolei wydaje certyfikaty końcowe dla domen lub organizacji. Root pozostaje offline i jest zakotwiczony w trust storze systemu, Intermediate działa w trybie operacyjnym.
2. Dlaczego przeglądarka pokazuje błąd „incomplete chain”?
Oznacza to, że serwer nie przekazuje pełnego zestawu certyfikatów pośrednich. Należy dodać plik fullchain.pem w konfiguracji serwera (w Nginx: ssl_certificate powinien wskazywać na certyfikat z intermediate).
3. Czy Let’s Encrypt jest tak samo bezpieczny jak płatne certyfikaty?
Pod względem szyfrowania – tak. Różnica polega na zakresie walidacji: Let’s Encrypt oferuje tylko DV (Domain Validation),
natomiast płatne certyfikaty OV/EV zapewniają potwierdzenie tożsamości organizacji i gwarancje finansowe.
4. Jak sprawdzić, z którego root CA pochodzi mój certyfikat?
Możesz użyć komendy:
openssl s_client -connect domena.pl:443 -showcerts
lub skorzystać z narzędzia HEXSSL SSL Checker, które automatycznie zidentyfikuje root i pełen chain.
5. Co zrobić, gdy przeglądarka nie ufa certyfikatowi mimo HTTPS?
Najczęściej oznacza to, że root CA nie znajduje się w lokalnym magazynie zaufania lub łańcuch jest niekompletny. Należy zweryfikować konfigurację chaina oraz aktualność CA bundle.
6. Jak często należy odnawiać certyfikat SSL?
Obecnie maksymalny okres ważności to 398 dni. Rekomenduje się odnowienie co 12 miesięcy i wdrożenie monitoringu automatycznego (np. HEXSSL SSL Expiry Monitor).
7. Czym jest OCSP Stapling i czy warto go włączyć?
OCSP Stapling pozwala serwerowi przekazywać przeglądarce najnowszą informację o statusie certyfikatu, bez konieczności kontaktu z serwerem CA. Zwiększa to wydajność i prywatność użytkownika. Zdecydowanie zalecane w każdej konfiguracji produkcyjnej.
8. Czy certyfikat EV daje większe bezpieczeństwo techniczne?
Nie – szyfrowanie jest takie samo jak w DV/OV. Różnica polega na głębokiej weryfikacji organizacji, co zwiększa zaufanie użytkowników i może mieć znaczenie dla wizerunku marki.
9. Co to znaczy, że certyfikat jest cross-signed?
To sytuacja, w której ten sam Intermediate CA jest podpisany przez dwa różne rooty. Stosuje się to przy migracji rootów, by zapewnić kompatybilność starszych urządzeń.
10. Jak HEXSSL pomaga w zarządzaniu SSL/TLS?
HEXSSL udostępnia zestaw profesjonalnych narzędzi: