
🌐 Auch auf: English · Français · Español
☝️ Kurz vorab für alle, die einfach nur einen Blogbeitrag lesen wollten: TLS ist der Grund, warum dein Browser das kleine Schloss anzeigt. Jedes Mal, wenn du hier eine Seite öffnest, kommt sie verschlüsselt bei dir an. Niemand im selben Café-WLAN, bei deinem Internetanbieter oder irgendwo dazwischen kann mitlesen oder heimlich ein paar Wörter austauschen. Und nein, es heißt nicht mehr „SSL“, auch wenn die Testseite unten stur am alten Namen festhält. SSL wurde 2015 in Rente geschickt; nur das Wort haben wir nie losbekommen. Wenn ich unten also mit „TLS-Einstellungen“ angebe, gebe ich eigentlich damit an, wie gut der Umschlag um genau diesen Satz verschlossen ist. Gern geschehen. 🤓
Ab und zu jage ich meinen eigenen Blog durch Qualys SSL Labs, vor allem um sicherzugehen, dass seit dem letzten Mal nichts still vor sich hin gammelt. Das heutige Ergebnis hat mich zum Lächeln gebracht: A+ für beide Endpunkte, IPv4 und IPv6. Keine Warnungen, kein „aber“, kein Sternchen.

Eine Note ist schön, aber eine Note allein sagt nichts. Deshalb hier in einfachen Worten, was dieser Server tatsächlich spricht. Arbeitsteilung wie immer: Ich stelle die Fragen und treffe die Entscheidungen, mein KI-Co-Admin (Claude) hat die Rohdaten des Scans über die SSL-Labs-API geholt und mit der Konfiguration abgeglichen.
🔐 Was der Blog unterstützt (die Kurzfassung)
| Merkmal | Was wir machen | Warum das wichtig ist |
|---|---|---|
| Protokolle | Nur TLS 1.3 und TLS 1.2 | TLS 1.0/1.1 und alle SSL-Versionen sind weg, und mit ihnen ihr ganzes Museum an Angriffen. |
| Cipher-Suites | Insgesamt 6, alle AEAD: AES-GCM und ChaCha20-Poly1305 | Überhaupt kein CBC, die Padding-Oracle-Familie (POODLE, Lucky13, GOLDENDOODLE, Zombie POODLE …) findet also nichts zum Anbeißen. |
| Forward Secrecy | ECDHE für jede einzelne Verbindung | Ein morgen gestohlener Schlüssel kann heute aufgezeichneten Verkehr nicht entschlüsseln. Session-Tickets sind aus, damit das auch bei wiederaufgenommenen Sitzungen gilt. |
| Post-Quanten-Schlüsselaustausch | Hybrides X25519MLKEM768 wird zuerst angeboten | Aktuelle Chrome- und Firefox-Versionen nutzen es bereits. „Jetzt aufzeichnen, später entschlüsseln“ wird damit deutlich unattraktiver. |
| Zertifikat | ECDSA P-256 von Let’s Encrypt, bei jeder Erneuerung ein frischer Schlüssel | Kleiner und schneller als RSA, und ein alter Schlüssel überlebt nie sein Zertifikat. |
| HSTS | 1 Jahr, includeSubDomains, preload – auch bei der Weiterleitung der Apex-Domain | Nach dem ersten Besuch verweigert der Browser unverschlüsseltes HTTP zu dieser Domain. Genau das macht aus A ein A+. |
| Extras | HTTP/2 per ALPN, TLS_FALLBACK_SCSV, kein 0-RTT | Schnell, resistent gegen Downgrades und keine wiederholbaren Early Data. |
Jeder Schwachstellentest im Report fällt negativ aus: Heartbleed, ROBOT, Ticketbleed, FREAK, Logjam, die ganze Liste. Nicht wegen cleverer Patches, sondern weil die anfälligen Bausteine schlicht nicht mehr angeboten werden.
🤓 Drei Details, die ich spannender fand als die Note
- Der Post-Quanten-Teil kam gratis. Ich habe
X25519MLKEM768nie konfiguriert. Der Ingress-Controller bringt ein nginx mit, das gegen OpenSSL 3.5 gebaut ist, und das setzt die hybride Gruppe standardmäßig an die erste Stelle. Manchmal ist das beste Sicherheitsfeature einfach, seine Images aktuell zu halten. - Kein OCSP-Stapling – mit Absicht. SSL Labs führt es als „No“, das sieht nach einer Lücke aus. Ist es aber nicht: Let’s Encrypt hat OCSP eingestellt, und die aktuellen Zertifikate enthalten gar keine OCSP-URL mehr. Es gibt nichts zu „stapeln“; der Widerruf läuft inzwischen über CRLs und kurze Laufzeiten.
- Der Preis der Strenge. 46 der 68 simulierten Clients verbinden sich problemlos. Die 22, die scheitern, sind Fossilien: Internet Explorer bis Version 10, Android bis 4.3, Safari bis 8, Java 6/7, OpenSSL 0.9.8, Chrome 49 unter Windows XP und ein Baidu-Crawler von 2015. Damit kann ich leben.
🛠️ Wo das A+ wohnt: mein Ansible-Code
Nichts davon wurde auf dem Server zusammengeklickt. Der komplette Stack wird über mein öffentliches Ansible-Repository aptupgrademe/www_k3s ausgerollt, und der Scan oben lief gegen den Server genau so, wie ein Playbook-Lauf ihn hinterlässt, ohne manuelle Nacharbeit. Betrachte diesen Beitrag also als Testbericht für den Code. Wer die Einstellungen übernehmen will, sollte diese beiden Dateien lesen:
roles/common_k3s/templates/ingress-nginx-values.yml.j2– Protokolle, Cipher-Liste, Session-Cache, Tickets aus und der Kommentar, warum OCSP-Stapling bewusst fehlt.roles/blog_k3s_deploy/templates/ingress.yml.j2– die ECDSA-Zertifikatsanforderung für cert-manager, der HSTS-Header und die Preload-fähige Apex-Weiterleitung.
Das Herzstück passt auf einen Bildschirm:
# ingress controller (shared role, also in front of my Nextclouds)
ssl-protocols: "TLSv1.2 TLSv1.3"
ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305"
ssl-prefer-server-ciphers: "false"
ssl_session_tickets off;
# blog ingress: ECDSA certificate with a fresh key on every renewal
cert-manager.io/private-key-algorithm: "ECDSA"
cert-manager.io/private-key-size: "256"
cert-manager.io/private-key-rotation-policy: "Always"
# HSTS, even on the redirects
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;Weil der TLS-Teil in einer gemeinsamen Rolle steckt, schützen dieselben Einstellungen auch meine beiden Nextcloud-Instanzen. Ein Fix, drei Server.
📝 Steht noch auf der Liste
- Eintragung in die HSTS-Preload-Liste: Der Header ist Preload-fähig, aber die Domain steht noch nicht auf den Preload-Listen der Browser. Das ist eine Einbahnstraße, deshalb lasse ich mir Zeit.
- CAA-Eintrag: ein DNS-Eintrag, der sagt: „Nur Let’s Encrypt darf Zertifikate für diese Domain ausstellen“. Klein, billig, noch nicht da.
Willst du es selbst prüfen? Der aktuelle SSL-Labs-Report ist nur einen Klick entfernt. Und falls dein eigener Server ein B bekommt, ist die Cipher-Liste oben ein guter Ausgangspunkt.





