{"id":13545,"date":"2026-09-02T13:14:16","date_gmt":"2026-09-02T11:14:16","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/tls-certificate-handshake-inspector\/"},"modified":"2026-09-02T13:14:16","modified_gmt":"2026-09-02T11:14:16","slug":"tls-certificate-handshake-inspector","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/tls-certificate-handshake-inspector\/","title":{"rendered":"TLS-Zertifikat- und Handshake-Inspector"},"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;\">Das Schloss im Browser sagt nur, dass etwas verifiziert wurde. Dieses Werkzeug \u00f6ffnet von diesem Server aus eine TLS-Verbindung zum Host, mit dem Hostnamen als SNI, und liest Zertifikat, Kette und G\u00fcltigkeit, Schl\u00fcssel, ausgehandeltes Protokoll und Cipher. Danach probiert es TLS 1.0, 1.1, 1.2 und 1.3 einzeln, um zu sehen, was der Server annimmt. Eine HTTP-Anfrage wird nicht gesendet.<\/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;\">Hostname (optional mit :Port, 443 oder 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;\">Bis zu sechs TLS-Handshakes gehen von diesem Server an den eingegebenen Host, keiner davon mit einer HTTP-Anfrage. Hosts in privaten, Loopback- und Link-local-Netzen werden abgelehnt. Die Abfrage ist durch reCAPTCHA v3 gesch\u00fctzt; die aufrufende IP-Adresse und das Ziel werden eine Stunde gespeichert, um die Rate zu begrenzen.<\/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;\">Zertifikat pr\u00fcfen<\/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;\">Grenzen, die dazugeh\u00f6ren: Gepr\u00fcft wird nur eine der aufgel\u00f6sten Adressen, was hinter einem Load Balancer mit verschiedenen Zertifikaten z\u00e4hlt; OCSP-Stapling und Certificate Transparency werden nicht gelesen; ob TLS 1.0 und 1.1 angenommen werden, l\u00e4sst sich nur beurteilen, solange das OpenSSL dieses Servers sie selbst noch spricht, sonst stehen sie als nicht messbar.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Das Schloss im Browser sagt nur, dass etwas verifiziert wurde. Dieses Werkzeug \u00f6ffnet von diesem Server aus eine TLS-Verbindung zum Host, mit dem Hostnamen als SNI, und liest Zertifikat, Kette und G\u00fcltigkeit, Schl\u00fcssel, ausgehandeltes Protokoll und Cipher. Danach probiert es TLS 1.0, 1.1, 1.2 und 1.3 einzeln, um zu sehen, was der Server annimmt. Eine HTTP-Anfrage wird nicht gesendet.\",\"label_host\":\"Hostname (optional mit :Port, 443 oder 8443)\",\"datenschutz\":\"Bis zu sechs TLS-Handshakes gehen von diesem Server an den eingegebenen Host, keiner davon mit einer HTTP-Anfrage. Hosts in privaten, Loopback- und Link-local-Netzen werden abgelehnt. Die Abfrage ist durch reCAPTCHA v3 gesch\u00fctzt; die aufrufende IP-Adresse und das Ziel werden eine Stunde gespeichert, um die Rate zu begrenzen.\",\"knopf\":\"Zertifikat pr\u00fcfen\",\"laeuft\":\"Handshakes werden ge\u00f6ffnet...\",\"grenze\":\"Grenzen, die dazugeh\u00f6ren: Gepr\u00fcft wird nur eine der aufgel\u00f6sten Adressen, was hinter einem Load Balancer mit verschiedenen Zertifikaten z\u00e4hlt; OCSP-Stapling und Certificate Transparency werden nicht gelesen; ob TLS 1.0 und 1.1 angenommen werden, l\u00e4sst sich nur beurteilen, solange das OpenSSL dieses Servers sie selbst noch spricht, sonst stehen sie als nicht messbar.\",\"h_verbindung\":\"Verbindung\",\"zeile_host\":\"Host\",\"zeile_ip\":\"Aufgel\u00f6ste Adressen\",\"zeile_protokoll\":\"Ausgehandeltes Protokoll\",\"zeile_cipher\":\"Cipher\",\"zeile_verifiziert\":\"Kette verifiziert\",\"zeile_dauer\":\"Dauer\",\"zeile_limit\":\"Pr\u00fcfungen in dieser Stunde noch\",\"h_zertifikat\":\"Zertifikat\",\"zeile_cn\":\"Common Name\",\"zeile_sans\":\"Subject Alternative Names\",\"zeile_aussteller\":\"Aussteller\",\"zeile_gueltig\":\"G\u00fcltig\",\"zeile_laufzeit\":\"Laufzeit\",\"zeile_schluessel\":\"Schl\u00fcssel\",\"zeile_signatur\":\"Signatur\",\"zeile_seriennummer\":\"Seriennummer\",\"rest_tage\":\"noch {tage} Tage\",\"einheit_tage\":\"Tage\",\"h_kette\":\"Kette, wie der Server sie sendet\",\"spalte_nr\":\"#\",\"spalte_subject\":\"Subject\",\"spalte_issuer\":\"Aussteller\",\"spalte_bis\":\"L\u00e4uft ab\",\"h_versionen\":\"TLS-Versionen, die der Server annimmt\",\"version_angenommen\":\"angenommen\",\"version_abgelehnt\":\"abgelehnt\",\"version_nicht_messbar\":\"von hier nicht messbar\",\"h_befunde\":\"Befunde\",\"stufe_hoch\":\"Hoch\",\"stufe_mittel\":\"Mittel\",\"stufe_niedrig\":\"Niedrig\",\"stufe_info\":\"Hinweis\",\"stufe_gut\":\"In Ordnung\",\"keine_befunde\":\"Nichts zu berichten.\",\"urteil_gut\":\"Zertifikat und Handshake sind in Ordnung.\",\"urteil_warnung\":\"Funktioniert heute, mit etwas, das Aufmerksamkeit verdient.\",\"urteil_kritisch\":\"Mindestens ein Befund bricht das Vertrauen oder wird es bald tun.\",\"ja\":\"ja\",\"nein\":\"nein\",\"wert_keine\":\"keine\",\"fehler_kein_token\":\"Die Pr\u00fcfung konnte nicht starten, weil reCAPTCHA nicht geladen wurde.\",\"fehler_captcha\":\"reCAPTCHA hat die Anfrage als automatisiert eingestuft. Ein Neuladen der Seite hilft in der Regel.\",\"fehler_zu_viele\":\"Die Grenze von {limit} Pr\u00fcfungen je Stunde f\u00fcr diese Adresse ist erreicht.\",\"fehler_adresse\":\"Dieser Host l\u00e4sst sich nicht verwenden.\",\"fehler_zaehler\":\"Der Z\u00e4hler ist nicht erreichbar, deshalb wurde nichts gepr\u00fcft.\",\"fehler_pruefdienst\":\"Der reCAPTCHA-Dienst war nicht erreichbar.\",\"fehler_aufbau\":\"Der Dienst ist nicht richtig eingerichtet. Der Fehler liegt auf dieser Seite.\",\"fehler_eingabe\":\"Die Anfrage war nicht lesbar.\",\"fehler_methode\":\"Falsche Anfragemethode.\",\"fehler_netz\":\"Der Dienst war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort war nicht lesbar.\",\"fehler_unbekannt\":\"Etwas ging schief, wof\u00fcr es keine eigene Meldung gibt.\",\"grund_leer\":\"Es wurde nichts eingegeben.\",\"grund_zu_lang\":\"Die Eingabe ist zu lang.\",\"grund_unlesbar\":\"Das ist kein lesbarer Hostname.\",\"grund_schema\":\"Gepr\u00fcft werden nur https-Hosts.\",\"grund_benutzerinfo\":\"Eingaben mit Zugangsdaten werden abgelehnt.\",\"grund_kein_punkt\":\"Der Hostname braucht mindestens einen Punkt.\",\"grund_hostform\":\"Bitte einen Hostnamen eingeben, keine IP-Adresse.\",\"grund_port\":\"Gepr\u00fcft werden nur die Ports 443 und 8443.\",\"grund_gesperrter_bereich\":\"Dieser Host l\u00f6st in ein privates oder reserviertes Netz auf. Solche werden nie kontaktiert.\",\"grund_kein_dns\":\"Der Hostname l\u00e4sst sich nicht aufl\u00f6sen.\",\"befund_keine_verbindung\":\"Keine TLS-Verbindung m\u00f6glich || Der Server hat auf diesem Port keinen Handshake abgeschlossen: {fehler}. Entweder lauscht dort nichts, eine Firewall verwirft die Verbindung, oder der Server spricht keine TLS-Version, die dieser Client anbietet.\",\"befund_selbstsigniert\":\"Selbstsigniertes Zertifikat || Aussteller und Subject sind identisch. Browser zeigen eine ganzseitige Warnung; nur ein Zertifikat einer \u00f6ffentlichen CA (Let\\u0027s Encrypt ist kostenlos) entfernt sie.\",\"befund_kette_unvollstaendig\":\"Kette verifiziert nicht: Zwischenzertifikat fehlt || Der Server sendet das Blatt ohne sein Zwischenzertifikat ({fehler}). Manche Browser holen das fehlende Glied selbst, die meisten API-Clients und curl nicht. Die vollst\u00e4ndige Kettendatei (fullchain.pem) statt des Zertifikats allein einbinden.\",\"befund_verifikation_fehlgeschlagen\":\"Kette verifiziert nicht || Die Verifikation scheiterte mit: {fehler}. Die Angaben oben zeigen, was der Server gesendet hat.\",\"befund_kette_ok\":\"Kette verifiziert ({n} Zertifikate) || Die vom Server gesendeten Zertifikate f\u00fchren zu einer vertrauensw\u00fcrdigen Wurzel.\",\"befund_zert_abgelaufen\":\"Zertifikat seit {tage} Tag(en) abgelaufen (am {datum}) || Jeder Client verweigert die Verbindung. Erneuern, und nachsehen, warum die automatische Erneuerung nicht lief.\",\"befund_zert_noch_nicht_gueltig\":\"Zertifikat erst ab {datum} g\u00fcltig || Der G\u00fcltigkeitszeitraum beginnt in der Zukunft; eine falsche Serveruhr ist die \u00fcbliche Ursache.\",\"befund_zert_laeuft_ab_bald\":\"Zertifikat l\u00e4uft in {tage} Tag(en) ab, am {datum} || Weniger als zwei Wochen. Bei Let\\u0027s Encrypt hei\u00dft das normalerweise, dass der Erneuerungslauf (certbot, acme.sh) seit einiger Zeit scheitert; das Erneuerungsprotokoll zeigt warum.\",\"befund_zert_laeuft_ab\":\"Zertifikat l\u00e4uft in {tage} Tagen ab, am {datum} || Innerhalb eines Monats. Automatische Erneuerungen laufen meist 30 Tage vor Ablauf, also ist jetzt der Moment, den Lauf zu pr\u00fcfen.\",\"befund_zert_gueltig\":\"Zertifikat noch {tage} Tage g\u00fcltig (bis {datum}) || Der Ablauf ist derzeit kein Thema.\",\"befund_laufzeit_lang\":\"Laufzeit von {tage} Tagen || Zertifikate mit mehr als 398 Tagen G\u00fcltigkeit weisen Safari und Chrome ab. \u00d6ffentlich vertrauensw\u00fcrdige CAs stellen solche nicht mehr aus; dieses ist privat oder alt.\",\"befund_kein_san\":\"Keine Subject Alternative Names, nur ein Common Name ({cn}) || Moderne Browser ignorieren den Common Name und vergleichen nur die SAN-Liste. Ohne SANs passt das Zertifikat auf keinen Host.\",\"befund_hostname_passt\":\"Hostname {host} ist abgedeckt || Der Name passt auf einen Eintrag im Zertifikat.\",\"befund_hostname_passt_nicht\":\"Hostname {host} ist nicht abgedeckt || Das Zertifikat nennt {namen}. Browser verweigern die Verbindung wegen Namensabweichung; das Zertifikat geh\u00f6rt zu einem anderen Host, oder der Platzhalter deckt eine andere Ebene.\",\"befund_platzhalter\":\"Platzhalter-Zertifikat ({name}) || Ein Platzhalter deckt genau eine Ebene: *.example.com passt auf www.example.com, aber weder auf example.com noch auf a.b.example.com.\",\"befund_www_fehlt\":\"{name} steht nicht im Zertifikat || Die www-Variante ist nicht abgedeckt; die \u00fcbliche Weiterleitung von www auf die Hauptdomain scheitert damit, bevor sie beginnt. Der zweite Name kostet nichts.\",\"befund_apex_fehlt\":\"{name} steht nicht im Zertifikat || Die nackte Domain ist nicht abgedeckt; wer sie ohne www eintippt, bekommt eine Warnung, bevor eine Weiterleitung greifen kann.\",\"befund_schluessel_schwach\":\"Schwacher Schl\u00fcssel: {art} {bits} Bit || RSA unter 2048 Bit weisen aktuelle Browser ab, und es gilt seit Jahren als brechbar. N\u00f6tig ist ein neuer Schl\u00fcssel, nicht nur ein neues Zertifikat.\",\"befund_schluessel_ok\":\"Schl\u00fcssel: {art} {bits} Bit || RSA ab 2048 Bit und ECDSA P-256 oder P-384 sind heutige Praxis.\",\"befund_signatur_sha1\":\"SHA-1-Signatur ({algorithmus}) || SHA-1-Signaturen weisen Browser seit 2017 ab. Eine Neuausstellung mit SHA-256 ist n\u00f6tig.\",\"befund_signatur_md5\":\"MD5-Signatur ({algorithmus}) || MD5 ist gebrochen; kein Client akzeptiert das.\",\"befund_protokoll_alt\":\"Verbindung ausgehandelt mit {protokoll} || Wenn TLS 1.0 oder 1.1 das Beste ist, was der Server anbietet, verweigern aktuelle Browser die Verbindung. Die Serverkonfiguration braucht mindestens TLS 1.2.\",\"befund_protokoll_tls13\":\"Verbindung ausgehandelt mit {protokoll} || Die aktuelle Version, mit einem Handshake in einer Runde und ausschlie\u00dflich Ciphern mit Forward Secrecy.\",\"befund_protokoll_tls12\":\"Verbindung ausgehandelt mit {protokoll} || TLS 1.2 ist in Ordnung; TLS 1.3 spart eine Runde und ist in jedem aktuellen Server verf\u00fcgbar.\",\"befund_cipher_schwach\":\"Schwacher Cipher: {cipher} || RC4, 3DES, Export- und NULL-Cipher sind gebrochen oder abgek\u00fcndigt. Die Cipher-Liste des Servers auf moderne AEAD-Suiten beschr\u00e4nken.\",\"befund_cipher_ohne_pfs\":\"Cipher ohne Forward Secrecy: {cipher} || Ein statischer RSA-Schl\u00fcsselaustausch bedeutet: ein geleakter privater Schl\u00fcssel entschl\u00fcsselt aufgezeichneten Verkehr nachtr\u00e4glich. ECDHE-Suiten in der Cipher-Reihenfolge des Servers bevorzugen.\",\"befund_tls_alt_aktiv\":\"TLS {versionen} wird noch angenommen || Alte Versionen nutzen nur Clients, die nichts Besseres k\u00f6nnen, und genau die sind das Ziel von Angriffen. In der Serverkonfiguration abschalten, sofern kein bekannter Altclient sie braucht.\",\"befund_tls13_fehlt\":\"TLS 1.3 wird nicht angeboten || Der Server nimmt nur 1.2 an. Jeder aktuelle Webserver unterst\u00fctzt 1.3; einschalten spart eine Runde je Verbindung.\",\"befund_tls12_13_fehlen\":\"Weder TLS 1.2 noch 1.3 angenommen || Aktuelle Browser k\u00f6nnen gar keine Verbindung aufbauen.\",\"befund_kette_nur_blatt\":\"Nur das Blattzertifikat wurde gesendet || Die Verifikation gelang trotzdem, weil dieser Server das Zwischenzertifikat zwischengespeichert hatte. Clients ohne diesen Speicher scheitern; die vollst\u00e4ndige Kette senden.\",\"befund_aussteller\":\"Ausgestellt von {aussteller} || Die im Zertifikat genannte Zertifizierungsstelle.\"};<\/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>\u00d6ffnet eine TLS-Verbindung zu einem Host und liest, was der Browser nie vollst\u00e4ndig zeigt: Namen und Ablauf des Zertifikats, die Kette und ob sie verifiziert, Schl\u00fcssel und Signatur, ausgehandeltes Protokoll und Cipher sowie welche TLS-Versionen der Server noch annimmt.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92214,92301,92071],"class_list":["post-13545","page","type-page","status-publish","hentry","tag-devops-de","tag-networking-de","tag-web-security-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TLS-Zertifikat- und Handshake-Inspector - 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\/de\/werkzeuge\/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=\"TLS-Zertifikat- und Handshake-Inspector - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"\u00d6ffnet eine TLS-Verbindung zu einem Host und liest, was der Browser nie vollst\u00e4ndig zeigt: Namen und Ablauf des Zertifikats, die Kette und ob sie verifiziert, Schl\u00fcssel und Signatur, ausgehandeltes Protokoll und Cipher sowie welche TLS-Versionen der Server noch annimmt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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\\\/de\\\/werkzeuge\\\/tls-certificate-handshake-inspector\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/tls-certificate-handshake-inspector\\\/\",\"name\":\"TLS-Zertifikat- und Handshake-Inspector - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-02T11:14:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/tls-certificate-handshake-inspector\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/tls-certificate-handshake-inspector\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/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-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"TLS-Zertifikat- und Handshake-Inspector\"}]},{\"@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":"TLS-Zertifikat- und Handshake-Inspector - 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\/de\/werkzeuge\/tls-certificate-handshake-inspector\/","og_locale":"en_US","og_type":"article","og_title":"TLS-Zertifikat- und Handshake-Inspector - Lukas Wojcik - Blog","og_description":"\u00d6ffnet eine TLS-Verbindung zu einem Host und liest, was der Browser nie vollst\u00e4ndig zeigt: Namen und Ablauf des Zertifikats, die Kette und ob sie verifiziert, Schl\u00fcssel und Signatur, ausgehandeltes Protokoll und Cipher sowie welche TLS-Versionen der Server noch annimmt.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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\/de\/werkzeuge\/tls-certificate-handshake-inspector\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/tls-certificate-handshake-inspector\/","name":"TLS-Zertifikat- und Handshake-Inspector - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-02T11:14:16+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/tls-certificate-handshake-inspector\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/tls-certificate-handshake-inspector\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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-2\/"},{"@type":"ListItem","position":3,"name":"TLS-Zertifikat- und Handshake-Inspector"}]},{"@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\/13545","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=13545"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13545\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13545"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}