Last updated 2026-05-28
Code-signing the desktop client
What it gets you
Without code-signing, Windows shows a SmartScreen warning the first time someone runs otiumwork-client.exe ("Windows protected your PC — More info → Run anyway"). It works, but it scares some users, and IT teams sometimes block the executable from running at all.
With an EV (Extended Validation) Authenticode signature: - SmartScreen warning disappears immediately (no reputation-building period — unlike standard OV certs which need weeks of downloads to build trust). - Windows shows the signing entity's name in the UAC prompt and file properties. - Microsoft Intune, SCCM, and most enterprise endpoint protection treat the binary as trusted.
What it costs
An EV code-signing cert: - ~$370/year from SSL.com (also DigiCert, Sectigo, GlobalSign — comparable pricing) - Ships with a hardware USB token (FIPS 140-2 Level 2 requirement) — adds ~$30 + shipping time of ~1 week - Renewable annually; the cert lives on the token, not exportable
One-time setup
- Buy the cert from ssl.com → Code Signing Certificates → EV under the operator entity name (Mashpee Advisors LLC, DBA OtiumWork).
- Pass identity verification (corporate documents, phone callback).
- Receive the YubiKey FIPS token via courier.
- Install SafeNet Authentication Client (Windows). Activate the token with the PIN they shipped.
- Find the cert thumbprint:
powershell Get-ChildItem -Path Cert:\CurrentUser\My | Select Thumbprint, Subject - Set
CODESIGN_CERT_THUMBPRINTin your build environment to that SHA-1 thumbprint.
Building a signed release
pwsh scripts/build_client.ps1 -Sign -Verify
Output:
- dist/otiumwork-client.exe with SHA-256 Authenticode signature + RFC-3161 timestamp
- Printed SHA-256 file digest — paste into the /admin/client upload form
- The signature verifies under the standard cert chain (signtool verify /pa /v)
Why not sign in CI?
EV cert private keys live on a hardware token that must be physically plugged in. CI runners don't have hands. Options: - Azure Key Vault HSM-backed signing (~$5/mo + per-op pricing) — supported by signtool, no token needed in CI - SSL.com eSigner cloud service — bundled with their EV cert at no extra cost (slower, more friction)
For a 100-person rollout one operator can sign on their local machine each release — that's fine. Move signing into CI when release cadence exceeds once a week or when more than one person ships the client.
Unsigned-release workaround
The existing user-facing message in the install email still applies:
If Windows Defender shows 'Windows protected your PC', click 'More info' then 'Run anyway'. Harmless false positive for packaged Python apps.
That works but it's not a long-term experience for non-technical users. Plan to sign before the team scales much past 30.
See something wrong or outdated in this article? Report it →