Skip to content

feat(e2e): Add tunnel establishment E2E tests (T-6.1)#5176

Closed
obtFusi wants to merge 30 commits intonetbirdio:mainfrom
silentspike:feature/t6.1-e2e-tunnel-tests
Closed

feat(e2e): Add tunnel establishment E2E tests (T-6.1)#5176
obtFusi wants to merge 30 commits intonetbirdio:mainfrom
silentspike:feature/t6.1-e2e-tunnel-tests

Conversation

@obtFusi
Copy link
Copy Markdown

@obtFusi obtFusi commented Jan 25, 2026

Summary

  • Add PowerShell E2E test script for tunnel establishment validation
  • Add Go GUID-based WireGuard interface verification
  • Add GitHub Actions workflow for lab testing

Test Cases Implemented

Test Description Status
TC1.1 Service Running
TC1.2 WireGuard Interface
TC1.3 Route to DC Network
TC1.4 DC LDAP (389/TCP)
TC1.5 DC Kerberos (88/TCP)
TC1.6 DC DNS (53/TCP)
TC1.7 Kerberos TGT
TC2.1 LDAP SRV Record
TC3.1 Kerberos SRV (UDP)
TC3.2 Kerberos SRV (TCP)
TC4.1 DC Discovery (nltest)
TC4.2 UDP Kerberos Indicator

Test Evidence (Windows 11 VM - 10.0.0.160)

============================================================
  TEST SUMMARY
============================================================

  Passed:  8
  Failed:  5  (Expected: Service not installed, NRPT not configured)
  Skipped: 1

  Pass Rate: 61.5%

Files Changed

  • scripts/tests/Test-TunnelEstablishment.ps1 - PowerShell E2E test script
  • client/internal/tunnel/interface_windows.go - Go interface verification (Windows)
  • client/internal/tunnel/interface_other.go - Stub for non-Windows
  • .github/workflows/e2e-tunnel.yml - CI workflow for lab testing

Test Plan

  • PowerShell syntax validated
  • Go code compiles for Windows
  • Tests executed on Windows 11 VM
  • TC1.2-TC1.6 pass (connectivity tests)
  • TC2.1b pass (SRV discovery via nslookup)
  • TC4.1-TC4.2 pass (DC discovery)

Closes #54

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added machine tunnel bootstrap with mTLS authentication support for domain-joined Windows devices
    • Added automated certificate enrollment and validation for secure machine authentication
    • Added domain connectivity validation and pre-join requirement checks
    • Added PowerShell automation scripts for client bootstrap, domain join, and configuration management
  • Build & Infrastructure

    • Added multi-platform build targets supporting Windows and Linux builds
    • Added automated dependency update management via Dependabot
    • Added pre-commit code quality and security validation checks
  • Testing & Verification

    • Added end-to-end tunnel establishment test suite
    • Added lab CA setup and certificate template configuration utilities
    • Added client certificate enrollment and verification tools
  • Documentation

    • Added GitHub issue templates and workflow automation
    • Added architecture decision records for mTLS and cryptography strategies

✏️ Tip: You can customize this high-level summary in your review settings.

obtFusi and others added 30 commits January 18, 2026 02:54
- PR lint workflow (Conventional Commits validation)
- Auto-label workflow (Epic/Story/Task + type detection)
- Dependabot config (Go, Docker, GitHub Actions)
- Issue templates (Bug, Feature, Epic, Story, Task)
- PR template with checklist

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
ci: add GitHub configuration from network-agent pattern
Implements server-side mTLS authentication infrastructure:

- MTLSIdentity extraction from client certificates
- SAN DNSName as primary identity (not CN!)
- Template OID (v2) and Template Name (v1) parsing
- BMPString (UTF-16BE) decoding for AD CS templates
- PeerType determination (machine/user/unknown)
- Issuer fingerprint via VerifiedChains (strong binding)
- gRPC interceptors (unary + stream) with method-based routing

