Repository navigation
Replace makeappx and signtool with in-process MSIX writing and psign-tool - #60
Merged
Marc-André Moreau (mamoreau-devolutions) merged 2 commits intoNov 3, 2026
Conversation
…tool Both repository publishers now write source2.msix themselves in the exact AppxPackaging (makeappx) ZIP layout and sign and verify it with the cross-platform psign-tool (Devolutions.Psign.Tool 0.8.2 or later). The Windows SDK and the Rust PowerShell certificate check are no longer needed. - Signing passes all psign-tool arguments, including the PFX password, through a private response file instead of the command line. - Verification checks package digests, that the signer subject matches --publisher with the Code Signing EKU, and chain trust: the Windows store on Windows, or --trusted-ca anchors (repeatable). - --makeappx/--signtool become --psign-tool; doctor reports psignToolPath. - publish and verify decode MSZIP portably off Windows; build still compresses with the Windows Compression API. - CI installs psign-tool 0.8.2; gate scripts take -PsignToolPath. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Marc-André Moreau (mamoreau-devolutions)
requested review from
a team and
Gabriel Dufresne (GabrielDuf)
as code owners
November 2, 2026 22:04
- Run .cmd/.bat psign-tool shims through cmd.exe /s /c with paired quotes in .NET, and reject paths cmd.exe would still expand. - Drop the .NET pre-sign PFX check so both publishers rely on the post-sign signer check; reject publishers with surrounding whitespace. - Align .NET --timestamp-url validation with Rust (signed only, HTTP(S), no whitespace). - Make Rust psign workspaces unique per call, close child stdin, and render non-string DN values as unquoted DER hex. - Report a missing explicit --psign-tool path as such. - Write the same AppxManifest.xml and logos from Rust as from .NET, and check in production conformance that packages match outside the index. - Add Rust tests for certificate checks, response files, redaction and batch-shim invocation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Marc-André Moreau (mamoreau-devolutions)
merged commit Nov 3, 2026
da4f34f
into
master
14 checks passed
Marc-André Moreau (mamoreau-devolutions)
deleted the
claude/pr-59-external-tools-13193a
branch
November 3, 2026 14:14
This was referenced Nov 1, 2026
Marc-André Moreau (mamoreau-devolutions)
pushed a commit
that referenced
this pull request
Nov 5, 2026
## 🤖 New release * `pinget-core`: 0.14.0 -> 0.14.1 (✓ API compatible changes) * `pinget-publisher`: 0.14.0 <details><summary><i><b>Changelog</b></i></summary><p> ## `pinget-core` <blockquote> ## [0.14.1](pinget-core-v0.14.0...pinget-core-v0.14.1) - 2026-11-05 ### Other - Support machine scope for zip and portable installers ([#61](#61)) - Replace makeappx and signtool with in-process MSIX writing and psign-tool ([#60](#60)) - Add native WinGet preindexed repository publishers in Rust and C# ([#59](#59)) - Fixes uninstall dispatch for EXE/Burn ARP entries whose registry subkey is GUID-shaped. ([#57](#57)) </blockquote> ## `pinget-publisher` <blockquote> ## [0.14.0](https://github.com/Devolutions/pinget/releases/tag/pinget-publisher-v0.14.0) - 2026-11-05 ### Other - Replace makeappx and signtool with in-process MSIX writing and psign-tool ([#60](#60)) - Add native WinGet preindexed repository publishers in Rust and C# ([#59](#59)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Follow-up to #59. The WinGet source publishers no longer need the Windows SDK (
makeappx.exe,signtool.exe) or, in Rust, PowerShell.Packaging: both publishers write
source2.msixin-process, in the exact AppxPackaging (makeappx) ZIP layout:Windows AppxSip rejects signatures over any other layout with
TRUST_E_BAD_DIGEST. The Rust (msix.rs) and .NET (MsixPackageWriter.cs) writers are byte-identical for the same payload, and a .NET test pins hashes produced by the Rust writer.Signing: done with the cross-platform psign-tool (
Devolutions.Psign.Tool, 0.8.2 or later; 0.8.1's portable MSIX signatures fail Windows verification, fixed in Fix Windows TRUST_E_BAD_DIGEST on portable-signed MSIX/AppX; sign plain-ZIP packages psign#46)./proc/*/cmdlineis readable by other users, and for the.cmdlauncherdotnet tool installcreates on Windows.Verification, after signing and in
verify --destination:--publisher, formatted the way Windows formats certificate subjects;signtool verify /padid), or new repeatable--trusted-caanchors.CLI:
--makeappx/--signtoolbecome--psign-tool;doctorJSON reportspsignToolPath.Portability:
publishandverifynow run off Windows, using the existing portable MSZIP decoders.buildstill compresses with the Windows Compression API.CI, scripts and docs:
-PsignToolPath.Validation (local, Windows 11, SDK 10.0.26100)
clippyandfmtare clean.tests/publisher/run-production-conformance.ps1passes: Rust and .NET reopen each other's state and verify each other's unsigned feeds..cmdlauncher, with a password containing quotes,@and%PATH%:signtool verify /paandGet-AuthenticodeSignaturereport only the untrusted throwaway root, never a bad digest;--trusted-capublish and verify succeed;--publisheris rejected;makeappx unpackaccepts both signed and unsigned output.Devolutions.Psign.Tool.win-x64, …) shortly after the release. If they're still missing, the job's install step will fail until NuGet finishes indexing.Notes
source2.msixstill differ, because their manifest text and generated logos differ (unchanged from before). Only the container layout is identical.tests/publisher/build_v2_fixture.ps1still uses makeappx on purpose. It's a manual, independent reference-fixture builder, and nothing calls it.🤖 Generated with Claude Code