EasyDeploy
Wróć do bloga
ssl tls certyfikaty security pki troubleshooting mtls

Dlaczego mój certyfikat klienta nie działa? Rozwiązywanie problemów z mTLS po stronie klienta

Autor: Łukasz Tomalczyk , założyciel EasyDeploy ·
Dlaczego mój certyfikat klienta nie działa? Rozwiązywanie problemów z mTLS po stronie klienta

Awaria certyfikatu serwerowego jest zwykle głośna i ogólna — “niezaufany”, czerwona kłódka. Awaria certyfikatu klienta w mTLS jest cichsza i bardziej specyficzna: zerwane połączenie, ogólny błąd 403, albo alert TLS bez wyjaśnienia. Sam certyfikat rzadko jest faktycznym problemem — to, jak jest prezentowany, zwykle jest.

Krok 1: Potwierdź, że klient faktycznie wysyła certyfikat

Zanim zaczniesz debugować certyfikat, potwierdź, że w ogóle bierze udział w handshake’u.

openssl s_client -connect api.example.com:443 -cert client.pem -key client-key.pem -CAfile ca.pem -state </dev/null

Uruchom tę samą komendę bez -cert/-key i porównaj oba wyniki. Jeśli serwer zachowuje się identycznie w obu przypadkach, klient nie prezentuje certyfikatu — to problem konfiguracji klienta (zła ścieżka, zła zmienna środowiskowa, biblioteka HTTP niepodpięta do wysyłania certyfikatu), a nie problem certyfikatu. Napraw to najpierw — wszystko poniżej zakłada, że certyfikat faktycznie dociera do serwera.

Krok 2: Zweryfikuj, że klucz prywatny faktycznie pasuje do certyfikatu

Najczęstsza cicha awaria. Niedopasowana para klucz/certyfikat nie daje żadnego opisowego błędu — handshake po prostu zawodzi.

openssl x509 -noout -modulus -in client.pem | openssl md5
openssl rsa -noout -modulus -in client-key.pem | openssl md5

Jeśli te dwa hashe się nie zgadzają, łączysz certyfikat ze złym kluczem — często efekt regeneracji jednej połowy pary i zapomnienia o redystrybucji drugiej.

Krok 3: Sprawdź Extended Key Usage (EKU)

openssl x509 -in client.pem -noout -text | grep -A1 "Extended Key Usage"

Szukasz TLS Web Client Authentication. Certyfikaty wygenerowane z szablonu certyfikatu serwerowego — bardzo łatwy błąd przy ręcznym generowaniu certów albo przy skrypcie generującym je z wewnętrznego CA — często mają zamiast tego TLS Web Server Authentication, albo w ogóle nie mają ograniczenia EKU. Część stosów TLS jest w tej kwestii pobłażliwa; restrykcyjne (a większość bram mTLS taka jest) odrzucają handshake wprost, z błędem, który rzadko wspomina EKU po nazwie.

Krok 4: Sprawdź, czy certyfikat wygasł — i sprawdź też CA klienta

openssl x509 -in client.pem -noout -dates
openssl x509 -in ca.pem -noout -dates

Ta sama zasada co przy troubleshootingu po stronie serwera: sprawdź cały łańcuch, nie tylko certyfikat liściowy. CA klienta, które wygasło albo zostało rotowane bez redystrybucji nowych certyfikatów klienta, sprawi, że zawiedzie każdy klient wystawiony pod starym CA.

Krok 5: Potwierdź, że serwer faktycznie ufa CA tego klienta

To sprawdzenie po stronie serwera, ale to najczęstsza pierwotna przyczyna, gdy kroki 1–4 są już wykluczone. Certyfikat klienta może być całkowicie ważny i mimo to zostać odrzucony, jeśli CA, które go podpisało, nie znajduje się na liście zaufanych CA po stronie serwera (SSLCACertificateFile, ConfigMap w Kubernetes używany do weryfikacji mTLS, bundle zaufanych CA w bramie API — dokładny mechanizm zależy od tego, co terminuje TLS).

openssl x509 -in client.pem -noout -issuer

Porównaj tego issuera z tym, czemu serwer faktycznie jest skonfigurowany ufać. Niedopasowanie w tym miejscu wygląda z perspektywy klienta identycznie jak każda inna awaria na tej liście — jedyny sposób, żeby je odróżnić, to sprawdzenie konfiguracji serwera wprost.

Krok 6: Wyklucz niejednoznaczność przy wielu certyfikatach

Jeśli środowisko klienta ma dostępny więcej niż jeden certyfikat — kilka wpisów w keystore, kilka certyfikatów zainstalowanych w przeglądarce, runner CI z certyfikatami pozostałymi po poprzednim zadaniu — potwierdź, że wybierany jest faktycznie ten właściwy. curl --cert i odpowiadające mu jawne flagi eliminują tę niejednoznaczność; przeglądarki i część SDK wybierają automatycznie i mogą wybrać źle.

