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

@ -31,7 +31,10 @@ type Options struct {
BindPassword string
VPNGroup string
CAFile string
Timeout time.Duration
// MinTLSVersion ist die niedrigste akzeptierte TLS-Version (Konstante aus
// crypto/tls). 0 bedeutet TLS 1.2.
MinTLSVersion uint16
Timeout time.Duration
// Dial ist injizierbar; nil = echte LDAP-Verbindung.
Dial func(ctx context.Context, server string) (conn, error)
@ -73,7 +76,7 @@ func NewAD(opts Options) (*AD, error) {
opts.Port = 636
}
if opts.Dial == nil {
opts.Dial = realDialer(opts.Port, opts.TLSMode, opts.CAFile, opts.Timeout)
opts.Dial = realDialer(opts.Port, opts.TLSMode, opts.CAFile, opts.MinTLSVersion, opts.Timeout)
}
a := &AD{opts: opts}
if opts.OnFailover != nil {