Includes:
- ADR-001: mTLS Port Strategy
- ADR-002: CNG Signer Interface (for T-1.1)
- Test certificates for unit tests
- Comprehensive test coverage

Closes #14 (T-1.2)
Closes #15 (T-1.3)
Refs #13 (T-1.1 blocked - needs Windows)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Security audit documents should not be committed to public repository.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
T-1.1: CNG crypto.Signer spike (spike/cng-signer/)
- Pure Go Windows CNG integration via golang.org/x/sys/windows
- Non-exportable private key signing with crypto.Signer interface
- Tested on DC01: 1.6ms signing latency, no CGO required
- Fixed CertDuplicateCertificateContext bug for context retention

T-1.3: SAN/Template parser spike (spike/san-parser/)
- Extracts SAN DNSName (primary identity, NOT CN)
- Parses AD CS Template OID/Name from extensions
- Determines PeerType (machine/user) from template analysis
- Tested on DC01: All checks passed

Also includes:
- scripts/lab/autounattend.xml for Windows VM provisioning

Closes #13, #15

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- setup-lab-ca.ps1: Automates AD CS setup, template creation, GPO
- verify-lab-ca.ps1: Validates CA configuration (7 checks)
- test-client-enrollment.ps1: Tests machine cert enrollment via SYSTEM context

Key improvements based on T-2.7 learnings:
- Machine cert enrollment requires SYSTEM context (Scheduled Task)
- Template created via ADSI with proper flags
- RPC port range restriction (5000-5100) for firewall

Closes #24

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix regex for CA name parsing (pipe to Out-String)
- Cast PropertyValueCollection to int for bitwise ops
- Fix GPO link check using Get-ADObject
- Fix RPC port range regex

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- RegisterMachinePeer, SyncMachinePeer, GetMachineRoutes, ReportMachineStatus
- MachineIdentity, MachineRegisterRequest/Response, MachineSyncRequest/Response
- MachineRoutesRequest/Response, MachineStatusRequest/Response
- MachineUpdateType enum

Refs #27

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements T-3.4: AllowedDomains pro-Account Scoping

- Add AccountID and MatchedDomain fields to MTLSIdentity struct
- Add MTLSDomainAccountMapping and MTLSAccountAllowedDomains config
- Implement getAccountIDFromDomain() for domain-to-account mapping
- Implement getAllowedDomainsForAccount() for per-account domain lists
- Implement validateDomainForAccount() for cross-tenant prevention
- Add checkMultiAccountSpan() for security logging
- Update extractMTLSIdentity() to validate against account domains
- Add comprehensive unit tests for account mapping

Security: Prevents cross-tenant certificate acceptance by validating
that certificate SANs match only the mapped account's allowed domains.
Fail-safe: No configured domains = reject all.

Closes #30

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement gRPC handlers for machine peer registration using mTLS:
- RegisterMachinePeer: Register machine peers via certificate auth
- SyncMachinePeer: Streaming sync for machine peers (stub)
- GetMachineRoutes: Retrieve DC routes for machine peers (stub)
- ReportMachineStatus: Machine status reporting

Architectural changes:
- Create shared/mtls package for Identity type to avoid import cycles
- Update mtls_auth.go to use shared Identity via type alias
- Remove duplicate GetMTLSIdentity function

The handlers extract mTLS identity from context (set by interceptor)
and use AccountID from domain-account mapping for multi-tenant isolation.

Closes #32

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…ll mTLS support

Implements all features from Issue #32:

1. validateIssuerCA - CA-Fingerprint validation per account
   - Added MTLSAccountAllowedIssuers config field
   - ValidateIssuerCA function in shared/mtls package
   - Per Security Review: Empty allowlist = DENY (explicit config required)

2. Meta fields for audit trail
   - Extended PeerSystemMeta with mTLS-specific fields:
     - PeerType, AuthMethod, CertDNSName, CertDomain
     - CertIssuerFP, CertSerial, CertTemplate
     - FirstAuthTime, LastCertAuthTime
   - extractMachinePeerMeta enriches metadata with mTLS identity

