Last modified: January 24, 2026
This article is written in: πΊπΈ
This document describes the Windows code signing implementation for Standard of Iron.
The Windows build pipeline automatically signs the .exe file with Authenticode using an organization EV (Extended Validation) certificate. Code signing provides:
The code signing step is integrated into the Windows build workflow (.github/workflows/windows.yml) and runs automatically when tags are pushed (e.g., v1.2.3).
The signing process:
1. Runs after the build step completes
2. Only executes if the WINDOWS_CERTIFICATE secret is configured
3. Signs the main executable (standard_of_iron.exe)
4. Uses SHA-256 algorithm for both file digest and timestamp
5. Timestamps the signature using DigiCert's timestamp server
6. Verifies the signature after signing
Currently, the pipeline signs:
- standard_of_iron.exe - The main game executable
Note: Qt DLLs and other third-party libraries are not signed by this pipeline as they should already be signed by their respective publishers (e.g., Qt Company).
Entrust
Certificate Format: Export the certificate as a .pfx (PKCS#12) file with a strong password
To enable code signing in GitHub Actions, configure the following repository secrets:
WINDOWS_CERTIFICATE.pfx certificate fileTo encode your certificate on Linux/macOS:
base64 -i certificate.pfx | tr -d '\n' > certificate.txt
cat certificate.txt
On Windows PowerShell:
$certBytes = [System.IO.File]::ReadAllBytes("certificate.pfx")
$certBase64 = [System.Convert]::ToBase64String($certBytes)
$certBase64 | Out-File -FilePath certificate.txt -NoNewline
Get-Content certificate.txt
Copy the entire base64 string and paste it as the secret value.
WINDOWS_CERTIFICATE_PASSWORD.pfx certificate fileAfter pushing a tag and completing the build:
.exe file.exe β Properties β Digital Signatures tabAlternatively, use signtool to verify from the command line:
signtool verify /pa /v standard_of_iron.exe
Use GitHub's encrypted secrets feature (never commit certificates to the repository)
Certificate Expiration:
Update the GitHub secret when renewing
Timestamping:
If the signing step is skipped, verify:
- The WINDOWS_CERTIFICATE secret is configured
- The secret name matches exactly (case-sensitive)
- The workflow has permission to access secrets
If signing fails, check:
1. Certificate is valid and not expired
2. Password is correct
3. Certificate is in .pfx format
4. Base64 encoding is correct (no line breaks or extra characters)
5. Timestamp server (http://timestamp.digicert.com) is accessible
Even with a valid signature, SmartScreen may show warnings if: - The certificate is new and hasn't built reputation yet - The executable hasn't been downloaded by many users yet - The signature is from a standard (non-EV) certificate
EV certificates typically bypass these warnings immediately, but standard certificates may require time to build reputation.
Potential improvements for the code signing implementation: