How to Integrate Code Signing Into a Software Release Process

Make code signing a defined release control, from build preparation and testing through signing, timestamping, verification, publication, and record retention.

Release sequence: Build → Test and approve → Sign → Timestamp → Verify → Publish → Retain release records
01
PrepareApprove source and create release artifacts
→
02
SignUse an authorized signing identity
→
03
VerifyCheck integrity, signer and trust
→
04
Release and recordPublish the approved artifact and retain evidence
→

Where Code Signing Fits Into a Software Release

Code signing should be part of release management, not a last minute task performed manually before publishing an application.

A reliable process establishes when software is signed, which artifacts require signatures, who can authorize signing, how private keys are protected, and what checks must pass before a release can proceed.

Build and approve

Prepare approved source code, create release artifacts, and complete required testing.

Sign and timestamp

Sign approved artifacts with the correct identity and add a trusted timestamp where supported and appropriate.

Verify

Check signature integrity, signer identity, and applicable trust requirements.

Publish and retain

Distribute verified artifacts and keep release records for future investigation.

The sequence varies by platform and release format. Windows software commonly uses Authenticode signing, Java archives use JAR signing, and macOS applications may require notarization.

Define Which Release Artifacts Need Signing

Create an inventory of the files distributed to users, customers, or production environments. Every artifact covered by your release policy should have a clearly defined signing requirement.

ArtifactTypical signing approach
Windows EXEAuthenticode
Windows MSI installerAuthenticode
DLL filesAuthenticode or applicable catalog signing
PowerShell scriptsPowerShell script signing
Java JAR filesJava JAR signing
macOS applicationsApple code signing
Software packagesFormat and platform specific signing

Identify whether the release contains nested binaries, libraries, helper applications, or installers. These may have separate signing requirements.

The release inventory should account for the final format being distributed, because signing software packages and installers can involve format specific steps beyond signing an individual executable.

Establish a Signing Policy

Define the conditions under which an artifact can be signed and released. Without a documented policy, teams may use different certificates, signing tools, and verification methods across projects.

Signing eligibility

Define which builds, branches, release tags, and approved artifacts are eligible for signing.

Signing identity

Specify which certificate or signing identity is used for each product and release environment.

Private key access

Define which users, services, and build systems can request signing operations.

Timestamping

Specify when trusted timestamping is required and which supported timestamp service is used.

Verification and failure handling

Define checks that must pass before publication and whether failed signatures, missing timestamps, or trust warnings block a release.

Audit records

Determine which signing and verification details must be retained for future investigation.

Apply the policy consistently across development, staging, and production releases.

Protect Signing Keys Throughout the Release Lifecycle

Treat the code signing private key as a production security asset. Unauthorized access could allow someone to sign software under your organization's identity.

Avoid storing raw private keys in source control, distributing them across developer machines, or embedding passwords directly in build scripts.

Protected certificate stores

Use controlled signing agents with restricted certificate and private key access.

Hardware security modules

Keep private keys within protected hardware and perform signing operations through the HSM.

Remote signing services

Allow authorized systems to request signing without directly handling the private key.

Cloud managed signing

Use managed signing infrastructure with narrowly scoped permissions.

Separate ordinary build jobs from privileged signing jobs wherever practical. A pull request build should not automatically inherit the same signing permissions as an approved production release.

Limit production signing access to trusted release jobs, and protect the signing private key without exposing it to build jobs that do not need direct key access.

Integrate Signing Into the Build and Release Pipeline

Once the policy and signing environment are defined, incorporate signing into the release workflow.

Practical sequence: Build → Test → Approve → Sign → Timestamp → Verify → Publish

Signing usually belongs after the relevant build and tests have passed. Identify the artifact before signing so the release process knows exactly which file is authorized for distribution.

Illustrative Windows signing commandsigntool sign /fd SHA256 /tr https://timestamp.example.com /td SHA256 /a "release.exe"

Replace the example timestamp URL with your configured timestamp service. The certificate must be available to the signing process, and the selected identity must be the one approved for that release.

This command is illustrative rather than a complete production configuration. Certificate selection, private key access, and failure handling must be configured for the actual environment.

For teams using automated builds, integrate signing into a CI/CD pipeline only after the artifact has passed the required build and test checks.

Timestamp Signed Software

Timestamping provides evidence of when a signature was created. It can help preserve signature validity after the signing certificate expires, subject to applicable trust and revocation conditions.

For publicly distributed software, timestamping should normally be incorporated into the signing process when supported by the platform and required by the release policy.

The Windows SignTool command above uses /tr to specify an RFC 3161 timestamp service and /td SHA256 to select the timestamp digest algorithm.

Verification matters: After signing, inspect the verification output to confirm that the timestamp is present and valid. A successful signing command alone is not sufficient evidence that every signature and timestamp check has passed.

Timestamp policy should be explicit, because how timestamping works for signed software affects how signatures are evaluated after a certificate expires.

Choose the right code signing certificate

Compare available certificate options against your software format, platform, identity requirements, and release workflow before standardizing your signing process.

Browse code signing certificates

Verify the Signed Artifact Before Publication

Verification is a mandatory release control, not merely a debugging step. Check the signed artifact before it is made available to customers or deployed to production.

PowerShell verification examplesigntool verify /pa /v "release.exe" if ($LASTEXITCODE -ne 0) { throw "Code signature verification failed." }

This example stops the PowerShell script if SignTool returns a nonzero exit code. In a production pipeline, define how warnings are handled and verify that the command uses the correct policy for the software type.

Signature integrity
Expected signer identity
Certificate chain and trust
Timestamp validity
Applicable certificate status checks
Confirmation that the file matches the intended release artifact

For macOS, signature verification and Gatekeeper assessment are separate checks. Java archives also require their own verification process.

The release gate should require teams to verify software before deployment and block publication when mandatory checks fail.

Package and Publish the Correct Artifact

Ensure that the file being distributed is the same file that was signed and verified. If a file is modified after signing, its signature may no longer validate. Repackaging or transforming software after signing can also affect the final distribution artifact, depending on the package format.

Identify the final release artifact
Sign it at the correct stage
Verify its signature
Avoid modifying signed content afterward
Verify the final package again where necessary
Publish the approved artifact through the intended distribution channel

For macOS applications distributed outside the Mac App Store, the workflow may also include Apple's notarization and stapling steps. Complete and check these according to the applicable distribution requirements.

Once the final package is prepared, apply the signing controls required before deployment before distributing it to users or production environments.

Record Signing and Release Evidence

Release records help teams investigate problems and establish which artifacts were distributed.

RecordPurpose
Release versionIdentifies the software release.
Artifact name and hashIdentifies the exact file.
Signing certificate identityRecords which signing identity was used.
Signing timestampRecords when signing occurred.
Verification resultRecords whether required checks passed.
Pipeline or build identifierConnects the artifact to its build.
Approval recordShows that required release authorization occurred.

Avoid recording private keys, passwords, or other sensitive signing credentials in release logs. These records can support incident response, release audits, certificate renewal planning, and investigations into potentially compromised signing keys.

Manage Certificate Renewal and Signing Failures

Assign responsibility for monitoring certificate expiration and planning renewals before an upcoming release is affected.

IssueRecommended response
Signing identity unavailableCheck certificate installation, private key access, and permissions.
Signing operation failsReview tool output, parameters, and signing configuration.
Timestamp service unavailableCheck the endpoint, network access, and service status.
Signature verification failsInspect the file, signature, and certificate chain.
Certificate expiresReview the renewal plan and signing identity for future releases.
Unauthorized signing requestReview access controls and signing audit records.
macOS notarization failsInspect Apple's submission result and correct the reported issue.

Do not bypass mandatory verification simply to complete a release. Investigate the cause and follow the documented release policy.

When a release fails a signing or verification check, diagnose common code signing errors from the tool output and signing configuration rather than bypassing the release gate.

Software Release Code Signing Checklist

Use this checklist before approving a release process for production use.

Identify all artifacts that require signing
Document the signing policy and release requirements
Protect private keys and restrict signing access
Sign only approved release artifacts
Configure timestamping where applicable
Verify signatures and certificate trust
Confirm the final artifact matches the verified release
Complete platform specific checks such as notarization where applicable
Retain signing and verification records
Test certificate renewal and signing failure procedures

Frequently Asked Questions

When should code signing happen in the software release process?

Code signing generally happens after the relevant build and testing stages and before publication. The precise timing depends on the platform, packaging process, and release requirements.

Should every release artifact be signed?

Every artifact covered by the organization's signing policy should follow its defined signing requirements. Executables, installers, libraries, scripts, and packages may use different signing mechanisms.

Why is timestamping important for software releases?

Timestamping provides evidence of when a signature was created and can help maintain signature validity after certificate expiration, subject to applicable trust and revocation conditions.

Can code signing be integrated into CI/CD?

Yes. Signing and verification can be automated in a CI/CD pipeline, provided signing permissions and private keys are securely managed.

Should software be verified after signing?

Yes. Verification helps confirm signature integrity and applicable trust requirements before the artifact is published or deployed.

What happens if software changes after signing?

Changes to signed content can invalidate the signature. If the release artifact changes, determine whether it must be signed and verified again before distribution.

Does code signing replace software security testing?

No. Code signing helps establish signer identity and integrity of signed content. It does not replace testing, vulnerability scanning, code review, or release approval.

Related Code Signing Implementation Guides

Different release formats and automation models require their own signing steps. These guides cover the implementation details that complement the release controls described here.

Plan certificate selection before your next release

Review certificate types, validation requirements, and purchasing considerations before choosing the signing identity for your release policy.

Explore the certificate buying guide