Skip to main content

    Sigstore vs Code Signing Certificates: What Each One Can Actually Prove

    Sigstore signs build artifacts for free, but a Sigstore signature will not stop the Windows Unknown Publisher warning. Where each one works, and why.

    MS
    My-SSL Team
    ·
    14 min read
    ·
    Published August 9, 2026
    ·
    Last updated August 9, 2026

    Sigstore and a code signing certificate solve different halves of the same problem, and neither one substitutes for the other. Sigstore signs build artifacts free of charge — container images, npm and PyPI packages, release binaries — using a certificate that lives for about ten minutes, bound to an OpenID Connect identity and recorded in a public transparency log, which is exactly what package registries and CI policy engines check. A publicly trusted code signing certificate is what Windows checks, because Sigstore’s Fulcio root is not in the Microsoft Trusted Root Program: as of August 2026, a Windows executable signed only with Sigstore still opens with Unknown Publisher on it. Ship an installer to end users and you need the certificate; publish a library to a registry and Sigstore is the better fit.

    If you already know the answer is “an installer that end users double-click,” the rest of this page is background reading and the code signing certificates My-SSL issues through Certum are the part you actually need. Everyone else: the differences below are worth ten minutes, because picking the wrong one is usually discovered late, on a release day.

    The same release checked by two different verifiers: a package registry that reads Sigstore, and a Windows machine that does notOne build artifact at the left branches into two delivery paths. The upper path goes to a package registry and a CI policy engine, which verify a Sigstore signature against the Rekor transparency log and accept it. The lower path goes to an end user double-clicking an installer on Windows, where the operating system reads only the Authenticode signature embedded in the file and checks that it chains to a certificate authority in the Microsoft Trusted Root Program. The Sigstore bundle travelling alongside the file on that lower path is marked as never read, so an artifact signed only with Sigstore still raises the Unknown Publisher warning.One artifact. Two verifiers. Only one of them reads Sigstore.Your buildone artifactSigstore signatureOIDC identity, 10-min certlogged in RekorRegistry & CI policynpm, PyPI, containersVerifiedInstaller .exe / .msiSigstore bundle beside itnever opened by WindowsWindows Authenticodewants a Microsoft-trustedroot in the file itselfUnknown PublisherThe signature is fine. The audience on the lower path was never looking for it.
    The mistake is not signing badly — it is signing for the wrong verifier. Registries were built to read Sigstore; Windows was not.

    What is Sigstore, and what does it sign?

    Sigstore is a free, open-source signing system maintained under the Open Source Security Foundation. Rather than handing you a long-lived certificate and a private key to guard, it authenticates you through an identity you already have — a GitHub account, a CI workflow — issues a certificate valid for roughly ten minutes, signs with a key that never leaves memory, and records the event in a public, append-only log.

    Three components do the work. Fulcio is the certificate authority: it accepts an OpenID Connect token, checks it, and issues a short-lived X.509 certificate binding that identity to a freshly generated key pair. Rekor is the transparency log, an immutable ledger that records the signature and the certificate so anyone can later confirm the signing happened while the certificate was still valid. Cosign is the client most people actually run, and since version 3 it reads and writes the standardised Sigstore bundle format.

    The part that surprises people coming from traditional PKI is that there is no key to lose. The private key exists for the duration of one signing operation and is discarded; what persists is the log entry proving the identity that signed. That inverts the usual threat model. There is no token in a drawer, no HSM credential in a secrets manager, and nothing an attacker can steal from you after the fact — but equally, no long-lived key you can point at as “yours” the way a certificate holder can.

    What gets signed is deliberately broad: container images, arbitrary blobs such as release tarballs and installers, SBOMs, and build provenance attestations describing which workflow produced which file. In every case the signature and certificate are stored as a bundle beside the artifact or in the registry that holds it. That storage choice is harmless for a container image and decisive for a Windows executable, for reasons the Windows section gets to shortly.

    How the trust model differs from a CA-issued certificate

    Both issue X.509 certificates with a code signing extended key usage. What differs is what the certificate binds, and who trusts the root. A code signing certificate binds a vetted organisation to a key you hold for up to 460 days, and its root ships inside operating systems. A Fulcio certificate binds an OIDC identity to a key that exists for ten minutes, and its root reaches Sigstore clients only.

    How a Fulcio certificate is issued in seconds compared with how a code signing certificate is issued over daysTwo horizontal issuance flows. The upper flow is Sigstore: sign in with an existing OpenID Connect identity, Fulcio issues a certificate valid for about ten minutes bound to an ephemeral in-memory key, the signature and certificate are recorded in the Rekor public transparency log, and the certificate then expires. The lower flow is a publicly trusted code signing certificate: the certificate authority validates the organization or individual with documents, the private key is generated inside certified hardware, and the resulting certificate is valid for up to 460 days and chains to a root in operating-system trust stores. The upper flow is measured in seconds, the lower flow in days.Same certificate format. Opposite ideas about what a key is for.Sigstore — secondsOIDC loginGitHub, CI, GoogleFulcio issues~10-minute certSign in memorykey never on diskRekor logs itpublic, permanentNothing to store, nothing to renew — the certificate is gone before you finish reading this line.Code signing certificate — daysIdentity checkdocuments, callbackKey in hardwarerequired since 2023Cert issuedup to 460 daysOS trusts rootMicrosoft programA key you hold, guard, and renew — in exchange for a root that ships inside Windows.Gold marks the step that decides who will accept the signature.
    Both lanes end in an X.509 certificate. The last box in each lane is the only one that determines whether a given verifier cares.

    That difference cascades into everything else. Expiry, for one: a code signing certificate needs an RFC 3161 timestamp so signatures keep verifying after the certificate lapses, while Sigstore leans on the Rekor log entry to prove the signature landed inside its ten-minute window. Different machinery, the same goal — a signature that outlives the certificate behind it.

    Revocation splits the same way. A CA can revoke a code signing certificate and backdate the effective date to a suspected compromise, which retroactively invalidates signatures made after that moment, including on software already installed. Sigstore has no equivalent lever and does not need one in the same way: the certificate expired minutes after issuance, so the question becomes whether you still trust the identity in the log entry, which is a policy decision made by whoever is verifying.

    There is one more asymmetry worth naming, because it decides most real arguments. Identity in Sigstore is an account — repo owner, workflow, email address. Identity in a code signing certificate is an organisation that a CA checked against registry records and a callback, which is why the publisher name in a Windows dialog reads as a company rather than a username. Neither is more honest; they answer different questions.

    Does a Sigstore signature stop the Unknown Publisher warning?

    No. As of August 2026, Sigstore’s Fulcio root is not part of the Microsoft Trusted Root Program, and Windows Authenticode only honours signatures chaining to a CA that is. A Sigstore signature also lives in a separate bundle file rather than inside the executable’s own signature slot, so Windows never reads it in the first place. Sign an installer with Sigstore alone and users still see Unknown Publisher.

    Where an Authenticode signature lives inside an executable and where a Sigstore bundle sits outside itA schematic of an installer file drawn as a stack of sections: headers, code, resources, and a signature slot at the bottom. An Authenticode signature sits inside that signature slot and is read by Windows, which walks the certificate chain to a root in the Microsoft Trusted Root Program and confirms the code signing extended key usage with object identifier 1.3.6.1.5.5.7.3.3. A Sigstore bundle is drawn as a separate file outside the executable, connected by a dashed line marked not read at launch, because Windows only inspects the embedded signature slot.Windows looks in exactly one place. Sigstore writes somewhere else.installer.exePE headersCode sectionsResourcesSignature slotAuthenticode lives hereWhat Windows then checksChain reaches a root in theMicrosoft Trusted Root ProgramEKU is code signing (1.3.6.1.5.5.7.3.3)Signature matches the file hashTimestamp, if present, was validinstaller.exe.sigstoreseparate file — not read at launchTwo independent problems: the wrong location, and a root Windows has never been told to trust.
    Even if Windows were willing to trust Fulcio tomorrow, a detached bundle would still be invisible to a double-click.

    It is worth separating the two failures, because fixing one would not fix the other. Authenticode expects the signature to be embedded in the file’s security directory, appended to the binary itself; that is what SignTool writes and what Windows parses on launch. Cosign produces a detached bundle sitting next to the file. Nothing in the double-click path goes looking for a second file, so the signature could be perfect and Windows would still report the executable as unsigned.

    Suppose you solved that and got the signature into the right slot. Windows would then walk the chain and require a root in the Microsoft Trusted Root Program, plus the code signing EKU with OID 1.3.6.1.5.5.7.3.3. Fulcio issues certificates with that EKU, but its root is distributed through Sigstore’s own trust root to Sigstore-aware clients, not through Microsoft’s program. The chain terminates in something Windows has never been told to trust, and the verdict is the same warning you started with — the familiar Unknown Publisher dialog.

    Reputation is a third, separate layer that neither option buys outright. Even a correctly Authenticode-signed installer can trip SmartScreen until the publisher accumulates download history, which is a genuinely common surprise for teams who expected a certificate to switch the warning off on day one. We wrote up what actually moves that needle in the guide to SmartScreen publisher reputation. The short version: a certificate is the entry ticket, not the whole answer — and Sigstore does not even get you to the door, because SmartScreen has no notion of a Sigstore identity to build reputation against.

    If the reason you were hoping Sigstore would work is that you would rather not buy and babysit a hardware token, that problem has a different solution. Cloud-based code signing keeps the key in a certified HSM and signs over an API, so a CI job can sign without anything physical in the room, and Microsoft’s own managed service takes a comparable approach — the trade-offs are laid out in Azure Trusted Signing versus a code signing certificate.

    Where Sigstore is the right tool

    Sigstore wins wherever the verifier is software you can point at a policy: package registries, container runtimes, admission controllers, and CI pipelines. Those verifiers were built in the last few years, they already understand Sigstore bundles, and several now expect them by default. For that audience Sigstore is not merely adequate — it is better than a purchased certificate, because it costs nothing and leaves no key to steal.

    The adoption is concrete rather than aspirational. PyPI turned on Sigstore-backed attestations for trusted publishers in late 2024. npm publishes build provenance through the same machinery, and Trusted Publishing reached general availability in July 2025, attaching a provenance attestation automatically when a package is published over OIDC. GitHub’s artifact attestations are Sigstore under the hood, and Homebrew uses them to bind each bottle to the workflow that built it. Cosign v3 verifies all of these with one command.

    There is a second category worth flagging: anything an auditor or a downstream consumer needs to trace rather than launch. Build provenance, SBOM signatures, internal artifact promotion between environments — all of it is verified by tooling you control, so the trust root question never reaches an operating system. If your compliance requirement is “prove this binary came from this commit through this pipeline,” Sigstore answers it more directly than a code signing certificate does, because the provenance is the point rather than a side effect.

    One honest caveat. Because verification depends on Sigstore-aware tooling, “signed with Sigstore” only means something where somebody is actually checking. Publishing an attestation that no consumer verifies is a good habit rather than a control. It is still worth doing — the habit is what makes the control possible later — but do not confuse the two when writing a security claim.

    Where you still need a code signing certificate

    You need a publicly trusted code signing certificate whenever an operating system stands between your file and a human being. Windows executables, installers, DLLs, drivers, PowerShell scripts and Java archives are all checked by software that ships with the platform and trusts a fixed list of roots. No amount of transparency-log evidence substitutes, because the component doing the checking was never taught to look for it.

    What you are shippingWhat actually verifies itWhat you need
    Windows .exe, .msi, .dllAuthenticode + SmartScreenCode signing certificate
    Windows kernel driverKernel signature policyEV certificate + Microsoft attestation signing
    macOS applicationGatekeeper + notarizationApple Developer ID (neither option here)
    Java JAR, applet, Android-adjacentjarsigner / runtime policyCode signing certificate
    Container image, Helm chartRegistry, admission controllerSigstore
    npm / PyPI packageRegistry provenance checksSigstore

    Two rows in that table catch people out. Kernel drivers need more than a certificate — Microsoft has to countersign the driver through its own portal, and the certificate is the credential that gets you into the process rather than the end of it; the sequence is walked through in how to sign a Windows driver. And macOS is the row where the honest answer is “neither”: Gatekeeper wants an Apple-issued Developer ID plus notarization, so a certificate bought from any commercial CA will not help you there.

    The practical consequence for cross-platform teams is three signing paths, not one. That sounds worse than it is in practice, because each path is automatable and only the Windows one involves a purchase decision. It does mean any plan that starts “we will just use Sigstore for everything” needs revisiting before the first desktop release rather than after the support tickets arrive.

    Using both on the same release

    Running both is normal, and for anything that ships a desktop installer alongside packages or images it is the sensible default. The two signatures do not overlap or conflict: Authenticode is embedded in the binary for the operating system to read, while the Sigstore bundle travels with the release for registries, auditors and downstream pipelines. Adding the second one costs a pipeline stage, not a decision.

    A release pipeline that signs the same build twice, once with Authenticode and once with SigstoreA single build stage feeds two parallel signing stages. The upper stage applies an Authenticode signature using a code signing certificate held in a cloud hardware security module, producing the installer that end users download. The lower stage applies a Sigstore signature using the pipeline's own workflow identity, producing the provenance attestation that registries and downstream policy engines verify. Both stages feed a single publish step, showing that the two signatures serve different verifiers rather than competing.Mature pipelines do not choose. They sign twice.BuildreproducibleAuthenticode signcert in a cloud HSMSigstore signworkflow identityEnd usersno scary dialogRegistries & auditorsprovenance proofOne build, two signatures, two audiences — and no argument about which one is the real signature.
    The two signing steps do not overlap, which is why running both costs you a pipeline stage rather than a decision.

    A workable order of operations is to Authenticode-sign first, then let Sigstore attest the already-signed artifact. That way the provenance statement covers the exact bytes users will download, hashes included, and you avoid the awkward case where the attestation describes an unsigned intermediate that nobody ever receives. If you attest first and sign afterwards, the hash in the log entry no longer matches the shipped file, which is a confusing thing to debug six months later.

    Both steps belong in CI rather than on a laptop. The Sigstore half is naturally at home there, since the workflow identity is the thing being signed with. The Authenticode half needs the key to be reachable from the runner without a token plugged into a machine under someone’s desk, which is precisely the problem cloud signing solves — the setup patterns are covered in code signing in CI/CD pipelines.

    What each one costs you

    Sigstore costs nothing and takes little effort: no purchase, no validation, no key custody, and a few lines in a workflow file. A code signing certificate costs money and calendar time — organisation or individual validation with documents, a private key required to live inside certified hardware since June 1, 2023, and renewal at least every 460 days for certificates issued on or after March 1, 2026.

     SigstoreCode signing certificate
    PriceFreePaid, per certificate
    Time to first signatureMinutesDays, pending validation
    Key custodyNone — ephemeral keyHardware token or cloud HSM
    Certificate lifetimeAbout 10 minutesUp to 460 days
    Trusted by an operating systemNoYes

    The last row is the one you are actually paying for. Everything above it favours Sigstore, and none of it matters if the file has to satisfy Windows. That is an uncomfortable value proposition to write down as a reseller, but it is the accurate one, and pretending otherwise is how people end up buying a certificate for a container image that never needed it.

    On the certificate side, the shortened validity is the change most worth planning around, since it turns renewal into a recurring operational task rather than a three-yearly afterthought — the timeline and its knock-on effects are in code signing certificate validity, and current market figures sit in code signing certificate prices. Individual maintainers on non-commercial projects should also look at the open-source code signing tier, which exists precisely for people who find themselves needing Authenticode without a company behind them.

    Which one do you need?

    Ask one question: when a human opens this file, does an operating system inspect it? If yes, you need a code signing certificate for Windows or an Apple Developer ID for macOS, and Sigstore cannot stand in. If no — because the consumer is a registry, a runtime or a pipeline — Sigstore is the better answer, and a purchased certificate buys nothing those consumers read.

    A decision tree for choosing between Sigstore, a code signing certificate, or an Apple Developer IDThe tree starts with one question: does an operating system have to approve the file when a person opens it? If the answer is no, because the artifact is consumed by a registry, a container runtime, or a pipeline, the recommendation is Sigstore. If the answer is yes, a second question asks which platform. Windows executables and installers need a publicly trusted code signing certificate. macOS applications need an Apple Developer ID certificate and notarization, which neither Sigstore nor a commercial certificate authority can supply.One question decides it: who has to approve the file?Does an OS gatekeeper meet this filewhen a human opens it?NoYesUse Sigstorepackages, container images,SBOMs, build provenanceWhich platform?the answers differWindowscode signing certmacOSApple Developer IDFree, automated, and alreadyexpected by these registries.
    Most teams answer “yes” for one artifact and “no” for another in the same release, which is how they end up needing both.

    Most teams find they answer both ways within a single release. The desktop installer meets Windows; the container image and the published package never do. That is not a compromise or a hedge, it is just what happens when one repository produces artifacts for audiences with different verifiers, and it is why the two technologies have coexisted rather than one displacing the other.

    Where this reliably goes wrong is the assumption that free signing at the registry layer will eventually cover the desktop layer too. It has not, and there is no announced plan for it to. Budget for the certificate if you ship software people install, and enjoy the fact that the other half of your supply chain is genuinely free to secure.

    Frequently Asked Questions

    Get instant answers to common questions about SSL certificates and our services.

    Still Have Questions?

    Our SSL experts are available 24/7 to help with any questions about certificates, installation, or technical issues.

    Shipping something Windows has to open?

    Keep Sigstore for your packages and images — it is free, and the registries already read it. For the installer that lands on a customer’s desktop, you need a certificate that chains into the Windows trust store. My-SSL issues Certum code signing certificates, including cloud signing through SimplySign for teams that would rather not manage a physical token, and the code signing certificate options and pricing are listed with the validation documents each one requires, so you can see what the process asks of you before you start it.