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

Closed
KofTwentyTwo wants to merge 2 commits from feat/GH-57-release-signing-2 into main
pull from: feat/GH-57-release-signing-2
2 Commits
Author SHA1 Message Date
james.maesandClaude Fable 5.1 0f90992b62 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:23:10 -05:00
james.maesandClaude Fable 5.1 b271a142e4 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:23:09 -05:00