Skip to content

ci(windows): Authenticode-sign Traktor.exe and installer via SSL.com eSigner#54

Merged
developeritsme merged 2 commits into
masterfrom
ci/windows-esigner-signing
May 22, 2026
Merged

ci(windows): Authenticode-sign Traktor.exe and installer via SSL.com eSigner#54
developeritsme merged 2 commits into
masterfrom
ci/windows-esigner-signing

Conversation

@yani-

@yani- yani- commented May 22, 2026

Copy link
Copy Markdown
Member

Summary

  • Wires SSL.com EV code signing (order co-611l0tuqv0e) into the Windows release job via sslcom/esigner-codesign@b7f8ff3.
  • Signs build/Traktor.exe before Inno Setup packages it, and the final installer after ISCC. Authenticode runs BEFORE the WinSparkle Ed25519 step so existing 1.11.x installs don't reject the update.
  • Each sign step is followed by signtool verify /pa /v that fails the run on mismatch.
  • malware_block: 'true' is set so a flagged pre-sign scan kills the release rather than producing a Servmask-signed malicious payload in a supply-chain compromise scenario.
  • Scopes the ESIGNER_* secrets to the new release-signing GitHub Environment via environment: release-signing on the build-windows job.

Required setup (out of band, before merge)

In repo Settings -> Environments, create release-signing and add these secrets:

  • ESIGNER_USERNAME - SSL.com account username
  • ESIGNER_PASSWORD - SSL.com account password
  • ESIGNER_CREDENTIAL_ID - eSigner credential ID
  • ESIGNER_TOTP_SECRET - eSigner TOTP seed (saved during credential setup)

Test plan

  • Confirm the four ESIGNER_* secrets exist in the release-signing environment.
  • Trigger release.yml via workflow_dispatch to produce a latest build. Confirm:
    • "Code-sign Traktor.exe (SSL.com eSigner)" step succeeds.
    • "Verify Traktor.exe signature" step prints "Successfully verified" with subject Servmask, Inc.
    • "Code-sign installer (SSL.com eSigner)" step succeeds.
    • "Verify installer signature" step passes.
    • WinSparkle Ed25519 sign step still runs and produces appcast-windows.xml.
  • Download Traktor-latest.exe from the workflow artifacts. On a Windows host:
    • Right-click -> Properties -> Digital Signatures shows Servmask, Inc. as signer for both the installer AND the extracted Traktor.exe.
    • Run the installer; SmartScreen shows the Verified Publisher line rather than "Unknown publisher".
  • (Optional) Run an upgrade from 1.11.1 -> latest via WinSparkle to confirm the appcast signature still validates.

…eSigner

Wires the SSL.com EV cert (order co-611l0tuqv0e) into release.yml's
build-windows job using the sslcom/esigner-codesign action, pinned to
b7f8ff3. Two sign steps run:

1. Traktor.exe before Inno Setup packages it, so SmartScreen sees the
   entry-point binary signed on first run after install.
2. The final installer after ISCC and BEFORE the WinSparkle Ed25519
   step. WinSparkle hashes final bytes, so Authenticode must come first
   or existing 1.11.x installs would reject the update.

Each sign step is followed by `signtool verify /pa /v` that fails the
run if the signature didn't take. malware_block is set to 'true' so a
flagged scan kills the release rather than producing a Servmask-signed
malicious payload in a supply-chain compromise scenario.

Secrets (ESIGNER_USERNAME, ESIGNER_PASSWORD, ESIGNER_CREDENTIAL_ID,
ESIGNER_TOTP_SECRET) live in the release-signing GitHub Environment;
the build-windows job declares environment: release-signing so other
workflows cannot read them.
@github-actions github-actions Bot added the ci CI/CD workflows label May 22, 2026
@github-actions

github-actions Bot commented May 22, 2026

Copy link
Copy Markdown
Contributor

Build Artifacts

Platform Download
Linux (x86_64) Traktor-linux-x86_64
macOS (Apple Silicon) Traktor-macOS
Windows (x64) Traktor-windows-x64

Built from 576f8a6. Artifacts expire after 90 days.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the Windows release workflow to Authenticode-sign the Windows executable and installer using SSL.com eSigner, with secrets scoped to a dedicated GitHub Environment for safer release signing.

Changes:

  • Adds environment: release-signing to the Windows release job to scope ESIGNER_* secrets.
  • Authenticode-signs build/Traktor.exe before Inno Setup packaging, then signs the generated installer.
  • Adds post-sign signtool verify /pa /v steps to fail the workflow if signature verification fails.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +452 to +465
- name: Verify Traktor.exe signature
shell: pwsh
run: |
# signtool.exe ships with the Windows SDK on windows-2022 but
# isn't on PATH. Pick the newest x64 build under Windows Kits.
$signtool = Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\bin" -Recurse -Filter signtool.exe -ErrorAction SilentlyContinue |
Where-Object { $_.DirectoryName -match '\\x64\\?$' } |
Sort-Object { [Version]($_.VersionInfo.FileVersion -replace '[^\d.].*$','') } -Descending |
Select-Object -First 1 -ExpandProperty FullName
if (-not $signtool) { throw "signtool.exe not found under Windows Kits" }
Write-Host "Using $signtool"
& $signtool verify /pa /v build\Traktor.exe
if ($LASTEXITCODE -ne 0) { throw "Signature verification failed for build\Traktor.exe" }

Comment thread .github/workflows/release.yml Outdated
Comment on lines +452 to +463
- name: Verify Traktor.exe signature
shell: pwsh
run: |
# signtool.exe ships with the Windows SDK on windows-2022 but
# isn't on PATH. Pick the newest x64 build under Windows Kits.
$signtool = Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\bin" -Recurse -Filter signtool.exe -ErrorAction SilentlyContinue |
Where-Object { $_.DirectoryName -match '\\x64\\?$' } |
Sort-Object { [Version]($_.VersionInfo.FileVersion -replace '[^\d.].*$','') } -Descending |
Select-Object -First 1 -ExpandProperty FullName
if (-not $signtool) { throw "signtool.exe not found under Windows Kits" }
Write-Host "Using $signtool"
& $signtool verify /pa /v build\Traktor.exe
@yani- yani- temporarily deployed to release-signing May 22, 2026 18:33 — with GitHub Actions Inactive
Addresses Copilot review on #54:

- signtool verify /pa only checks chain validity, not which publisher
  issued the cert. Add a Get-AuthenticodeSignature assertion that the
  signer subject matches CN=Servmask Inc., so a swapped credential or
  unexpected cert fails the run instead of silently passing.
- The "find newest signtool.exe" PowerShell snippet was duplicated in
  both verify steps. Factor it into a single Locate signtool step that
  exports SIGNTOOL_EXE to GITHUB_ENV for reuse.
@yani- yani- temporarily deployed to release-signing May 22, 2026 18:43 — with GitHub Actions Inactive
@developeritsme developeritsme merged commit 25efbad into master May 22, 2026
13 checks passed
@developeritsme developeritsme deleted the ci/windows-esigner-signing branch May 22, 2026 18:56
yani- added a commit that referenced this pull request May 22, 2026
The signing pipeline merged in #54 only runs on tagged releases.
Bumping to 1.11.2 so existing 1.11.x WinSparkle clients pull a
Servmask Inc.-signed installer and replace the unsigned binary
currently installed on disk.

No code change in this commit; release-please picks up the fix:
prefix and opens a Release PR for 1.11.2.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci CI/CD workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants