SignTool Error: No File Digest Algorithm Specified. Please Specify the Digest Algorithm with the /fd Flag

For an ordinary signtool sign invocation, this error means the file-digest option required by that signing path is missing from the command that actually ran. Add the intended /fd—normally SHA256 for a modern workflow—but first identify the exact invocation. /fd controls the file-signature digest; /td controls an RFC 3161 timestamp. If you already configured /fd and still see the error, inspect every real SignTool invocation emitted by MSBuild, Cake, Visual Studio, Inno Setup, or CI; wrappers and multi-signature flows can generate more than one command.

SignTool · /fd · SHA256Windows SDK · MSBuild · Cake · CILast reviewed Sep 27, 2026
🎯 You’re likely in the right place if:
SignTool says No file digest algorithm specified. Please specify the digest algorithm with the /fd flag.The failure occurs during signtool sign, often after moving to a newer Windows SDK/WDK/HLK/ADK.Your build tool may invoke SignTool for you, so editing a command you never actually run does not fix the generated command.
Choose the stage before adding a flag
Normal signing commandMissing file digest → add /fd SHA256.
RFC 3161 timestamp with /trTimestamp digest is /td, not /fd; keep /fd for the file signature and put /td after /tr. If your command uses legacy /t instead of /tr, do not add /td to that legacy branch.
/fd is already in your scriptCapture the exact SignTool command printed by the build/wrapper. The generated command may still omit it.
Advanced /dg, /ds, or /di workflowDo not force the normal one-line fix onto digest-signing workflows; /di has a documented compatibility edge case.
Difficulty: Easy → ModerateRisk: Low
⚡ Quick Fix — normal signing

If you directly run SignTool to sign an EXE, DLL, MSI, or similar file, specify the file digest explicitly:

signtool sign /fd SHA256 [your existing certificate options] "app.exe"
Template, not a paste-ready command: keep the certificate-selection options your working signing setup already uses (for example a certificate store selector, thumbprint, PFX, or provider configuration). Replace the bracketed text before running it. The fix in this branch is the addition of /fd SHA256, not a change to certificate identity.

Keep your existing certificate-selection options. Do not replace certificate settings just because /fd was missing.

Verify: the exact “No file digest algorithm specified” error should disappear. If another SignTool error appears, diagnose that new stage rather than adding unrelated flags.

ADSENSE · reserved slot after the first useful step

Diagnostic flow — find which digest is actually missing

1
Read the verb: sign or timestamp?
For file signing, /fd is the file digest. For RFC 3161 timestamping, /td is the timestamp digest.
2
Capture the exact command that failed.
Build wrappers can generate a different SignTool command than the configuration you think you supplied.
3
Use the intended file digest explicitly.
For ordinary modern signing, SHA256 is the expected default choice. Keep the requirement tied to the actual sign invocation; separated-digest workflows such as /dg-/ds-/di have different option semantics.
4
Verify the signature after the command succeeds.
Removing the option error is not proof that the artifact was signed as intended.

Fix #1 — understand why an old build started failing

Microsoft documents that Windows 10 SDK/HLK/WDK/ADK builds 20236 and later require digest algorithms to be specified. Current SignTool documentation says the sign command requires /fd. Earlier behavior could produce a warning with exit code 0; later SignTool versions promote the omission to an error.

Practical implication: a script can appear to “break after an SDK upgrade” even though its certificate and source code did not change. Fix the signing command rather than downgrading the SDK just to recover the old implicit behavior.

Verify: inspect the SignTool version/path used locally and in CI, then ensure every active signing path emits an explicit /fd.

Fix #2 — /fd and /td solve different digest problems

/fd SHA256 specifies the digest used for the file signature. /td SHA256 specifies the digest requested from an RFC 3161 timestamp server when you use /tr. One does not replace the other. Legacy Authenticode timestamping uses /t, which cannot be combined with /tr; do not bolt /td onto a /t command.

signtool sign /fd SHA256 /tr "https://YOUR-RFC3161-ENDPOINT" /td SHA256 [your existing certificate options] "app.exe"
Template, not a paste-ready command: replace both the RFC 3161 endpoint and certificate-options placeholder with values from your existing signing provider/workflow before running it.
Ordering matters: Microsoft documents that /td must be declared after /tr. Do not paste a random timestamp endpoint; use the RFC 3161 endpoint documented by your signing provider.

Verify: confirm the command now has both file and timestamp digest options in the correct roles. If the timestamp server itself is unreachable or returns an invalid response, use the dedicated timestamp-server guide.

Fix #3 — already added /fd? Inspect the command your wrapper actually runs

This is the main branch that one-line fixes miss. Cake documented a real case where its SignTool runner omitted /fd unless a digest setting produced the expected argument. Similar problems can occur in build targets, Visual Studio extensions, installer tools, custom PowerShell, or CI templates.

