GitHub Action
Add Authenticode code signing to your GitHub Actions workflow with qwickcert/sign-action. Works on any runner OS — Ubuntu, macOS, or Windows.
How it works
- The action installs the Qwick Cert CLI on the runner.
- The CLI computes the Authenticode digest (a 32-byte hash) of each file locally.
- The hash is sent to the Qwick Cert API over HTTPS. No file contents leave the runner.
- The API signs the digest via Azure Trusted Signing and returns the PKCS#7 signature.
- The CLI embeds the signature into the original file on the runner.
No Azure credentials, no Windows SDK, no signing certificates on the runner.
Quick start
name: Build and Sign
on:
push:
tags: ["v*"]
jobs:
build-and-sign:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: dotnet publish -r win-x64 -c Release -o ./dist
- name: Sign with Qwick Cert
uses: qwickcert/sign-action@v1
with:
api-key: ${{ secrets.QWICK_API_KEY }}
files: ./dist/MyApp.exe
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: signed-binary
path: ./dist/MyApp.exeInputs
| Input | Required | Description | Default |
|---|---|---|---|
api-key | Yes | Your Qwick Cert API key | — |
files | Yes | Files to sign — glob patterns or space-separated paths | — |
org | No | Organization slug override (resolved automatically from your API key) | — |
verify | No | Verify signatures after signing (requires Windows runner with signtool) | true |
Outputs
| Output | Description |
|---|---|
signed-count | Number of files successfully signed |
Examples
Cross-compile on Ubuntu, sign in the same job
Build a .NET application for Windows on a Linux runner and sign the output — no Windows runner required.
jobs:
build-and-sign:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: dotnet publish -r win-x64 -c Release -o dist/
- uses: qwickcert/sign-action@v1
with:
api-key: ${{ secrets.QWICK_API_KEY }}
files: dist/myapp.exeSign multiple file types with glob patterns
- uses: qwickcert/sign-action@v1
with:
api-key: ${{ secrets.QWICK_API_KEY }}
files: |
dist/**/*.exe
dist/**/*.dllBuild on Windows with post-sign verification
On Windows runners, signature verification via signtool.exe is enabled by default.
jobs:
build-and-sign:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- run: msbuild /p:Configuration=Release
- uses: qwickcert/sign-action@v1
with:
api-key: ${{ secrets.QWICK_API_KEY }}
files: dist/**/*.exeSign an MSI installer
jobs:
build-and-sign:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- run: msbuild installer.wixproj /p:Configuration=Release
- uses: qwickcert/sign-action@v1
with:
api-key: ${{ secrets.QWICK_API_KEY }}
files: output/*.msiRust cross-compile on macOS
jobs:
build-and-sign:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- run: |
rustup target add x86_64-pc-windows-gnu
cargo build --release --target x86_64-pc-windows-gnu
- uses: qwickcert/sign-action@v1
with:
api-key: ${{ secrets.QWICK_API_KEY }}
files: target/x86_64-pc-windows-gnu/release/*.exeOther CI systems
For Azure DevOps, GitLab CI, Jenkins, or any other CI system, install the CLI directly and authenticate with an API key:
npm install -g qwickcert QWICK_API_KEY=qwick_ak_... qwick sign "./dist/*.exe" "./dist/*.dll"
Create API keys from the dashboard or via qwick apikey create. See the CLI reference for the full list of commands and flags.
Setting up secrets
- Go to your Qwick Cert dashboard → API Keys → Create a new key.
- Copy the key (starts with
qwick_ak_). - In your GitHub repo, go to Settings → Secrets and variables → Actions.
- Add a new repository secret named
QWICK_API_KEYwith the copied value.
Security
- Your API key is passed as an environment variable and is never logged or exposed in workflow output.
- API keys have mandatory expiration (6 months default, 24 months maximum) matching Microsoft's Azure credential policy.
- Only the file hash (32 bytes) is sent to the Qwick Cert API — file contents never leave the runner.
- Signing credentials are short-lived and revoked immediately after each operation.
- All communication uses HTTPS/TLS.
- All signing operations are recorded in your Qwick Cert audit trail with the API key used.
Notes
- Signing works on any runner OS (Ubuntu, macOS, Windows) because it happens server-side.
- Signature verification (
verify: true) requires a Windows runner withsigntool.exe. On other platforms, verification is automatically skipped with a warning. - The action installs the CLI automatically — you don't need a separate install step.