Summary
Automate Windows MSI code signing in CI using a workflow_dispatch trigger on a self-hosted runner with SimplySign Desktop. Evaluate both jsign and ssign as signing tools before committing to one.
Motivation
Currently, Windows MSI signing is a manual step: download the unsigned MSI from the draft release, sign locally with jsign + SimplySign Desktop, then re-upload. This works but requires the maintainer to be at their Linux machine with SimplySign Desktop connected.
Automating this via workflow_dispatch would allow signing from the GitHub Actions UI while keeping the same manual authentication flow (OTP from mobile app → SimplySign Desktop connected → signing runs).
Proposed approach
Phase 1: self-hosted runner with jsign (proven)
- Set up a self-hosted Linux runner with SimplySign Desktop + jsign pre-installed
- Create
.github/workflows/sign-windows.yml triggered by workflow_dispatch
- Workflow: authenticate SimplySign (manual OTP) → download unsigned MSI → sign with jsign → upload signed MSI → verify with osslsigncode
- jsign is already proven to work with our PKCS#11 setup (tested locally)
Phase 2: evaluate ssign as alternative
- ssign is a newer Rust-based tool for Certum cloud signing
- Test ssign against the same SimplySign Desktop PKCS#11 setup
- Compare: reliability, ease of setup, CI integration, timestamp support
- Decision: adopt ssign if it matches or exceeds jsign, otherwise stay with jsign
Files to create/modify
.github/workflows/sign-windows.yml — new workflow for workflow_dispatch signing
RELEASE.md — update signing step to reference automated workflow
docs/codesigning.md — document CI signing setup
Context
- Certum OV Open Source Code Signing certificate (
CN=Open Source Developer Jason Telford Farrar)
- SimplySign Desktop installed at
/opt/SimplySignDesktop/ on maintainer's Linux machine
- SunPKCS11 config at
~/provider_simplysign.cfg
- jsign 7.5 at
~/jsign/jsign.jar — proven working locally
- ssign v0.1.2 (current version but under active development)
Related
Summary
Automate Windows MSI code signing in CI using a
workflow_dispatchtrigger on a self-hosted runner with SimplySign Desktop. Evaluate both jsign and ssign as signing tools before committing to one.Motivation
Currently, Windows MSI signing is a manual step: download the unsigned MSI from the draft release, sign locally with jsign + SimplySign Desktop, then re-upload. This works but requires the maintainer to be at their Linux machine with SimplySign Desktop connected.
Automating this via
workflow_dispatchwould allow signing from the GitHub Actions UI while keeping the same manual authentication flow (OTP from mobile app → SimplySign Desktop connected → signing runs).Proposed approach
Phase 1: self-hosted runner with jsign (proven)
.github/workflows/sign-windows.ymltriggered byworkflow_dispatchPhase 2: evaluate ssign as alternative
Files to create/modify
.github/workflows/sign-windows.yml— new workflow forworkflow_dispatchsigningRELEASE.md— update signing step to reference automated workflowdocs/codesigning.md— document CI signing setupContext
CN=Open Source Developer Jason Telford Farrar)/opt/SimplySignDesktop/on maintainer's Linux machine~/provider_simplysign.cfg~/jsign/jsign.jar— proven working locallyRelated
docs/codesigning.md— current signing policyRELEASE.md— release workflow & promotion checklist