This document describes how Ferrite uses SignPath for Windows code signing.
Ferrite uses SignPath for code signing Windows artifacts. SignPath provides free code signing for open source projects, which helps:
- Prevent Windows Defender false positives (e.g.,
Trojan:Win32/Bearfoos.B!ml) - Establish trust with users downloading the application
- Comply with Windows SmartScreen requirements
┌─────────────────────┐
│ GitHub Actions │
│ (build-windows) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Unsigned Artifacts │
│ - ferrite.exe │
│ - MSI installer │
│ - Portable zip │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ SignPath Action │
│ (sign-windows) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ SignPath Service │
│ (code signing) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Signed Artifacts │
│ - ferrite.exe ✓ │
│ - MSI installer ✓ │
│ - Portable zip ✓ │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ GitHub Release │
└─────────────────────┘
Location: .signpath/artifact-configuration.xml
Defines the structure of artifacts to sign:
<artifact-configuration xmlns="http://signpath.io/artifact-configuration/v1">
<zip-file>
<zip-file path="ferrite-portable-windows-x64.zip">
<pe-file path="ferrite.exe" />
</zip-file>
<msi-file path="ferrite-windows-x64.msi">
<pe-file path="ferrite.exe" />
</msi-file>
</zip-file>
</artifact-configuration>Location: .github/workflows/release.yml
The workflow:
- Builds Windows artifacts (
build-windowsjob) - Signs artifacts via SignPath (
sign-windowsjob) - Creates release with signed artifacts (
releasejob)
Add these secrets to your GitHub repository:
| Secret | Description |
|---|---|
SIGNPATH_API_TOKEN |
API token from SignPath dashboard (user with submitter permissions) |
SIGNPATH_ORGANIZATION_ID |
Your SignPath organization ID |
- Accept the invitation to your SignPath OSS organization
- Log in at https://app.signpath.io
- Create a project named
ferrite - Add the artifact configuration (copy from
.signpath/artifact-configuration.xml) - Create a signing policy named
release-signing
- Add the predefined "GitHub.com" trusted build system to your organization
- Link it to the Ferrite project
- Install the SignPath GitHub App and allow access to the repository
For initial testing, SignPath provides a self-signed test certificate:
- Create a test tag:
git tag v0.2.5-hotfix.3-test && git push --tags - Verify the workflow completes successfully
- Download and test the signed artifacts
- Delete the test release if needed
After successful testing:
- Contact SignPath to request the production certificate
- SignPath will review your setup and import the certificate
- Future releases will use the production certificate automatically
- Check that secrets are configured correctly
- Verify the artifact configuration matches your artifact structure
- Check SignPath dashboard for error details
- Ensure artifacts are uploaded with
actions/upload-artifact@v4 - Verify the artifact ID is passed correctly to SignPath action
- SignPath signing can take several minutes
- Default timeout is 600 seconds (10 minutes)
- Increase
wait-for-completion-timeout-in-secondsif needed
- 2026-01-23: Initial SignPath integration approved and configured