{"id":13546,"date":"2026-09-02T13:14:18","date_gmt":"2026-09-02T11:14:18","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/tls-certificate-handshake-inspector\/"},"modified":"2026-09-02T13:14:18","modified_gmt":"2026-09-02T11:14:18","slug":"tls-certificate-handshake-inspector","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/","title":{"rendered":"Inspektor certyfikatu i uzgadniania TLS"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">K\u0142\u00f3dka w przegl\u0105darce m\u00f3wi tylko, \u017ce co\u015b zosta\u0142o zweryfikowane. To narz\u0119dzie otwiera z tego serwera po\u0142\u0105czenie TLS z hostem, z nazw\u0105 hosta jako SNI, i odczytuje certyfikat, \u0142a\u0144cuch i wa\u017cno\u015b\u0107, klucz, wynegocjowany protok\u00f3\u0142 i szyfr. Nast\u0119pnie pr\u00f3buje kolejno TLS 1.0, 1.1, 1.2 i 1.3, aby sprawdzi\u0107, co serwer akceptuje. \u017b\u0105danie HTTP nie jest wysy\u0142ane.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"tc-host\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Nazwa hosta (opcjonalnie z :portem, 443 lub 8443)<\/label><br \/>\n        <input id=\"tc-host\" type=\"text\" value=\"example.com\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Z tego serwera do podanego hosta trafia do sze\u015bciu uzgodnie\u0144 TLS, \u017cadne z nich bez \u017c\u0105dania HTTP. Hosty w sieciach prywatnych, loopback i link-local s\u0105 odrzucane. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci.<\/p>\n<p>    <button id=\"tc-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Sprawd\u017a certyfikat<\/button><\/p>\n<div id=\"tc-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Granice, o kt\u00f3rych warto wiedzie\u0107: sprawdzany jest tylko jeden z rozwi\u0105zanych adres\u00f3w, co ma znaczenie za load balancerem z r\u00f3\u017cnymi certyfikatami; OCSP stapling i Certificate Transparency nie s\u0105 odczytywane; czy TLS 1.0 i 1.1 s\u0105 akceptowane, da si\u0119 oceni\u0107 tylko dop\u00f3ki OpenSSL tego serwera sam je jeszcze obs\u0142uguje, w przeciwnym razie widniej\u0105 jako niemierzalne.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"K\u0142\u00f3dka w przegl\u0105darce m\u00f3wi tylko, \u017ce co\u015b zosta\u0142o zweryfikowane. To narz\u0119dzie otwiera z tego serwera po\u0142\u0105czenie TLS z hostem, z nazw\u0105 hosta jako SNI, i odczytuje certyfikat, \u0142a\u0144cuch i wa\u017cno\u015b\u0107, klucz, wynegocjowany protok\u00f3\u0142 i szyfr. Nast\u0119pnie pr\u00f3buje kolejno TLS 1.0, 1.1, 1.2 i 1.3, aby sprawdzi\u0107, co serwer akceptuje. \u017b\u0105danie HTTP nie jest wysy\u0142ane.\",\"label_host\":\"Nazwa hosta (opcjonalnie z :portem, 443 lub 8443)\",\"datenschutz\":\"Z tego serwera do podanego hosta trafia do sze\u015bciu uzgodnie\u0144 TLS, \u017cadne z nich bez \u017c\u0105dania HTTP. Hosty w sieciach prywatnych, loopback i link-local s\u0105 odrzucane. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci.\",\"knopf\":\"Sprawd\u017a certyfikat\",\"laeuft\":\"Otwieranie uzgodnie\u0144...\",\"grenze\":\"Granice, o kt\u00f3rych warto wiedzie\u0107: sprawdzany jest tylko jeden z rozwi\u0105zanych adres\u00f3w, co ma znaczenie za load balancerem z r\u00f3\u017cnymi certyfikatami; OCSP stapling i Certificate Transparency nie s\u0105 odczytywane; czy TLS 1.0 i 1.1 s\u0105 akceptowane, da si\u0119 oceni\u0107 tylko dop\u00f3ki OpenSSL tego serwera sam je jeszcze obs\u0142uguje, w przeciwnym razie widniej\u0105 jako niemierzalne.\",\"h_verbindung\":\"Po\u0142\u0105czenie\",\"zeile_host\":\"Host\",\"zeile_ip\":\"Rozwi\u0105zane adresy\",\"zeile_protokoll\":\"Wynegocjowany protok\u00f3\u0142\",\"zeile_cipher\":\"Szyfr\",\"zeile_verifiziert\":\"\u0141a\u0144cuch zweryfikowany\",\"zeile_dauer\":\"Czas\",\"zeile_limit\":\"Pozosta\u0142e sprawdzenia w tej godzinie\",\"h_zertifikat\":\"Certyfikat\",\"zeile_cn\":\"Common Name\",\"zeile_sans\":\"Subject Alternative Names\",\"zeile_aussteller\":\"Wystawca\",\"zeile_gueltig\":\"Wa\u017cny\",\"zeile_laufzeit\":\"Okres wa\u017cno\u015bci\",\"zeile_schluessel\":\"Klucz\",\"zeile_signatur\":\"Podpis\",\"zeile_seriennummer\":\"Numer seryjny\",\"rest_tage\":\"pozosta\u0142o {tage} dni\",\"einheit_tage\":\"dni\",\"h_kette\":\"\u0141a\u0144cuch w postaci wys\u0142anej przez serwer\",\"spalte_nr\":\"#\",\"spalte_subject\":\"Subject\",\"spalte_issuer\":\"Wystawca\",\"spalte_bis\":\"Wygasa\",\"h_versionen\":\"Wersje TLS akceptowane przez serwer\",\"version_angenommen\":\"akceptowana\",\"version_abgelehnt\":\"odrzucona\",\"version_nicht_messbar\":\"niemierzalna st\u0105d\",\"h_befunde\":\"Ustalenia\",\"stufe_hoch\":\"Wysoka\",\"stufe_mittel\":\"\u015arednia\",\"stufe_niedrig\":\"Niska\",\"stufe_info\":\"Informacja\",\"stufe_gut\":\"W porz\u0105dku\",\"keine_befunde\":\"Brak uwag.\",\"urteil_gut\":\"Certyfikat i uzgadnianie s\u0105 w porz\u0105dku.\",\"urteil_warnung\":\"Dzia\u0142a dzisiaj, ale co\u015b zas\u0142uguje na uwag\u0119.\",\"urteil_kritisch\":\"Co najmniej jedno ustalenie \u0142amie zaufanie albo wkr\u00f3tce je z\u0142amie.\",\"ja\":\"tak\",\"nein\":\"nie\",\"wert_keine\":\"brak\",\"fehler_kein_token\":\"Sprawdzenie nie mog\u0142o si\u0119 rozpocz\u0105\u0107, poniewa\u017c reCAPTCHA si\u0119 nie za\u0142adowa\u0142a.\",\"fehler_captcha\":\"reCAPTCHA uzna\u0142a \u017c\u0105danie za zautomatyzowane. Zwykle pomaga ponowne za\u0142adowanie strony.\",\"fehler_zu_viele\":\"Osi\u0105gni\u0119to limit {limit} sprawdze\u0144 na godzin\u0119 dla tego adresu.\",\"fehler_adresse\":\"Tego hosta nie da si\u0119 u\u017cy\u0107.\",\"fehler_zaehler\":\"Licznik jest niedost\u0119pny, dlatego nic nie zosta\u0142o sprawdzone.\",\"fehler_pruefdienst\":\"Us\u0142uga reCAPTCHA by\u0142a nieosi\u0105galna.\",\"fehler_aufbau\":\"Us\u0142uga nie jest poprawnie skonfigurowana. B\u0142\u0105d le\u017cy po tej stronie.\",\"fehler_eingabe\":\"\u017b\u0105danie by\u0142o nieczytelne.\",\"fehler_methode\":\"Niew\u0142a\u015bciwa metoda \u017c\u0105dania.\",\"fehler_netz\":\"Us\u0142uga by\u0142a nieosi\u0105galna.\",\"fehler_antwort\":\"Odpowied\u017a by\u0142a nieczytelna.\",\"fehler_unbekannt\":\"Co\u015b posz\u0142o nie tak, a nie ma na to osobnego komunikatu.\",\"grund_leer\":\"Nic nie zosta\u0142o wpisane.\",\"grund_zu_lang\":\"Wpis jest za d\u0142ugi.\",\"grund_unlesbar\":\"To nie jest czytelna nazwa hosta.\",\"grund_schema\":\"Sprawdzane s\u0105 tylko hosty https.\",\"grund_benutzerinfo\":\"Wpisy z danymi logowania s\u0105 odrzucane.\",\"grund_kein_punkt\":\"Nazwa hosta potrzebuje co najmniej jednej kropki.\",\"grund_hostform\":\"Wymagana jest nazwa hosta, nie adres IP.\",\"grund_port\":\"Sprawdzane s\u0105 tylko porty 443 i 8443.\",\"grund_gesperrter_bereich\":\"Ten host rozwi\u0105zuje si\u0119 do sieci prywatnej lub zarezerwowanej. Takie nigdy nie s\u0105 kontaktowane.\",\"grund_kein_dns\":\"Nazwy hosta nie da si\u0119 rozwi\u0105za\u0107.\",\"befund_keine_verbindung\":\"Po\u0142\u0105czenie TLS niemo\u017cliwe || Serwer nie zako\u0144czy\u0142 uzgadniania na tym porcie: {fehler}. Albo nic tam nie nas\u0142uchuje, albo zapora odrzuca po\u0142\u0105czenie, albo serwer nie obs\u0142uguje \u017cadnej wersji TLS oferowanej przez tego klienta.\",\"befund_selbstsigniert\":\"Certyfikat samopodpisany || Wystawca i subject s\u0105 identyczne. Przegl\u0105darki pokazuj\u0105 pe\u0142noekranowe ostrze\u017cenie; usuwa je tylko certyfikat od publicznego CA (Let\\u0027s Encrypt jest bezp\u0142atny).\",\"befund_kette_unvollstaendig\":\"\u0141a\u0144cuch si\u0119 nie weryfikuje: brak certyfikatu po\u015bredniego || Serwer wysy\u0142a certyfikat ko\u0144cowy bez po\u015bredniego ({fehler}). Cz\u0119\u015b\u0107 przegl\u0105darek sama doci\u0105ga brakuj\u0105ce ogniwo, wi\u0119kszo\u015b\u0107 klient\u00f3w API i curl nie. Nale\u017cy zainstalowa\u0107 pe\u0142ny plik \u0142a\u0144cucha (fullchain.pem) zamiast samego certyfikatu.\",\"befund_verifikation_fehlgeschlagen\":\"\u0141a\u0144cuch si\u0119 nie weryfikuje || Weryfikacja nie powiod\u0142a si\u0119: {fehler}. Dane powy\u017cej pokazuj\u0105, co wys\u0142a\u0142 serwer.\",\"befund_kette_ok\":\"\u0141a\u0144cuch zweryfikowany ({n} certyfikat\u00f3w) || Certyfikaty wys\u0142ane przez serwer prowadz\u0105 do zaufanego korzenia.\",\"befund_zert_abgelaufen\":\"Certyfikat wygas\u0142 {tage} dni temu ({datum}) || Ka\u017cdy klient odmawia po\u0142\u0105czenia. Konieczne odnowienie i sprawdzenie, dlaczego automatyczne odnowienie nie zadzia\u0142a\u0142o.\",\"befund_zert_noch_nicht_gueltig\":\"Certyfikat wa\u017cny dopiero od {datum} || Okres wa\u017cno\u015bci zaczyna si\u0119 w przysz\u0142o\u015bci; zwyk\u0142\u0105 przyczyn\u0105 jest b\u0142\u0119dny zegar serwera.\",\"befund_zert_laeuft_ab_bald\":\"Certyfikat wygasa za {tage} dni, {datum} || Mniej ni\u017c dwa tygodnie. Przy Let\\u0027s Encrypt zwykle oznacza to, \u017ce zadanie odnawiaj\u0105ce (certbot, acme.sh) od pewnego czasu zawodzi; dziennik odnawiania pokazuje dlaczego.\",\"befund_zert_laeuft_ab\":\"Certyfikat wygasa za {tage} dni, {datum} || W ci\u0105gu miesi\u0105ca. Automatyczne odnowienia uruchamiaj\u0105 si\u0119 zwykle 30 dni przed wyga\u015bni\u0119ciem, wi\u0119c to moment na sprawdzenie zadania.\",\"befund_zert_gueltig\":\"Certyfikat wa\u017cny jeszcze {tage} dni (do {datum}) || Wyga\u015bni\u0119cie nie jest obecnie problemem.\",\"befund_laufzeit_lang\":\"Okres wa\u017cno\u015bci {tage} dni || Certyfikaty wystawione na ponad 398 dni odrzucaj\u0105 Safari i Chrome. Publicznie zaufane CA ju\u017c takich nie wystawiaj\u0105; ten jest prywatny albo stary.\",\"befund_kein_san\":\"Brak Subject Alternative Names, tylko Common Name ({cn}) || Nowoczesne przegl\u0105darki ignoruj\u0105 Common Name i por\u00f3wnuj\u0105 wy\u0142\u0105cznie list\u0119 SAN. Bez SAN certyfikat nie pasuje do \u017cadnego hosta.\",\"befund_hostname_passt\":\"Nazwa hosta {host} jest obj\u0119ta || Nazwa pasuje do wpisu w certyfikacie.\",\"befund_hostname_passt_nicht\":\"Nazwa hosta {host} nie jest obj\u0119ta || Certyfikat wymienia {namen}. Przegl\u0105darki odmawiaj\u0105 po\u0142\u0105czenia z powodu niezgodno\u015bci nazwy; certyfikat nale\u017cy do innego hosta albo symbol wieloznaczny obejmuje inny poziom.\",\"befund_platzhalter\":\"Certyfikat wieloznaczny ({name}) || Symbol wieloznaczny obejmuje dok\u0142adnie jeden poziom: *.example.com pasuje do www.example.com, ale ani do example.com, ani do a.b.example.com.\",\"befund_www_fehlt\":\"{name} nie ma w certyfikacie || Wariant www nie jest obj\u0119ty, wi\u0119c zwyk\u0142e przekierowanie z www na domen\u0119 g\u0142\u00f3wn\u0105 zawodzi, zanim si\u0119 zacznie. Druga nazwa nic nie kosztuje.\",\"befund_apex_fehlt\":\"{name} nie ma w certyfikacie || Go\u0142a domena nie jest obj\u0119ta; kto wpisze j\u0105 bez www, zobaczy ostrze\u017cenie, zanim zadzia\u0142a jakiekolwiek przekierowanie.\",\"befund_schluessel_schwach\":\"S\u0142aby klucz: {art} {bits} bit\u00f3w || RSA poni\u017cej 2048 bit\u00f3w odrzucaj\u0105 aktualne przegl\u0105darki i od lat uchodzi za mo\u017cliwe do z\u0142amania. Potrzebny jest nowy klucz, nie tylko nowy certyfikat.\",\"befund_schluessel_ok\":\"Klucz: {art} {bits} bit\u00f3w || RSA od 2048 bit\u00f3w oraz ECDSA P-256 lub P-384 to obecna praktyka.\",\"befund_signatur_sha1\":\"Podpis SHA-1 ({algorithmus}) || Podpisy SHA-1 przegl\u0105darki odrzucaj\u0105 od 2017 roku. Konieczne jest ponowne wystawienie z SHA-256.\",\"befund_signatur_md5\":\"Podpis MD5 ({algorithmus}) || MD5 jest z\u0142amane; \u017caden klient tego nie akceptuje.\",\"befund_protokoll_alt\":\"Po\u0142\u0105czenie wynegocjowane z {protokoll} || Je\u015bli TLS 1.0 lub 1.1 to najlepsze, co serwer oferuje, aktualne przegl\u0105darki odmawiaj\u0105 po\u0142\u0105czenia. Konfiguracja serwera wymaga co najmniej TLS 1.2.\",\"befund_protokoll_tls13\":\"Po\u0142\u0105czenie wynegocjowane z {protokoll} || Aktualna wersja, z uzgadnianiem w jednej rundzie i wy\u0142\u0105cznie szyframi z forward secrecy.\",\"befund_protokoll_tls12\":\"Po\u0142\u0105czenie wynegocjowane z {protokoll} || TLS 1.2 jest w porz\u0105dku; TLS 1.3 oszcz\u0119dzi\u0142by jedn\u0105 rund\u0119 i jest dost\u0119pny w ka\u017cdym aktualnym serwerze.\",\"befund_cipher_schwach\":\"S\u0142aby szyfr: {cipher} || RC4, 3DES, szyfry eksportowe i NULL s\u0105 z\u0142amane lub wycofane. List\u0119 szyfr\u00f3w serwera nale\u017cy ograniczy\u0107 do nowoczesnych zestaw\u00f3w AEAD.\",\"befund_cipher_ohne_pfs\":\"Szyfr bez forward secrecy: {cipher} || Statyczna wymiana klucza RSA oznacza, \u017ce wyciek klucza prywatnego odszyfrowuje zarejestrowany ruch wstecz. W kolejno\u015bci szyfr\u00f3w serwera nale\u017cy preferowa\u0107 zestawy ECDHE.\",\"befund_tls_alt_aktiv\":\"TLS {versionen} nadal akceptowany || Ze starych wersji korzystaj\u0105 tylko klienci, kt\u00f3rzy nie potrafi\u0105 lepiej, i w\u0142a\u015bnie oni s\u0105 celem atak\u00f3w. Do wy\u0142\u0105czenia w konfiguracji serwera, chyba \u017ce potrzebuje ich znany stary klient.\",\"befund_tls13_fehlt\":\"TLS 1.3 nieoferowany || Serwer akceptuje tylko 1.2. Ka\u017cdy aktualny serwer WWW obs\u0142uguje 1.3; w\u0142\u0105czenie oszcz\u0119dza jedn\u0105 rund\u0119 na po\u0142\u0105czenie.\",\"befund_tls12_13_fehlen\":\"Ani TLS 1.2, ani 1.3 nie s\u0105 akceptowane || Aktualne przegl\u0105darki w og\u00f3le nie mog\u0105 si\u0119 po\u0142\u0105czy\u0107.\",\"befund_kette_nur_blatt\":\"Wys\u0142ano tylko certyfikat ko\u0144cowy || Weryfikacja mimo to si\u0119 powiod\u0142a, poniewa\u017c ten serwer mia\u0142 certyfikat po\u015bredni w pami\u0119ci podr\u0119cznej. Klienci bez niej zawiod\u0105; nale\u017cy wysy\u0142a\u0107 pe\u0142ny \u0142a\u0144cuch.\",\"befund_aussteller\":\"Wystawiony przez {aussteller} || Urz\u0105d certyfikacji wymieniony w certyfikacie.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-tlscheck.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var VERSIONEN = ['1.0', '1.1', '1.2', '1.3'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: a.fehler, grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten && typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var z = (a.zert && typeof a.zert === 'object') ? a.zert : null;\n        var versionen = {};\n        VERSIONEN.forEach(function (v) { versionen[v] = (a.versionen && a.versionen[v]) ? String(a.versionen[v]) : 'nicht_messbar'; });\n        return {\n            fehler: null, host: a.host || '', port: zahl(a.port), ip: a.ip || '', ips: liste(a.ips),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            verifiziert: !!a.verifiziert, verbindungsfehler: a.verbindungsfehler || null,\n            protokoll: a.protokoll || null, cipher: a.cipher || null, cipherBits: zahl(a.cipher_bits),\n            zert: z ? { cn: z.cn || '', sans: liste(z.sans), aussteller: z.aussteller || '', von: z.von || null, bis: z.bis || null,\n                        tage: zahl(z.tage), laufzeit: zahl(z.laufzeit_tage), signatur: z.signatur || null, seriennummer: z.seriennummer || null,\n                        ocsp: !!z.ocsp, schluessel: (z.schluessel && typeof z.schluessel === 'object') ? z.schluessel : null } : null,\n            kette: liste(a.kette), versionen: versionen, befunde: befunde, gruppen: gruppen,\n            dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }<\/p>\n<p>    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'tlscheck' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(host) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ host: host, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.TC = { bewerten: bewerten, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, VERSIONEN: VERSIONEN, T: T };<\/p>\n<p>    var btn = document.getElementById('tc-btn');\n    var out = document.getElementById('tc-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }<\/p>\n<p>    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund && T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_verbindung));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_host, b.host + (b.port && b.port !== 443 ? ':' + b.port : ''));\n        paar(g, T.zeile_ip, b.ips.length ? b.ips.join(', ') : b.ip, GRAU);\n        if (b.protokoll) { paar(g, T.zeile_protokoll, b.protokoll, \/1\\.3\/.test(b.protokoll) ? GUT : (\/1\\.2\/.test(b.protokoll) ? '' : ROT)); }\n        if (b.cipher) { paar(g, T.zeile_cipher, b.cipher + (b.cipherBits ? ' (' + b.cipherBits + ' bit)' : ''), GRAU); }\n        paar(g, T.zeile_verifiziert, b.verifiziert ? T.ja : T.nein + (b.verbindungsfehler ? ' \u2013 ' + b.verbindungsfehler : ''), b.verifiziert ? GUT : ROT);\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        if (b.zert) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_zertifikat));\n            var gz = gitter('auto auto');\n            paar(gz, T.zeile_cn, b.zert.cn || '-');\n            paar(gz, T.zeile_sans, b.zert.sans.length ? b.zert.sans.join(', ') : T.wert_keine, b.zert.sans.length ? '' : WARN);\n            paar(gz, T.zeile_aussteller, b.zert.aussteller || '-', GRAU);\n            paar(gz, T.zeile_gueltig, (b.zert.von || '?') + ' \u2192 ' + (b.zert.bis || '?') + (b.zert.tage !== null ? '  (' + text('rest_tage', { tage: b.zert.tage }) + ')' : ''),\n                b.zert.tage === null ? '' : (b.zert.tage < 14 ? ROT : (b.zert.tage < 30 ? WARN : GUT)));\n            if (b.zert.laufzeit !== null) { paar(gz, T.zeile_laufzeit, b.zert.laufzeit + ' ' + T.einheit_tage, GRAU); }\n            if (b.zert.schluessel) {\n                var s = b.zert.schluessel;\n                paar(gz, T.zeile_schluessel, (s.kurve ? 'ECDSA ' + s.kurve : 'RSA') + ' ' + s.bits + ' bit', GRAU);\n            }\n            if (b.zert.signatur) { paar(gz, T.zeile_signatur, b.zert.signatur, GRAU); }\n            paar(gz, 'OCSP', b.zert.ocsp ? T.ja : T.nein, GRAU);\n            if (b.zert.seriennummer) { paar(gz, T.zeile_seriennummer, b.zert.seriennummer, GRAU); }\n            ziel.appendChild(gz);\n        }\n\n        if (b.kette.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_kette));\n            var gk = gitter('auto auto auto auto');\n            [T.spalte_nr, T.spalte_subject, T.spalte_issuer, T.spalte_bis].forEach(function (s) { gk.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', s)); });\n            b.kette.forEach(function (k, i) {\n                gk.appendChild(el('div', ZELLE, String(i + 1) + (k.ca ? ' (CA)' : '')));\n                gk.appendChild(el('div', ZELLE_WERT, k.subject || '?'));\n                gk.appendChild(el('div', ZELLE_WERT + GRAU, k.issuer || '?'));\n                gk.appendChild(el('div', ZELLE_WERT + GRAU, k.bis || '-'));\n            });\n            ziel.appendChild(gk);\n        }\n\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_versionen));\n        var gv = gitter('auto auto');\n        VERSIONEN.forEach(function (v) {\n            var w = b.versionen[v];\n            var stil = w === 'angenommen' ? ((v === '1.0' || v === '1.1') ? WARN : GUT) : (w === 'abgelehnt' ? ((v === '1.2' || v === '1.3') ? WARN : GUT) : GRAU);\n            paar(gv, 'TLS ' + v, T['version_' + w] || w, stil);\n        });\n        ziel.appendChild(gv);\n\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var t = text('befund_' + f.key, f.daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.TC.darstellen = darstellen;\n\n    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('tc-host')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Otwiera po\u0142\u0105czenie TLS z hostem i odczytuje to, czego przegl\u0105darka nigdy nie pokazuje w ca\u0142o\u015bci: nazwy i dat\u0119 wa\u017cno\u015bci certyfikatu, \u0142a\u0144cuch i czy si\u0119 weryfikuje, klucz i podpis, wynegocjowany protok\u00f3\u0142 i szyfr oraz kt\u00f3re wersje TLS serwer nadal akceptuje.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92229,92310,92077],"class_list":["post-13546","page","type-page","status-publish","hentry","tag-devops-pl","tag-networking-pl","tag-web-security-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Inspektor certyfikatu i uzgadniania TLS - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Inspektor certyfikatu i uzgadniania TLS - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Otwiera po\u0142\u0105czenie TLS z hostem i odczytuje to, czego przegl\u0105darka nigdy nie pokazuje w ca\u0142o\u015bci: nazwy i dat\u0119 wa\u017cno\u015bci certyfikatu, \u0142a\u0144cuch i czy si\u0119 weryfikuje, klucz i podpis, wynegocjowany protok\u00f3\u0142 i szyfr oraz kt\u00f3re wersje TLS serwer nadal akceptuje.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/tls-certificate-handshake-inspector\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/tls-certificate-handshake-inspector\\\/\",\"name\":\"Inspektor certyfikatu i uzgadniania TLS - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-02T11:14:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/tls-certificate-handshake-inspector\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/tls-certificate-handshake-inspector\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/tls-certificate-handshake-inspector\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Inspektor certyfikatu i uzgadniania TLS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Inspektor certyfikatu i uzgadniania TLS - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/","og_locale":"en_US","og_type":"article","og_title":"Inspektor certyfikatu i uzgadniania TLS - Lukas Wojcik - Blog","og_description":"Otwiera po\u0142\u0105czenie TLS z hostem i odczytuje to, czego przegl\u0105darka nigdy nie pokazuje w ca\u0142o\u015bci: nazwy i dat\u0119 wa\u017cno\u015bci certyfikatu, \u0142a\u0144cuch i czy si\u0119 weryfikuje, klucz i podpis, wynegocjowany protok\u00f3\u0142 i szyfr oraz kt\u00f3re wersje TLS serwer nadal akceptuje.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/","name":"Inspektor certyfikatu i uzgadniania TLS - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-02T11:14:18+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/tls-certificate-handshake-inspector\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Inspektor certyfikatu i uzgadniania TLS"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13546"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13546\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13546"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}