Repository navigation
Sign the Windows installer (Authenticode) to stop SmartScreen warnings #1643
Description
Problem
The Windows installer built by .github/workflows/release-installers.yml (iscc qtpass.iss) is not Authenticode-signed. There is no signtool step and no certificate in the repository secrets.
Consequence for users: on first run Windows shows the SmartScreen dialog "Windows protected your PC" and the installer only runs after More info → Run anyway. SmartScreen reputation is built per file hash, so every new release starts nagging again.
Unlike the macOS situation (#1542) nothing is blocked: Chocolatey (1.7.0, approved, tests passing) and winget (1.7.0) both accept unsigned installers. This is a polish/trust issue, not a distribution outage.
Options
- SignPath Foundation (recommended) — free Authenticode code signing for open source projects. Certificate stays in their HSM; signing happens from CI via the
signpath/github-action-submit-signing-requestaction. Cost: €0. Needs an application and approval (takes a few weeks), then one extra step inrelease-installers.yml.
https://signpath.org/ - Azure Trusted Signing — ~USD 10/month. Requires an organisation with ≥3 years of verifiable history (IJHack as a registered stichting should qualify). CI via
azure/trusted-signing-action. - Own OV/EV certificate — €150–300/year, and since 2023 the private key must live on a hardware token or HSM, which makes unattended CI signing painful. Not recommended.
Plan
Status 2026-10-11: test-certificate signing works from main; waiting for the SignPath Foundation's review and the production certificate.
- Apply for a SignPath Foundation OSS certificate (submitted 2026-09-12, accepted 2026-10-10)
- SignPath organisation, project
QtPass, CI user, GitHub App installed on the repository - API token as secret of the
signpathenvironment (deployment refs:v*tags andmainonly); organisation id and policy as repository variables - Signing in
release-installers.yml(Sign the Windows release through the SignPath Foundation #1977):qtpass.exesigned, then the installer built around it and signed; Qt libraries not signed (Foundation terms) - Version resource on
qtpass.exeand the installer (product name/version, which SignPath checks) - Test-certificate run from
main, both files signed: https://github.com/IJHack/QtPass/actions/runs/38087385429 - Code signing policy page: https://qtpass.org/code-signing
- Setup sent to the SignPath Foundation for review (2026-10-11)
- Foundation reviews the setup and imports the production certificate on the
release-signingpolicy - Delete the repository variables
SIGNPATH_SIGNING_POLICY_SLUGandSIGNPATH_TEST_CERTIFICATE(the workflow then usesrelease-signingand accepts only fully valid signatures) - First release signed with the production certificate; verify with
signtool verify /pa /v qtpass-<version>.exe - Drop the "not code-signed yet" notes from README and qtpass.org/downloads
Related
- Homebrew cask scheduled for disablement (fails Gatekeeper check) #1542 — macOS: unsigned
.dmggot the Homebrew cask disabled; same root cause (no signing identity), different severity - Release v1.8.0 #1197 — v1.8.0 release checklist
Activity
Website: SmartScreen note under Windows downloads (#1645)
annejan commentedon Sep 13, 2026
Not entierly unrelated ..
https://www.virustotal.com/gui/file/55c61d918aea62ebbdacd254a1ed80b6a2d29e569814e36757f98550f7e0a8cb?nocache=1
annejan commentedon Sep 16, 2026
Submitted: 9/12/26, 02:25
This morning at 08:38
Your SignPath Foundation application
Code signing policy page (SignPath Foundation)
Sign the Windows release through the SignPath Foundation (#1977)
annejan commentedon Oct 10, 2026
Reopened: the merge of #1977 closed this automatically, because its description said "closes #1643 once the production certificate is in" and GitHub only reads the keyword. It stays open until the first release is signed with the production certificate; see the checklist in the description.
Code signing policy: status per platform, macOS included
ROADMAP.md: where QtPass is heading (#1992)