Files
scadaproj/components/secrets
Joseph Doherty eb445ea7e7 docs(secrets): live convergence gate results - SQL hub PASSES 6/6, Akka FAILS
SQL-Server hub topology (ScadaBridge) is live-validated against a real SQL Server
2022 with two nodes: write->resolve via hub, tombstone propagation without
resurrection, bidirectional sweep, partitioned-node local resolution (site
autonomy - the reason hub mode was chosen), and wrong-KEK fail-closed via
SecretDecryptionException.

Akka peer-to-peer topology (OtOpcUa) FAILS the gate: resolving ISecretReplicator
hangs indefinitely in a real clustered process. Reproduced twice on a healthy
2-node cluster; isolated to constructing AkkaSecretReplicator -> ActorRef ->
system.ActorOf, NOT nested DI resolution. The library's own 2-node suite passes,
so the trigger is creation through DI in a hosted process. Root cause not yet
identified.

Impact: OtOpcUa would hang at startup if replication were enabled, since the
startup hook resolves ISecretStore. Harmless today only because the flag defaults
false. Do NOT enable Secrets:Replication:Enabled in OtOpcUa.

The gate did its job - it caught a blocking defect that every offline suite,
including the library's own real-cluster tests, had passed over.
2026-07-18 13:50:35 -04:00
..

Secrets (encrypted secret store + ${secret:} resolution)

Normalizes how the family stores and consumes secrets — SQL/login passwords, API-key HMAC peppers, LDAP bind passwords, connection strings, TLS material — which are handled ad-hoc and inconsistently across the three apps today (Data-Protection-encrypted connection strings in ScadaBridge; peppers/passwords in environment variables; LDAP passwords in appsettings).

The goal is the shared ZB.MOM.WW.Secrets library: AES-256-GCM envelope encryption at rest, a pluggable master-key provider and store, an audited ISecretResolver + ${secret:name} config expander for app runtime, and a Blazor /admin/secrets management UI. The library is built, published (0.1.2), and live-proven via its reference consumer; per-app adoption is the tracked follow-on.

Status

State
Library Built + publishedZB.MOM.WW.Secrets{,.Abstractions,.Ui} 0.1.2 on the dohertj2-gitea feed; .Cli in-repo (not packed); .Akka replicator deferred (design only)
Reference consumer HistorianGateway — adopted + live-proven (2026-07-16): historian password sourced via ${secret:}, authenticated read against the real wonder historian
Three sister apps Not yet adopted — see per-app current-state + GAPS

Per-project current state

Project Today (baseline) Doc
OtOpcUa (code-verified baseline) current-state/otopcua/CURRENT-STATE.md
MxAccessGateway (code-verified baseline) current-state/mxaccessgw/CURRENT-STATE.md
ScadaBridge (code-verified baseline) current-state/scadabridge/CURRENT-STATE.md

Not applicable as a fourth adopter row but the exemplar: HistorianGateway already consumes the lib — its wiring is the template the three apps follow (see the shared-contract "Consumer wiring" section).