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 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./fd SHA256./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.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"/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.
Diagnostic flow — find which digest is actually missing
For file signing, /fd is the file digest. For RFC 3161 timestamping, /td is the timestamp digest.
Build wrappers can generate a different SignTool command than the configuration you think you supplied.
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.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.
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"/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.
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.
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
Still seeing the exact /fd error?
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.
Loading community discussion…
Comments could not load here. Open ErrorHarbor Discussions on GitHub →