feat(auth): konfigurierbare TLS-Mindestversion fuer den Verzeichnisdienst

Domain Controller auf Windows Server 2012 R2 koennen TLS 1.2 per Registry
deaktiviert haben. ad.min_tls_version (Default 1.2) erlaubt es, fuer solche
Altsysteme auf 1.0/1.1 herunterzugehen; das Portal warnt dann bei jedem Start.

Die Zertifikatspruefung bleibt in jedem Fall aktiv — fuer LDAP gibt es
weiterhin keine Insecure-Option. Im Legacy-Modus kommen lediglich die
CBC-SHA256-Suiten hinzu, die Go als unsicher einstuft; RC4, 3DES und Suiten
ohne Forward Secrecy werden nie angeboten.

README dokumentiert zusaetzlich die beiden anderen 2012-R2-Stolpersteine:
SHA-1-signierte DC-Zertifikate (seit Go 1.24 nicht mehr umgehbar) und
RSA-Schluesselaustausch (nur ueber GODEBUG=tlsrsakex=1).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
This commit is contained in:
Carsten Abele 2026-08-14 13:18:24 +02:00
parent a2bce25424
commit 0fc2d8808b
10 changed files with 299 additions and 25 deletions

View file

@ -315,6 +315,54 @@ Für die Fehlersuche lässt sich `logging.level` vorübergehend auf `debug`
setzen — dann werden auch die verglichenen CNs protokolliert. **Im
Normalbetrieb wieder auf `info` zurückstellen.**
### Alte Domain Controller (Windows Server 2012 R2 und älter)
Fehlendes TLS 1.3 ist **kein** Problem — das Portal verlangt mindestens
TLS 1.2 und handelt automatisch herunter. Server 2012 R2 beherrscht TLS 1.2
für Schannel standardmäßig. Scheitert die Verbindung trotzdem, ist fast immer
eine dieser drei Ursachen im Spiel. Die Fehlermeldung von `vpnportal check`
sagt, welche:
| Fehlermeldung enthält | Ursache | Behebung |
|---|---|---|
| `protocol version not supported`, `handshake failure` | TLS 1.2 ist auf dem DC per Registry deaktiviert | `ad.min_tls_version: "1.0"` setzen (siehe unten) |
| `insecure algorithm SHA1-RSA`, `certificate signed by unknown authority` | DC-Zertifikat ist mit SHA-1 signiert | **Zertifikat neu ausstellen** — siehe Kasten |
| `tls: no cipher suite supported by both` | DC bietet nur RSA-Schlüsselaustausch | `GODEBUG=tlsrsakex=1` in der Unit setzen |
**TLS-Mindestversion herabsetzen:**
```yaml
ad:
min_tls_version: "1.0" # Default ist 1.2
```
Das Portal warnt dann bei jedem Start. Die **Zertifikatsprüfung bleibt aktiv**
für LDAP gibt es bewusst keine Möglichkeit, sie abzuschalten. Herabgesetzt
werden nur die zulässigen Protokollversionen und die angebotenen
Cipher-Suiten; RC4 und 3DES werden auch dann nie angeboten.
> **SHA-1-Zertifikate lassen sich nicht mehr umgehen.** Go 1.24 hat den
> Notausgang `GODEBUG=x509sha1=1` ersatzlos entfernt. Ist das LDAPS-Zertifikat
> des Domain Controllers mit SHA-1 signiert — bei ADCS-Vorlagen aus der
> 2012-R2-Ära der Normalfall — hilft nur, es mit SHA-256 neu auszustellen.
> Prüfen lässt sich das so:
>
> ```bash
> openssl s_client -connect dc01.firma.local:636 -showcerts </dev/null 2>/dev/null \
> | openssl x509 -noout -text | grep -i "signature algorithm"
> ```
>
> Steht dort `sha1WithRSAEncryption`, muss das Zertifikat getauscht werden.
**RSA-Schlüsselaustausch erzwingen** (letzte Rettung, keine Forward Secrecy).
Go schaltet diese Suiten seit 1.22 ab; sie lassen sich nur global per GODEBUG
reaktivieren. In der systemd-Unit:
```ini
[Service]
Environment=GODEBUG=tlsrsakex=1
```
### Passwort abgelaufen
Das Portal kann keine Passwörter ändern. Ist ein AD-Passwort abgelaufen