Feat v0.6.7 native mtls (#42)
All checks were successful
CI/CD / detect-changes (push) Successful in 4s
CI/CD / test-frontend (push) Successful in 6s
CI/CD / test-go-pg (push) Successful in 2m37s
CI/CD / test-sqlite (push) Successful in 2m48s
CI/CD / build-and-deploy (push) Successful in 52s

Co-authored-by: Jeffrey Smith <jasafpro@gmail.com>
Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
This commit was merged in pull request #42.
This commit is contained in:
2026-03-31 18:36:12 +00:00
committed by xcaliber
parent 7915d84c8b
commit fb5284f667
14 changed files with 1138 additions and 209 deletions

View File

@@ -59,6 +59,11 @@ func main() {
startTime := time.Now()
cfg := config.Load()
// Validate TLS_MODE early
if err := config.ValidateTLSMode(cfg.TLSMode); err != nil {
log.Fatalf("❌ %v", err)
}
// Structured logging — must be first so all subsequent
// log output goes through slog.
logging.Init(cfg.LogFormat, cfg.LogLevel)
@@ -349,13 +354,24 @@ func main() {
case auth.ModeBuiltin:
authProvider = auth.NewBuiltinProvider()
case auth.ModeMTLS:
authProvider = auth.NewMTLSProvider(auth.MTLSConfig{
HeaderDN: cfg.MTLSHeaderDN,
HeaderVerify: cfg.MTLSHeaderVerify,
HeaderFingerprint: cfg.MTLSHeaderFingerprint,
AutoActivate: cfg.MTLSAutoActivate,
DefaultTeam: cfg.MTLSDefaultTeam,
})
if cfg.TLSMode == config.TLSModeMTLS {
// Native mTLS: Go binary terminates TLS, reads peer certs directly
authProvider = auth.NewMTLSNativeProvider(auth.MTLSNativeConfig{
AutoActivate: cfg.MTLSAutoActivate,
DefaultTeam: cfg.MTLSDefaultTeam,
})
log.Printf(" Auth: native mTLS (TLS_MODE=mtls)")
} else {
// Proxy mTLS: reverse proxy terminates TLS, injects headers
authProvider = auth.NewMTLSProxyProvider(auth.MTLSProxyConfig{
HeaderDN: cfg.MTLSHeaderDN,
HeaderVerify: cfg.MTLSHeaderVerify,
HeaderFingerprint: cfg.MTLSHeaderFingerprint,
AutoActivate: cfg.MTLSAutoActivate,
DefaultTeam: cfg.MTLSDefaultTeam,
})
log.Printf(" Auth: proxy mTLS (headers)")
}
case auth.ModeOIDC:
var err error
authProvider, err = auth.NewOIDCProvider(auth.OIDCConfig{
@@ -893,8 +909,26 @@ func main() {
}
log.Printf(" EventBus: ready, WebSocket on %s/ws", cfg.BasePath)
log.Printf(" Pages: template engine active (%d surfaces registered)", len(pageEngine.Surfaces()))
if err := r.Run(":" + cfg.Port); err != nil {
log.Fatalf("Failed to start server: %v", err)
addr := ":" + cfg.Port
if cfg.TLSMode == config.TLSModeNone || cfg.TLSMode == "" {
if err := r.Run(addr); err != nil {
log.Fatalf("Failed to start server: %v", err)
}
} else {
tlsCfg, err := config.BuildTLSConfig(cfg)
if err != nil {
log.Fatalf("❌ TLS config error: %v", err)
}
srv := &http.Server{
Addr: addr,
Handler: r,
TLSConfig: tlsCfg,
}
log.Printf(" TLS: mode=%s", cfg.TLSMode)
if err := srv.ListenAndServeTLS(cfg.TLSCert, cfg.TLSKey); err != nil {
log.Fatalf("Failed to start TLS server: %v", err)
}
}
}