Reader rule: trust the failing process log, not the configuration UI. Find the line that actually launches signtool.exe and verify that /fd SHA256 appears in that command.

For MSBuild/Visual Studio failures, increase build verbosity enough to expose the signing command or inspect the target/script that invokes SignTool. For Cake or another wrapper, set the wrapper’s digest/signing option rather than appending text to a command that the wrapper never uses.

Verify: rerun the build and inspect every emitted SignTool signing invocation. The intended /fd must be present in the specific invocation that fails—not merely in a source/config file or in an earlier signing pass. This matters when a wrapper appends another signature or performs multiple signing stages.

Fix #4 — local works, CI fails after an SDK image update

Compare the SignTool executable selected by each environment. A hosted runner or updated build image may resolve a newer Windows SDK than your workstation, exposing a previously tolerated missing digest option.

where signtool signtool /?

If the runner uses a full versioned path, capture that path from its log as well. Fix the shared signing configuration so every ordinary signing invocation emits the intended /fd instead of pinning an old SDK solely to preserve legacy implicit behavior. If local and CI generate different numbers of signing passes, compare them invocation-by-invocation rather than only comparing the final command.

Verify: compare the actual executable/path and generated signing command on local and CI. Both should explicitly specify the intended file digest.

Fix #5 — advanced digest signing: /dg, /ds, and /di are different

If you use SignTool’s separated digest workflow, do not blindly add /fd to every phase. Microsoft Q&A documents an edge case beginning with SignTool 10.0.20348.0 where sign /di can report the missing-/fd error even though /di is incompatible with /fd. Microsoft documented /fdws as the compatibility switch for that /di scenario.

This is not the normal fix. Use /fdws only for the documented advanced /di digest-signing workflow. Do not substitute it for /fd in ordinary signtool sign commands.

Verify: confirm whether your workflow actually generates/signs/ingests external digests with /dg, /ds, /di. If not, stay with the normal /fd branch.

Final verification — prove the artifact is signed, not just that the error disappeared

signtool verify /pa /v "app.exe"

Use the verification policy appropriate to your artifact; the example above is for general Authenticode. Driver/catalog verification has different policy considerations.

Verify: confirm the expected signer/signature set and digest in verbose output. For append/dual-signing workflows, verify the resulting signatures rather than assuming the final invocation represents the whole artifact. If verification now fails with 0x800B0109—or signing progresses to certificate, timestamp, provider or another concrete error—stop diagnosing missing /fd and follow that new stage.

What not to do

Do not downgrade the Windows SDK solely to restore an old implicit digest behavior.Do not use /td as a replacement for /fd; they apply to different stages.Do not add /fd to /di blindly; advanced digest-signing has a documented compatibility path.Do not switch to SHA1 merely to mimic legacy defaults unless a documented legacy requirement forces it and you understand the security implications.Do not edit certificate selection, trust stores, or timestamp servers when the exact error is simply missing /fd.Do not assume a wrapper forwards a digest setting—inspect the emitted SignTool command.Do not assume one /fd-bearing invocation fixes a wrapper that runs SignTool multiple times; inspect the exact invocation that emits the error.Do not generalize the ordinary sign-command /fd rule onto /dg-/ds-/di separated-digest phases; preserve their documented semantics.Do not keep diagnosing /fd once the exact invocation progresses to a certificate, key-provider, timestamp, trust or other specific signing failure.

Still seeing the exact /fd error?

Capture these before escalating:full redacted SignTool command from the failing process logSignTool path/SDK version used by the failing environmentwhether the command is direct, MSBuild/Visual Studio, Cake, installer tooling, PowerShell, or CI-generatedwhether /fd appears in the actual commandwhether /tr and /td are also presentwhether this is a normal sign command or advanced /dg-/ds-/di workflowlocal vs CI behavior after any SDK/runner image updatethe number/order of SignTool invocations if the workflow signs more than once or appends signatureswhich exact invocation emits the missing-/fd errorthe first different error after that invocation receives the intended digest option

If signtool itself is not recognized, use ‘signtool’ Is Not Recognized. If the command reaches timestamping but the server fails, use Timestamp Server Could Not Be Reached or Returned an Invalid Response. If signing succeeds but verification reports 0x800B0109, use Root Certificate Not Trusted.

Official references

Still stuck? Ask the community

Share the redacted generated SignTool command, SDK path/version, wrapper/build system, and whether the issue reproduces outside that wrapper.

Keep it safe: never post PFX files, private keys, certificate passwords, tokens, private endpoints, or confidential build logs.
Powered by GitHub DiscussionsSign in with GitHub to comment. Reading comments does not require sign-in.

Loading community discussion…