3. Re-registration logic
   - LoginPeer handles both new and existing peers
   - Cross-account registration blocked (security check)
   - mTLS metadata updated on re-registration

4. Security validations
   - Issuer CA validation in all Machine Tunnel RPCs
   - Account isolation via MTLSIdentity.AccountID
   - Fingerprint-based comparison (not DN string matching)

5. Rate-limit/Replay protection: Stubbed for MVP (TODO)

Files changed:
- config/config.go: Added MTLSAccountAllowedIssuers
- mtls_auth.go: Added ValidateIssuerCA, MTLSConfig updated
- shared/mtls/identity.go: ValidatorConfig, ValidateIssuerCA
- shared/grpc/machine_tunnel.go: Full implementation
- server/peer/peer.go: Extended PeerSystemMeta with mTLS fields

Closes #32

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements unique DNS label generation for mTLS-authenticated peers
to prevent hostname collisions across different domains.

Features:
- GenerateUniqueDNSLabel: Creates FQDN-hash based labels
  Example: "win10-pc.customer-a.local" -> "win10-pc-a1b2c3d4"
- ValidateDNSLabel: RFC 1123 compliance check
- sanitizeForDNS: Hostname sanitization (underscores, spaces -> hyphens)
- CheckDNSLabelCollision: Helper for collision detection

Technical details:
- 32-bit SHA256 hash suffix (8 hex chars) for ~0.001% collision rate
- Automatic hostname truncation for labels > 63 chars
- Case-insensitive FQDN hashing
- Fallback to IP-based label on validation failure

Integration:
- AddPeer in peer.go now uses hash-based labels for mTLS peers
- Detection via peer.Meta.CertDNSName and peer.Meta.CertDomain fields

Unit tests:
- Uniqueness across domains/hostnames
- Truncation for long hostnames
- RFC 1123 validation (all edge cases)
- Sanitization (underscores, spaces, special chars)

Closes #33

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add MTLSServer type with RequireAndVerifyClientCert on port 33074
- Add MTLSPort config option for dedicated mTLS-only server
- Integrate mTLS server lifecycle into BaseServer (Start/Stop)
- Add GetMTLSServer() for external service registration
- Load CA pool from directory (.crt/.pem/.cer) and/or single file
- Initialize mTLS validator config with account-issuer mappings
- TLS 1.2+ minimum required for mTLS connections

Port 33073 (standard): NoClientCert - user auth, setup keys
Port 33074 (mTLS): RequireAndVerifyClientCert - machine tunnel only

Closes #34

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix duplicate word 'LoginPeer' in comment (machine_tunnel.go)
- Convert if-else chains to switch statements (mtls_auth.go, peer.go)
- Add nolint directive for deprecated Audience field test (conversion_test.go)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
We had both .github/PULL_REQUEST_TEMPLATE.md (our custom) and
.github/pull_request_template.md (upstream). On macOS with its
case-insensitive filesystem, this causes git diff failures in CI.

Keep the upstream template (lowercase) for compatibility.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
We had both .github/PULL_REQUEST_TEMPLATE.md (our custom) and
.github/pull_request_template.md (upstream). On macOS with its
case-insensitive filesystem, this causes git diff failures in CI.

Keep the upstream template (lowercase) for compatibility.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
feat(server): Complete S-3 Server mTLS Implementation
Adds Dockerfile.multistage that builds the management server binary
inside a golang:1.25 container, solving the ar archive issue.

Problem: Building with `go build ./management/cmd/` produced an ar
archive instead of an ELF executable because cmd/ has `package cmd`
(library), not `package main`.

Solution: Use `go build ./management/` which contains main.go with
`package main` and `func main()`.

Benefits:
- No cross-compilation issues (builds inside Linux container)
- Produces correct ELF binary (~52MB)
- Smaller final image (ubuntu:24.04 base)
- Build flags: -ldflags="-s -w" for smaller binary

Usage:
  docker build -f management/Dockerfile.multistage -t netbird-fork/management:latest .

Relates to: #93 (T-3.9: Deploy Fork to Lab)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…-5.1)

Implement Bootstrap() method that supports two-phase authentication:
- Phase 1: Setup-Key authentication for initial enrollment (before cert)
- Phase 2: mTLS authentication with machine certificate (after AD CS enrollment)

Components:
- bootstrap.go: Main bootstrap logic with hasMachineCert() check
- bootstrap_test.go: Unit tests for all edge cases (15 tests passing)

The bootstrap automatically selects the appropriate auth method:
- If MachineCertEnabled and valid cert exists: use mTLS via RegisterMachinePeer RPC
- Otherwise: fall back to Setup-Key via standard Login/Register RPC

Closes #47

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement DC connectivity checks and domain join helpers:
- CheckDCConnectivity: Validates LDAP, Kerberos, DNS, SMB, NTP ports
- ValidatePreJoinRequirements: Pre-join checklist with all requirements
- GenerateDomainJoinScript: Generates PowerShell script for domain join

PowerShell bootstrap script (scripts/bootstrap-new-client.ps1):
- Full Phase 1 → Domain Join → Cert → Phase 2 workflow
- NTP sync with public NTP (pre-tunnel) and DC (pre-join)
- DC connectivity verification via tunnel
- Certificate enrollment via AD CS (certreq)
- Config update for mTLS transition

Tests: 18 new tests for DC connectivity and domain join (all passing)

Closes #48

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use net.JoinHostPort() for TCP and UDP port checks (IPv6 compatible)
- Extract credential prompt to constant with nolint directive
- The prompt message is NOT a credential, just UI text

Part of T-5.2

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
feat(build): Add multi-stage Dockerfile for management server
…-fallback

feat(client): Add machine tunnel bootstrap and domain join (T-5.1, T-5.2)
- Add ValidateMachineCertificate() for machine cert validation
- Add GenerateCertEnrollmentScript() for AD CS enrollment via certreq
- Add ParseCertificateFile() for cert info extraction
- Add NeedsRenewal() for certificate renewal detection
- Add WatchCertificateExpiry() for proactive renewal monitoring
- Add ExtractIssuerFingerprint() for mTLS issuer verification
- 32 tests covering all cert validation scenarios

Validates:
- SAN DNSNames (not CN!) matching hostname.domain format
- Certificate expiry and minimum validity
- Renewal threshold (30 days before expiry)
- Case-insensitive hostname matching
- Certificate chain for issuer fingerprint

Closes T-5.3

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add comprehensive PowerShell scripts for test environment management:

- reset-netbird-machine.ps1: Safely reset NetBird Machine Tunnel
  - Stops and removes service
  - Removes WireGuard interface
  - SCOPED NRPT cleanup (only NetBird-Machine-* prefix, not all rules!)
  - SCOPED firewall rule cleanup
  - Optional config backup

- verify-nrpt-cleanup.ps1: Verify NRPT cleanup
  - Checks both registry paths (Policy and Dnscache)
  - Checks PowerShell Get-DnsClientNrptRule
  - Reports any remaining NetBird rules

- reinstall-and-test.ps1: Automated reinstall and test cycle
  - Full reset -> install -> start -> verify workflow
  - Waits for tunnel establishment
  - Basic connectivity tests

CRITICAL: Uses Registry-based scoped cleanup to avoid removing
other NRPT rules (GPO, VPN, etc.)

Closes T-5.5

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
feat(scripts): Add reset and test scripts for Windows VM testing (T-5.5)
feat(tunnel): Add certificate enrollment after domain join (T-5.3)
- Update to v2.0.0 with Smart Cert Selection (no thumbprint needed)
- Add REVOKE Setup-Key warning at script end (Step 8)
- Redact Setup-Key in logs (show only last 4 chars: ****-****-****-****-XXXX)
- Add security documentation in .NOTES:
  - SHA256 checksum verification instructions
  - Authenticode signing instructions
  - Setup-Key handling best practices
- Step 7 now uses machine_cert_template_name + machine_cert_san_must_match
- Remove hardcoded thumbprint requirement

Tested on Windows VM in WhatIf mode - all 8 steps execute correctly.

Closes #50

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
feat(scripts): T-5.4 Bootstrap Script v2.0 with Smart Selection
- Add PowerShell test script (Test-TunnelEstablishment.ps1) with:
  - TC1: Boot + Login tests (Service, Interface, Routes, DC connectivity)
  - TC2: DNS-SRV Discovery for LDAP
  - TC3: DNS-SRV Discovery for Kerberos (UDP/TCP)
  - TC4: UDP Kerberos connectivity validation
  - Proper CI exit codes and formatted output

- Add Go GUID-based interface verification:
  - FindWireGuardInterface() with priority search (GUID > Description > Name)
  - VerifyInterface() for status validation
  - HasRouteToNetwork() for route checking
  - Windows-specific via winipcfg, stubs for other platforms

- Add GitHub Actions workflow (e2e-tunnel.yml):
  - Manual workflow_dispatch for lab testing
  - PowerShell syntax validation
  - Test result documentation

Tested on Windows 11 VM (10.0.0.160):
- TC1.2-TC1.6: PASS (WireGuard interface, routes, DC connectivity)
- TC2.1b: PASS (LDAP SRV via nslookup)
- TC4.1-TC4.2: PASS (DC discovery, UDP Kerberos)

Closes #54

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@CLAassistant
Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@obtFusi
Copy link
Copy Markdown
Author

obtFusi commented Jan 25, 2026

Wrong repo - meant for fork

@obtFusi obtFusi closed this Jan 25, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 25, 2026

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

Introduces comprehensive Windows machine tunnel support with mTLS-based authentication for pre-login VPN scenarios. Adds client-side bootstrap logic for certificate-based authentication, management server mTLS support with multi-tenant domain-to-account mapping, domain join validation utilities, protocol definitions for machine peer registration and sync, and extensive PowerShell automation scripts for lab setup and client onboarding.

Changes