Najczęstsze przyczyny, w kolejności jak często się potwierdzają

PrzyczynaJak sprawdzić
Niedopasowanie klucza i certyfikatuKrok 2 — porównanie hasha modulusu
Serwer nie ufa CA klientaKrok 5 — porównaj issuera z listą zaufanych CA serwera
Brakujące/złe Extended Key UsageKrok 3 — grep EKU certyfikatu
Klient w ogóle nie wysyła certyfikatuKrok 1 — diff handshake’ów z/bez -cert
Wygasły certyfikat klienta albo CA klientaKrok 4 — sprawdź daty obu
Wybrano zły certyfikat spośród kilkuKrok 6

Certyfikaty po stronie klienta zawodzą po cichu — to prawdziwy problem

Każda przyczyna powyżej ma jedną wspólną cechę: nic głośno nie ogłasza, która to jest. Awaria certyfikatu serwerowego przynajmniej mówi użytkownikowi, że coś jest nie tak; awaria certyfikatu klienta zwykle po prostu wygląda jak “żądanie nie zadziałało”. To kosztowne do debugowania na bieżąco, i dokładnie ten rodzaj problemu jest tani do zapobiegania — wiedza, jakie certyfikaty klienta istnieją, kto je wystawił, do jakiego CA się odwołują i kiedy wygasają, zanim czyjeś połączenie mTLS zacznie po cichu zawodzić. Ten problem inwentaryzacji i terminów ważności, dla każdego certyfikatu — klienta czy serwera — śledzi Certyfizer.

Najczęściej zadawane pytania

Dlaczego mój certyfikat klienta działa w curl, ale nie w przeglądarce (albo odwrotnie)?

Różne klienty inaczej obsługują wybór certyfikatu. curl używa dokładnie certyfikatu podanego przez --cert; przeglądarka wybiera spośród certyfikatów zainstalowanych w systemie albo w swoim keystore i może po cichu zaproponować zły certyfikat albo żaden, jeśli jest niejednoznaczność. Jeśli działa w curl, a nie w przeglądarce, sam certyfikat jest w porządku — problemem jest to, który certyfikat przeglądarka faktycznie prezentuje.

Jak sprawdzić, czy mój klucz prywatny pasuje do certyfikatu?

Porównaj hash modulusu obu: openssl x509 -noout -modulus -in client.pem | openssl md5 oraz openssl rsa -noout -modulus -in client-key.pem | openssl md5. Jeśli te dwa hashe się różnią, klucz i certyfikat do siebie nie pasują — to bardzo częsta przyczyna "certyfikat klienta nie działa", która nie daje żadnego użytecznego komunikatu błędu.

Czym jest pole Extended Key Usage i dlaczego ma znaczenie dla certyfikatów klienta?

Extended Key Usage (EKU) deklaruje, do czego certyfikat może być używany. Certyfikat klienta potrzebuje wpisu "TLS Web Client Authentication" (OID 1.3.6.1.5.5.7.3.2) w swoim EKU. Certyfikaty wygenerowane bez tego — częste, gdy ktoś użyje szablonu certyfikatu serwerowego — zostaną odrzucone przez restrykcyjne serwery, mimo że wszystkie inne pola wyglądają poprawnie.

Dlaczego serwer mówi, że nie otrzymał certyfikatu, mimo że go skonfigurowałem?

Zwykle jedna z trzech rzeczy: biblioteka kliencka w rzeczywistości nie dołącza certyfikatu do handshake'u (problem konfiguracji albo kodu, nie certyfikatu), serwer prosi o certyfikat klienta przez post-handshake / renegocjację, a klient tego nie obsługuje, albo trafiasz na inny endpoint albo ścieżkę load balancera niż ta skonfigurowana pod mTLS.

Czy certyfikat klienta może być ważny, a mimo to odrzucony, bo serwer nie ufa jego CA?

Tak, i to jedna z najczęstszych przyczyn. Certyfikat klienta może być całkowicie ważny, niewygasły, z poprawnym EKU — ale jeśli CA, które go podpisało, nie znajduje się na liście zaufanych CA po stronie serwera, serwer odrzuci handshake. To problem konfiguracji po stronie serwera, nie problem samego certyfikatu.

Jak krok po kroku zdiagnozować awarię handshake'u mTLS?

Zacznij od openssl s_client -connect host:443 -cert client.pem -key client-key.pem -CAfile ca.pem -state, który wypisuje każdy krok handshake'u. Porównaj to z prostym połączeniem bez -cert/-key, żeby zobaczyć dokładnie, gdzie te dwa scenariusze się rozjeżdżają — to mówi, czy klient w ogóle wysyła certyfikat i gdzie dokładnie serwer go odrzuca.

Powiązane artykuły