feat(auth): ad.max_tls_version zum Deckeln der angebotenen TLS-Version

Alte Schannel-Stacks brechen an einem TLS-1.3-ClientHello kommentarlos ab:
sie nehmen die TCP-Verbindung an, lesen den ClientHello und setzen zurueck,
ohne ein Zertifikat zu schicken. Herunterhandeln hilft dann nicht — TLS 1.3
darf gar nicht erst angeboten werden.

max_tls_version (Default 1.3) deckelt die Hoechstversion; die Validierung
lehnt eine Hoechstversion unterhalb der Mindestversion ab.

check erkennt zusaetzlich zurueckgesetzte Verbindungen und nennt die beiden
plausiblen Ursachen: fehlendes LDAPS-Zertifikat auf dem Server oder
TLS-1.3-Inkompatibilitaet.

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:36:03 +02:00
parent fd88251e07
commit 11a3ec2e5f
10 changed files with 136 additions and 10 deletions

View file

@ -67,7 +67,11 @@ type ADConfig struct {
// MinTLSVersion ist die niedrigste akzeptierte TLS-Version zum
// Verzeichnisdienst: "1.0", "1.1", "1.2" (Default) oder "1.3".
// Unter 1.2 nur für Altsysteme, die nichts Besseres können.
MinTLSVersion string `yaml:"min_tls_version"`
MinTLSVersion string `yaml:"min_tls_version"`
// MaxTLSVersion deckelt die angebotene TLS-Version, Default "1.3".
// Auf "1.2" setzen, wenn ein alter Schannel-Stack den Verbindungsaufbau
// bereits am TLS-1.3-ClientHello abbricht.
MaxTLSVersion string `yaml:"max_tls_version"`
BindUser string `yaml:"bind_user"`
BindPassword string `yaml:"bind_password"`
BindPasswordFile string `yaml:"bind_password_file"`
@ -101,6 +105,7 @@ func Defaults() *Config {
Port: 636,
TLSMode: "ldaps",
MinTLSVersion: "1.2",
MaxTLSVersion: "1.3",
Timeout: Duration(8 * time.Second),
},
Matching: MatchingConfig{CNPattern: "{username}"},