--azureTrustedSignFile currently goes through signtool.exe plus the Trusted
Signing Dlib, both native Windows binaries, so it is registered only on Windows
and cross-compiled Windows packages cannot use it.
Trusted Signing itself is just an HTTPS service: a digest goes out and a
signature comes back. Using the managed client instead of the Dlib makes the
same metadata.json work on Linux and macOS, with the key still never present
locally.
Windows behaviour is unchanged - it keeps using the Dlib. Only the non-Windows
path is new, so this adds a capability without altering an existing one.
Verified against a live Trusted Signing account on Ubuntu: vpk [win] pack
--azureTrustedSignFile signed all six payload files and the setup bundle, and
the output verifies with a real certificate, a full chain and a timestamp.
Draft, in response to your question on the docs PR about a native option for signing Windows PE/MSI on nix. Easier to judge the integration shape from working code than from a description, so here it is - happy to throw it away or rework it however you'd prefer.
What it does
--azureTrustedSignFile currently goes through signtool.exe plus the Trusted Signing Dlib, both native Windows binaries. So the option is registered only on Windows, and a cross-compiled Windows package can't use it.
But Trusted Signing is just an HTTPS service - a digest goes out, a signature comes back. Swapping the Dlib for the managed client makes the same metadata.json work on Linux and macOS, with the key still never present locally.
Windows is untouched: it keeps using the Dlib. Only the non-Windows path is new, so this adds a capability rather than changing one.
Verified end to end
Against a live Trusted Signing account on Ubuntu 24.04:
And the output, checked independently:
A real certificate, full chain, timestamped. MyApp.exe inside the portable zip verifies the same way.
What it costs you
Velopack.Packaging.Windows gains two package references: SignUniversal (PE/MSI Authenticode; pulls System.Security.Cryptography.Pkcs and OpenMcdf) and SignUniversal.Azure (pulls the Azure SDK). The Azure SDK is the real weight here, and it's your call whether that belongs in vpk. If it doesn't, the same seam works with a certificate held any other way - IRemoteSigner is a single SignHash method - so a PFX-only path would cost only the first package.
Those are mine, which is how I know they fit. They were Apache-2.0 when I opened this; they are MIT as of 1.0.34, so referencing them carries no LICENSE/NOTICE obligation for vpk.
Things I'd want your opinion on