feat(release): Authenticode-sign releases with Azure Artifact Signing over OIDC #96

Merged
KofTwentyTwo merged 2 commits from feat/GH-57-release-signing-3 into main 2026-10-10 19:39:27 +00:00
2 Commits
Author SHA1 Message Date
james.maesandClaude Fable 5.1 450577d1d2 ci(release): read the validated publisher from the profile's active certificate
The certificate profile resource carries the subject on its issued certificate (subjectName), not as a profile field; the script now derives TRUSTED_SIGNING_SUBJECT from the CN of the active certificate and trims the endpoint's trailing slash. Ran against the live account: see #93.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-10-10 14:31:04 -05:00
james.maesandClaude Fable 5.1 4da575638d feat(release): Authenticode-sign releases with Azure Artifact Signing over OIDC
Turns on the shared release workflow's `sign` input: every published exe/dll is
signed with Azure Artifact Signing (SHA-256, RFC 3161 timestamp) before packing,
and vpk signs Setup.exe and the update stub with the same identity. The identity
is an Entra application with a federated credential bound to this repository's
`release` environment and the Certificate Profile Signer role on the profile
only; it is configuration (release-environment variables), not a secret.

A verify-signatures job downloads the published Setup.exe, portable and CLI zips
and runs signtool verify /pa /all plus Get-AuthenticodeSignature on every gclo
executable, checking status, timestamp and the validated publisher name, so an
unsigned release fails the run. Set-ReleaseSigning.ps1 records the idempotent
Azure configuration; RELEASING.md, SECURITY.md, README, ADR 0008 and the threat
model describe the result and local signing.

Closes #57 (standards exception EX-0002 closes for gclo after the first signed
release verifies).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-10-10 14:31:03 -05:00