Cohort / File(s) Summary
Pre-commit hooks
.githooks/pre-commit
Enforces code formatting (gofmt) and secret detection on staged files; exits with error on violations.
GitHub repository configuration
.github/ISSUE_TEMPLATE/bug_report.md, .github/ISSUE_TEMPLATE/epic.md, .github/ISSUE_TEMPLATE/story.md, .github/ISSUE_TEMPLATE/task.md, .github/ISSUE_TEMPLATE/feature_request.md, .github/ISSUE_TEMPLATE/config.yml
Introduces German-language issue templates (bug reports, epics, stories, tasks) and disables blank issues; adds contact links to documentation and discussions.
GitHub Actions workflows
.github/workflows/auto-label.yml, .github/workflows/pr-lint.yml, .github/workflows/e2e-tunnel.yml
Adds auto-labeling for issues/PRs based on title/prefix patterns, conventional commits linting, and manual end-to-end tunnel testing workflow with validation and documentation steps.
Dependabot and build configuration
.github/dependabot.yml, Makefile, .gitignore
Configures Dependabot for gomod/github-actions/docker; adds cross-platform build targets (Windows, Linux) with version injection; refines VSCode config exclusions.
Client tunnel bootstrap
client/internal/tunnel/bootstrap.go, client/internal/tunnel/bootstrap_test.go
Implements two-phase machine tunnel authentication (Setup-Key phase 1, mTLS phase 2) with automatic fallback; includes certificate validation, mTLS client setup, and WireGuard key generation.
Certificate enrollment
client/internal/tunnel/certenroll.go, client/internal/tunnel/certenroll_test.go
Provides certificate validation, renewal detection, AD CS enrollment script generation, and certificate metadata extraction; includes certificate expiry watching and issuer fingerprint handling.
Domain join utilities
client/internal/tunnel/domainjoin.go, client/internal/tunnel/domainjoin_test.go
Validates DC connectivity (LDAP, Kerberos, DNS, SMB, NTP), pre-join requirements, and generates domain join PowerShell scripts with credential/OU/restart options.
WireGuard interface discovery
client/internal/tunnel/interface_windows.go, client/internal/tunnel/interface_other.go
Implements platform-specific interface discovery via GUID/description/name matching on Windows; returns not-supported errors on non-Windows platforms.
Management server mTLS infrastructure
management/internals/server/mtls_auth.go, management/internals/server/mtls_auth_test.go, management/internals/server/mtls_server.go, management/internals/server/boot.go
Adds mTLS interceptors with multi-tenant domain-to-account mapping, issuer CA validation, peer type determination from certificate templates, and separate mTLS-enabled gRPC server on dedicated port.
Management server machine tunnel RPC
management/internals/shared/grpc/machine_tunnel.go
Implements RegisterMachinePeer, SyncMachinePeer (skeleton), GetMachineRoutes (skeleton), and ReportMachineStatus RPCs with mTLS identity extraction and audit logging.
Management server configuration and lifecycle
management/internals/server/config/config.go, management/internals/server/server.go, management/internals/shared/mtls/identity.go, management/internals/shared/mtls/dnslabel.go, management/internals/shared/mtls/dnslabel_test.go
Extends HttpServerConfig with MTLS fields, adds BaseServer.GetMTLSServer accessor, implements shared mTLS Identity context propagation, and provides RFC 1123-compliant DNS label generation with hash-based collision resistance.
Management server peer metadata
management/server/peer/peer.go, management/server/peer.go
Extends PeerSystemMeta with mTLS certificate/authentication fields (PeerType, AuthMethod, CertDNSName, CertDomain, etc.); integrates DNS label generation for mTLS peers.
Protocol definitions
shared/management/proto/management.proto
Adds four machine tunnel RPCs (RegisterMachinePeer, SyncMachinePeer, GetMachineRoutes, ReportMachineStatus) and supporting messages (MachineIdentity, MachineRegisterRequest/Response, machine config/route/status payloads) with no EncryptedMessage wrapper.
PowerShell bootstrap automation
scripts/bootstrap-new-client.ps1, scripts/reset-netbird-machine.ps1, scripts/reinstall-and-test.ps1
Orchestrates multi-phase machine tunnel onboarding: NTP sync, tunnel setup with Setup-Key, DC connectivity validation, domain join, certificate enrollment, and mTLS configuration; includes service/interface cleanup and reinstall workflows.
Lab environment setup
scripts/lab/autounattend.xml, scripts/lab/setup-lab-ca.ps1, scripts/lab/test-client-enrollment.ps1, scripts/lab/verify-lab-ca.ps1
Provides unattended Windows Server setup, AD CS lab CA provisioning with NetBirdMachine template and auto-enrollment GPO, automated client enrollment testing, and comprehensive CA verification with DCOM/RPC configuration.
Lab testing and verification
scripts/tests/Test-TunnelEstablishment.ps1, scripts/verify-nrpt-cleanup.ps1
End-to-end tunnel establishment test suite validating DC connectivity, DNS-SRV/Kerberos discovery, and UDP reachability; includes NRPT rule cleanup verification after reset.
Documentation and analysis
docs/ADR-001-mTLS-Port-Strategy.md, docs/ADR-002-CNG-Signer-Interface.md
Documents decision on single mTLS port with method-based routing using VerifyClientCertIfGiven, and Windows-only CNG crypto.Signer wrapper for non-exportable machine certificate keys.
Test certificates and utilities
test/certs/{ca,client,server}.{crt,key,csr,cnf}, test/certs/ca.srl, management/internals/shared/grpc/conversion_test.go
Provides PKI test infrastructure with CA, client, and server certificates for mTLS testing; adds nolint directive for deprecated JWT audience field.
Spike implementations
spike/cng-signer/{go.mod,main.go}, spike/san-parser/{go.mod,main.go}
Proof-of-concept implementations for Windows CNG-backed crypto.Signer and AD CS certificate SAN/template parsing with peer type classification.
Container build
management/Dockerfile.multistage
Multi-stage Docker build for management component using golang:1.25 builder and ubuntu:24.04 runtime with ca-certificates.

