Stella Ops Signer Architecture

Verified against commit 942a18727c (2026-09-26, DOC-2 of SPRINT_20260926_001). Re-verify by reading the evidence paths listed in the Evidence section.

Signer is the key-custody and DSSE-signing service of the trust domain. It is a live, separate deployable (compose key signer) with its own database. Its source lives under src/Attestor/StellaOps.Signer/ (WebService, Core, Infrastructure, Contracts, Tests), with key rotation and trust-anchor logic in src/Attestor/__Libraries/StellaOps.Signer.KeyManagement/, keyless support in src/Attestor/__Libraries/StellaOps.Signer.Keyless/, and the database in src/Attestor/__Libraries/StellaOps.Signer.Persistence/. The src/Attestor/ placement is a source root only: the attestor deployable was retired on 2026-09-05 and its attestation capability runs in the Evidence family (../evidence/architecture.md).

Related: Signer README (HTTP contract detail), no-merge decision, cryptography.

Deployment

AspectValueSource
Compose key / containersigner / ${STELLAOPS_ESTATE_PREFIX:-stellaops}-signerdevops/compose/docker-compose.stella-services.yml, devops/release/bundle/docker-compose.yml
Imagestellaops/signer (one image; regional overlays mount crypto packs)same; devops/compose/docker-compose.compliance-{eu,russia,china}.yml
Listen / aliashttp://+:8441, signer.stella-ops.localsame
Router registrationservice name signer, consumer group signerProgram.cs (AddRouterMicroservice), bundle env Router__Messaging__ConsumerGroup
Depends onauthority, postgres, valkey (bundle)devops/release/bundle/docker-compose.yml
Databasestellaops_signer, schema signer, variable STELLAOPS_POSTGRES_SIGNER_CONNECTION (compose refuses to render without it)SignerPersistenceExtensions.cs, bundle env
Opt-in overlaysdocker-compose.signer.yml (own-database cutover recipe), docker-compose.offlinekit-signer.yml (OfflineKit package-signing staging)devops/compose/

Runtime at a glance (source-grounded)

Verified against src/Attestor/StellaOps.Signer/ on this checkout.

HTTP endpoints

Routes and policies as registered in Program.cs / the *Endpoints.cs files.

Method & pathPolicy (scope)Source
GET /none (readiness banner)Program.cs
GET /healthz, GET /readyzanonymousProgram.cs (SIGNER_HEALTH-01)
GET /internal/plugins/statusanonymousProgram.cs — crypto-provider pack readiness (provider names, pack status)
POST /internal/plugins/probeanonymousProgram.cs — crypto-provider pack probe
build-info endpoint (MapBuildInfoEndpoint)anonymousProgram.cs — version/build banner
GET /doctor/signer/checksSigner.DoctorHealth → ops.healthProgram.cs (MapServiceDoctorEndpoints("signer")), checks in Doctor/SignerDoctorChecks.cs
GET /openapi/* (MapOpenApi)anonymousProgram.cs — OpenAPI document
POST /api/v1/signer/sign/dsseSigner.Sign → signer:signSignerEndpoints
POST /api/v1/signer/verify/dsseSigner.Verify → signer:readSignerEndpoints
GET /api/v1/signer/verify/referrers?digest=Signer.Verify → signer:readSignerEndpoints
POST /api/v1/anchors/{anchorId}/keysSigner.KeyManagement → signer:rotateKeyRotationEndpoints
POST /api/v1/anchors/{anchorId}/keys/{keyId}/revokeSigner.KeyManagement → signer:rotateKeyRotationEndpoints
GET /api/v1/anchors/{anchorId}/keys/{keyId}/validitySigner.KeyManagement → signer:rotateKeyRotationEndpoints
GET /api/v1/anchors/{anchorId}/keys/historySigner.KeyManagement → signer:rotateKeyRotationEndpoints
GET /api/v1/anchors/{anchorId}/keys/warningsSigner.KeyManagement → signer:rotateKeyRotationEndpoints
POST /api/v1/ceremoniesSigner.CeremonyCreate → signer:signCeremonyEndpoints
GET /api/v1/ceremoniesSigner.CeremonyRead → signer:readCeremonyEndpoints
GET /api/v1/ceremonies/{ceremonyId}Signer.CeremonyRead → signer:readCeremonyEndpoints
POST /api/v1/ceremonies/{ceremonyId}/approveSigner.CeremonyApprove → signer:signCeremonyEndpoints
POST /api/v1/ceremonies/{ceremonyId}/executeSigner.CeremonyExecute → signer:adminCeremonyEndpoints
DELETE /api/v1/ceremonies/{ceremonyId}Signer.CeremonyCancel → signer:adminCeremonyEndpoints

Notes:

Scopes

The Signer scope constants live in StellaOps.Auth.Abstractions/StellaOpsScopes.cs:

Configuration keys

Bound in Program.cs:

DSSE signing notes

Evidence

ClaimSource
Host, policies, health, plugin, build-info and Doctor routessrc/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/Program.cs
Policy namessrc/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/Security/SignerPolicies.cs
Signing and verification routessrc/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/Endpoints/SignerEndpoints.cs
Ceremony routessrc/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/Endpoints/CeremonyEndpoints.cs
Key-rotation routessrc/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/Endpoints/KeyRotationEndpoints.cs
Scopes signer:read, signer:sign, signer:rotate, signer:admin, ops.healthsrc/Authority/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs
Tables and startup migrationssrc/Attestor/__Libraries/StellaOps.Signer.Persistence/Migrations/001_signer_consolidated_baseline.sql, 002_dsse_request_replays.sql; Extensions/SignerPersistenceExtensions.cs
Frozen KeyManagement predecessor migrationssrc/__Obsoleted/Attestor/__Libraries/StellaOps.Signer.KeyManagement/Migrations/
Audit retention keys Signer:AuditRetention:*src/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/Retention/
Doctor check ids doctor.signer.*src/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/Doctor/SignerDoctorChecks.cs
Profile algorithm pins, CAdES-B companion, cadenced wrappersrc/__Libraries/StellaOps.Cryptography.Dsse.Signing/CryptoDsseSigner.cs, DsseSignerOptions.cs, CadencedEnvelopeBuilder.cs
Deployment wiringdevops/compose/docker-compose.stella-services.yml, devops/release/bundle/docker-compose.yml, devops/compose/docker-compose.compliance-eu.yml, devops/compose/docker-compose.signer.yml, devops/compose/docker-compose.offlinekit-signer.yml