feat(release): Authenticode-sign releases with Azure Artifact Signing over OIDC #93
Closed
KofTwentyTwo wants to merge 3 commits from
feat/GH-57-release-signing into main
pull from: feat/GH-57-release-signing
merge into: KofTwentyTwo:main
KofTwentyTwo:main
KofTwentyTwo:feat/216-one-window-per-data-folder
KofTwentyTwo:ci/gitea-release
KofTwentyTwo:docs/218-documents-say-1.2.0
KofTwentyTwo:ci/gitea-windows-build
KofTwentyTwo:feat/212-default-token-per-forge
KofTwentyTwo:feat/211-version-and-wording
KofTwentyTwo:feat/209-gitea-quick-sync
KofTwentyTwo:feat/206-gitea-wizard
KofTwentyTwo:feat/204-gitea-accounts-and-cli
KofTwentyTwo:feat/202-gitea-listers
KofTwentyTwo:ci/original-gclo-ui-20261103
KofTwentyTwo:dependabot/github_actions/actions-604ff1328a
KofTwentyTwo:feat/default-token-wizard
KofTwentyTwo:style/kingsrook-layout
KofTwentyTwo:docs/standards-governance
KofTwentyTwo:ci/standards-gates
KofTwentyTwo:feature/GH-11-macos-rewrite-plan
No Reviewers
Labels
Clear labels
.NET
bug
deferred
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
needs-owner
priority
quality
question
refactor
release
wontfix
Pull requests that update .NET code
Something isn't working
Agreed follow-up, not scheduled
Pull requests that update a dependency file
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
Pull requests that update GitHub Actions code
Good for newcomers
Extra attention is needed
This doesn't seem right
Blocked on an action only the owner can take
Owner-flagged: work this first
Standards, simplicity, enforcement
Further information is requested
Restructuring without behavior change
Release pipeline / distribution
This will not be worked on
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: KofTwentyTwo/gclo#93
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What
Releases are now Authenticode-signed (K22-REL-05) through the standards' shared workflow, which already carries the signing steps behind
sign(azure/loginv3.1.0 andazure/artifact-signing-actionv2.0.0, both SHA-pinned and current;vpk pack --azureTrustedSignFile). ADR 0008.release.yml:sign: true; newverify-signaturesjob afterreleasedownloads the published Setup.exe, portable zip and CLI zip and runssigntool verify /pa /all+Get-AuthenticodeSignatureon every gclo executable, failing on an invalid, untimestamped or foreign-publisher signature (TRUSTED_SIGNING_SUBJECT).gclo-release-signingwith a federated credential forrepo:KofTwentyTwo/gclo:environment:releaseand only Artifact Signing Certificate Profile Signer on the certificate profile. No secret, key or PFX anywhere. The identity isrelease-environment variables:AZURE_TENANT_ID,AZURE_CLIENT_ID,AZURE_SUBSCRIPTION_ID,TRUSTED_SIGNING_ENDPOINT,TRUSTED_SIGNING_ACCOUNT,TRUSTED_SIGNING_PROFILE,TRUSTED_SIGNING_SUBJECT..github/scripts/Set-ReleaseSigning.ps1: idempotent Azure configuration (reads the existing account and Active profile through ARM, ensures app + service principal + federated credential + profile-scoped role, prints thegh variable setlines). Run interactively by the owner; never creates secrets or touches the account, validation or profile.Microsoft.ArtifactSigning.Clientdlib, the verify job), SECURITY.md, README verify step 4, threat-model revision row.Closes #57 (part of #62). After the first signed release verifies, EX-0002 closes for gclo in the standards register.
Azure configuration status
Pending the owner's interactive sign-in; the script output and
signtool verifyresults of the first signed prerelease will be posted here before merge.How it was tested
actionlintclean; PSScriptAnalyzer 0 findings.🤖 Generated with Claude Code
Azure configuration done (2026-10-10, run by the owner's interactive session)
Verified against the deployed resources, not the setup notes:
4ebeb0ad-5782-487a-a1b4-5080255774cf(koftwentytwooutlook.onmicrosoft.com)8ef2479e-3346-4cba-93ad-101c6cd237a0"Kof22 Signing Account"kof22signing,rg-code-signing, eastus, endpointhttps://eus.codesigning.azure.netreleases, PublicTrust, Active; certificate subjectCN=James Maes, O=James Maes, L=Chester, S=il, C=US(thumbprintBAAA6D7D…31D3)gclo-release-signing, client id5fc7f572-6ffa-4538-bcf4-65282dd0859a(new; no existing identity existed in the tenant)https://token.actions.githubusercontent.com, subjectrepo:KofTwentyTwo/gclo:environment:release, audienceapi://AzureADTokenExchange…/certificateProfiles/releasesonly, for the service principal and (for local one-offs) the owner user. No subscription-level role for the application.releaseenvironment variables set:AZURE_TENANT_ID,AZURE_CLIENT_ID,AZURE_SUBSCRIPTION_ID,TRUSTED_SIGNING_ENDPOINT,TRUSTED_SIGNING_ACCOUNT,TRUSTED_SIGNING_PROFILE,TRUSTED_SIGNING_SUBJECT=James Maes. No secret was created anywhere.Signing test (local, same account and profile)
signtool sign /fd SHA256 /tr http://timestamp.acs.microsoft.com /td SHA256 /dlib Azure.CodeSigning.Dlib.dll /dmdf metadata.json gclo.exe gclo.dll→ 2 signed, 0 warnings, 0 errors.signtool verify /pa /all /v gclo.exe→ exit 0; chain James Maes ← Microsoft ID Verified CS EOC CA 03 ← Microsoft ID Verified Code Signing PCA 2021 ← Microsoft Identity Verification Root CA 2020.Get-AuthenticodeSignature:Valid, subjectCN=James Maes, O=James Maes, L=Chester, S=il, C=US, timestamper Microsoft Public RSA Time Stamping Authority.The
verify-signaturesjob expects the subject to contain "James Maes" (the validated publisher), which is what Windows will show.Next: merge →
v1.0.2-beta.2(first CI-signed build, OIDC path exercised for real) → verify the published assets with signtool →v1.0.2→ close EX-0002 in the standards register.Superseded by https://github.com/KofTwentyTwo/gclo/pull/95 (same commits cherry-picked onto main, signed and signed-off; the branch-update merge commit here had no DCO trailer).
Pull request closed