Sequence Diagram(s)

sequenceDiagram
    participant Client as NetBird Client
    participant MGM as Management Server
    participant CA as AD CS
    participant DC as Domain Controller
    participant Tunnel as WireGuard Tunnel

    Client->>Client: Phase 0: Pre-Tunnel NTP Sync
    Client->>Tunnel: Phase 1: Start tunnel with Setup-Key
    Client->>MGM: Login/Register (Setup-Key auth)
    MGM-->>Client: Peer config
    Tunnel-->>Client: Tunnel up
    
    Client->>DC: Check DC Connectivity via tunnel
    DC-->>Client: LDAP/Kerberos/DNS reachable
    
    Client->>Client: NTP sync with DC
    Client->>DC: Domain Join via tunnel
    DC-->>Client: Domain join complete
    
    Client->>CA: Enroll machine certificate (certreq)
    CA-->>Client: Machine certificate issued
    
    Client->>Client: Update config for mTLS
    Client->>MGM: RegisterMachinePeer (mTLS Phase 2)
    MGM->>MGM: Validate mTLS identity from cert
    MGM-->>Client: MachineRegisterResponse
    
    Client->>Tunnel: Switch to mTLS authenticated tunnel
    Client->>MGM: SyncMachinePeer (streaming, mTLS)
    MGM-->>Client: Network map & routes
Loading
sequenceDiagram
    participant Client as Machine Client
    participant MTLSServer as mTLS Server (Port 33074)
    participant Interceptor as mTLS Interceptor
    participant Validator as Identity Validator
    participant AccountMgr as Account Manager

    Client->>MTLSServer: RegisterMachinePeer (TLS client cert)
    MTLSServer->>Interceptor: Extract TLS state
    Interceptor->>Validator: Get identity from cert
    Validator->>Validator: Validate SAN DNSName
    Validator->>Validator: Map domain → account
    Validator->>Validator: Validate issuer CA fingerprint
    Validator-->>Interceptor: MTLSIdentity (with AccountID)
    Interceptor->>Interceptor: Inject into context
    MTLSServer->>AccountMgr: LoginPeer (machine metadata)
    AccountMgr-->>MTLSServer: Login response
    MTLSServer-->>Client: MachineRegisterResponse
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans multiple heterogeneous subsystems with dense logic: client-side two-phase bootstrap with fallback logic, certificate enrollment and validation, domain join orchestration, multi-tenant mTLS authentication with domain-to-account mapping and issuer validation, Windows-specific interface discovery, extensive PowerShell automation, and new protocol definitions. The 31+ new files, cross-cutting concerns (certificate handling, Windows APIs, gRPC interceptors), and integration points between client and server components require careful examination of both individual component correctness and interaction semantics.

Possibly related PRs

Suggested reviewers

  • pascal-fischer

🐰 A tunnel is born with cryptographic grace,
Machines authenticate in their rightful place,
With certs and keys and domains aligned,
Pre-login VPN leaves no peer behind—
Two phases dance, then settle secure,
mTLS keeps the bad guys out for sure!

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
12 New issues
3 Security Hotspots
C Security Rating on New Code (required ≥ A)
10 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

types: [opened]

permissions:
issues: write

Check notice

Code scanning / SonarCloud

Write permissions should be defined at the job level Low

Move this write permission from workflow level to job level. See more on SonarQube Cloud

permissions:
issues: write
pull-requests: write

Check notice

Code scanning / SonarCloud

Write permissions should be defined at the job level Low

Move this write permission from workflow level to job level. See more on SonarQube Cloud
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support peer registration on management service (client)

3 participants