# TLS-Zertifikate: Kette, Ablauf, typische Fehler

Prüfen kannst du jeden Server mit dem [SSL/TLS-Check](https://tools.ngosu-corp.de/ssl), auch Mailserver per STARTTLS.

## Die Zertifikatskette

Ein Browser vertraut einer kleinen Zahl von **Wurzelzertifikaten**. Dein Server-Zertifikat ist aber von einem **Zwischenzertifikat** signiert. Damit der Client die Kette prüfen kann, muss der Server ihm **sein Zertifikat und alle Zwischenzertifikate** schicken, die Wurzel nicht.

Häufigster Fehler: Es wird nur das eigene Zertifikat ausgeliefert. Browser holen das Fehlende manchmal selbst nach, Apps, Skripte und Mailserver nicht. Die Folge: „unable to get local issuer certificate“.

| Software | richtig |
|---|---|
| nginx | `ssl_certificate /etc/letsencrypt/live/example.de/fullchain.pem;` |
| Apache 2.4.8+ | `SSLCertificateFile …/fullchain.pem` |
| Postfix | `smtpd_tls_chain_files = …/privkey.pem, …/fullchain.pem` |

## Ablauf und Erneuerung

Zertifikate von Let's Encrypt gelten 90 Tage, künftig noch kürzer. Ohne automatische Erneuerung läuft es garantiert irgendwann ab.

- **certbot:** `certbot renew --dry-run` testet die Erneuerung. Nach dem Erneuern muss der Dienst neu laden, z. B. mit `--deploy-hook "systemctl reload nginx"`.
- **Caddy, Traefik** erneuern selbst.
- **Nicht vergessen:** Mailserver, VPN, Proxmox, NAS und alles, was ein Zertifikat per Hand bekommen hat.

Damit es nicht überraschend kommt: Im [Monitoring](https://tools.ngosu-corp.de/monitor) (Premium) eine Zertifikats-Prüfung anlegen, sie warnt 14 Tage vorher.

## Typische Fehlermeldungen

| Meldung | Ursache |
|---|---|
| Name passt nicht (`hostname mismatch`) | Der aufgerufene Name steht nicht in den SANs des Zertifikats. Mit allen Namen neu ausstellen. |
| Zertifikat abgelaufen | Erneuerung läuft nicht oder der Dienst hat das neue Zertifikat nicht geladen |
| selbst signiert | Kein Zertifikat einer öffentlichen Stelle. Für öffentliche Dienste Let's Encrypt nehmen. |
| unvollständige Kette | siehe oben, `fullchain` statt `cert` |

## Protokolle und HSTS

- **TLS 1.2 und 1.3 an, 1.0 und 1.1 aus.** Alte Versionen braucht heute kein aktueller Client mehr.
- **HSTS** (`Strict-Transport-Security: max-age=31536000`) sorgt dafür, dass Browser nur noch per HTTPS kommen. Erst setzen, wenn HTTPS überall sicher läuft, auch auf Subdomains, falls du `includeSubDomains` nutzt.