Fix it now
0x80092012 is CRYPT_E_NO_REVOCATION_CHECK: the revocation function was unable to check revocation for the certificate. It is not saying the certificate is bad, only that it could not find out. The usual reason on a managed network is HTTPS inspection – a product reissues certificates under its own authority, and either that chain is not trusted or the lookups it needs are blocked.
certutil -verify -urlfetch C:\temp\server.cer
certutil -urlcache * delete
netsh winhttp show proxy
w32tm /query /status
- Read the certutil output. It names every revocation URL it tried and what happened to each, which is the whole diagnosis in one screen.
- If the issuer is your security product or gateway rather than a public authority, HTTPS inspection is in the path and the rest of the work is about trusting it properly.
- Confirm the inspection authority is trusted machine-wide, not just for the signed-in user: open
certlm.mscand look under Trusted Root Certification Authorities. Services and scheduled tasks read that store, not the user’s. - If the revocation URLs time out, allow them through the proxy and exempt them from inspection. They are plain HTTP by design, and blocking outbound port 80 is the most common single cause of this error.
certutil -urlcache * delete clears the current user’s cache. A service failing under the machine account is looking at a different cache, so clear it in that context or restart the service after the underlying fix.
If certutil now returns a revocation result for every link in the chain, you are done. If not, the next section explains what the chain engine is trying to do and which of the four companion codes you really have.
Why it happens
When Windows validates a certificate it builds a chain to a trusted root and then checks each link for revocation. It learns where to check from fields inside the certificate: the CRL distribution point gives a URL for a revocation list, and the authority information access field gives an OCSP responder address. Both are ordinary HTTP fetches. If they fail, the engine has a chain it can build but cannot vouch for, and it returns 0x80092012.
HTTPS inspection breaks this in three ways at once. It replaces the real certificate with one it issues on the fly, so the original revocation pointers are gone. It usually publishes nothing in their place, because a locally issued certificate has no public revocation list. And the device performing the inspection frequently blocks plain outbound HTTP, which is exactly the protocol CRL and OCSP use.
The result moves around in a way that looks arbitrary until you know why. A browser succeeds while an application fails, because they use different trust stores and different revocation policies. A machine-context process fails while the interactive user succeeds, because the inspection authority was installed into that user’s store rather than the computer’s. The companion codes tell you which of these you have: 0x800B0101 is CERT_E_EXPIRED, which Microsoft states as the certificate having either expired or not yet become valid; 0x800B010F is CERT_E_CN_NO_MATCH, the common name of the certificate not matching the value the application specified; and 0x80092010 is CRYPT_E_REVOKED, which is the one case where the answer came back and the answer was yes.
The inspection authority is not in the local machine trust store
You have this one if The interactive user is fine while services, scheduled tasks and installers fail, or certutil -verify run elevated reports an untrusted root.
- Export the inspection authority’s certificate from the security console or gateway.
- Deploy it to Trusted Root Certification Authorities in the computer store; on a domain, use the Public Key Policies section of Group Policy.
- On a standalone machine:
certutil -addstore -f Root C:\temp\inspection-ca.cer. - Confirm with
certutil -store Root, then restart the failing service so it re-reads the store.
Applications with their own trust stores – Java, Firefox, Node.js, Python, many database drivers – need the certificate added separately. Windows trust does not reach them.
Revocation lookups are being blocked
You have this one if certutil -verify -urlfetch shows the CRL or OCSP fetch failing or timing out while the rest of the chain validates cleanly.
- Allow outbound HTTP to the revocation endpoints the certutil output names. They are plain HTTP by design.
- Where a proxy is required, make sure machine-context traffic uses it: check with
netsh winhttp show proxyand set it if the system account needs one. - Exempt the revocation hosts from HTTPS inspection so their responses are not rewritten.
- Clear the cache with
certutil -urlcache * deleteand repeat the verify in the same context that failed.
The destination should not be inspected at all
You have this one if Failures are limited to specific services – certificate-pinned applications, update endpoints, banking or government portals – while general browsing works.
- In the endpoint or gateway policy, add those destinations to the HTTPS scanning exclusion list by host name.
- Where the product allows it, exclude the application rather than the destination; that is more precise for pinned clients.
- Push the policy and confirm the client now sees the real certificate, issued by a public authority.
- Retest without rebooting where you can, so you know the change alone fixed it.
Applications that pin certificates will never work through inspection, by design. Exempting them is the intended answer rather than a workaround.
Clock skew, or a chain that has genuinely expired
You have this one if 0x800B0101 accompanies the failure, or the error appeared suddenly across many machines on the same morning.
- Check the client with
w32tm /query /statusand compare it against the domain hierarchy. - Resynchronise with
w32tm /resyncand confirm a domain member is using a domain controller as its source. - If the inspection authority itself has expired, reissue it on the gateway and deploy the new certificate before removing the old one.
- On a virtual machine restored from an old snapshot, expect every chain to fail until the clock catches up.
There is no /force parameter on w32tm /resync. The documented parameters are /computer, /nowait, /rediscover and /soft; anything else is reported as unexpected and the command exits without resynchronising.
The name on the certificate does not match the host
You have this one if 0x800B010F, typically after a rename, a new alias, or traffic sent to an internal load balancer name.
- Read the presented certificate’s subject alternative names as well as its common name.
- Reissue the server certificate with every name clients actually use listed as a subject alternative name.
- Where inspection generates the certificate on the fly, confirm it copies the original names across.
- Retest by name and by alias, from a machine that was failing.
Full reference
The four codes, as Microsoft states them
| Code | Constant | Microsoft’s description |
|---|---|---|
0x80092012 |
CRYPT_E_NO_REVOCATION_CHECK | The revocation function was unable to check revocation for the certificate |
0x800B0101 |
CERT_E_EXPIRED | The certificate has either expired or is not yet valid |
0x800B010F |
CERT_E_CN_NO_MATCH | The common name of the certificate does not match the value specified by the application |
0x80092010 |
CRYPT_E_REVOKED | The certificate is revoked |
The last row is the one to take seriously. 0x80092010 is not a plumbing failure: the lookup succeeded and the issuer has withdrawn the certificate. Nothing in this article applies to it. Find out why it was revoked before you do anything else, and treat a revoked certificate on an internal service as an incident until you know otherwise.
Reading certutil output properly
certutil -verify -urlfetch <file.cer>builds the chain and, because of-urlfetch, actually retrieves the AIA certificates and CDP revocation lists rather than relying on what is cached.- Work down the output looking for each URL and the result beside it. A URL that returns a list is fine; one that times out is your blocked lookup.
- Run it as the account that fails. An administrator session and a service running as the machine account do not share a proxy configuration or a URL cache.
- Clear stale results with
certutil -urlcache * delete, which Microsoft documents as deleting the relevant URLs from the current user’s local cache, and repeat.
Commands worth knowing
| Command | What it does |
|---|---|
certutil -verify -urlfetch <file> |
Verifies a certificate or chain and fetches AIA certificates and CDP revocation lists |
certutil -urlcache * delete |
Deletes the relevant URLs from the current user’s local cache |
certutil -addstore -f Root <file> |
Adds a certificate to the machine’s Root store |
certutil -store Root |
Dumps the Root store so you can confirm what is trusted |
netsh winhttp show proxy |
Shows the proxy the machine account uses, which is often not the user’s |
w32tm /query /status |
Shows the time source and the current offset from it |
Microsoft’s own note on certutil is worth repeating: it is not recommended for use in production code and carries no guarantee of application compatibility. As an interactive diagnostic it is excellent; as a component of a script that other people depend on, it is a liability.
Why the browser works when your application does not
Browsers generally soft-fail revocation, treating an unreachable responder as acceptable and continuing, while the Windows chain engine and code-signing checks hard-fail and stop. Several browsers and runtimes also carry their own trust stores and their own revocation caches. So a browser succeeding proves almost nothing about the machine’s chain configuration, and testing with one is the most common way people convince themselves a problem is fixed when it is not. Test with certutil -verify -urlfetch, in the account that fails.
Turning revocation checking off
Relaxing revocation behaviour through the chain engine’s configuration under HKLM\SOFTWARE\Microsoft\Cryptography affects every certificate decision the machine makes, including code signing. Export the branch before you touch it, treat the change as a temporary diagnostic, and reverse it. It disables the mechanism that would tell you a stolen certificate has been withdrawn.
Doing inspection properly, if you are going to do it
- Deploy the inspection authority to the computer store on every machine, not the user store, and push it by policy rather than by hand.
- Add it to the trust stores of every runtime that keeps its own – Java, Node.js, Python, Firefox, database drivers.
- Exempt certificate-pinned destinations and software update endpoints by name, and keep that list somewhere people can find it.
- Leave outbound HTTP to revocation endpoints open, and exempt those hosts from inspection so their responses are not rewritten.
- Keep the inspection authority’s own expiry in the calendar. When it lapses, every chain on every machine fails at once.
When a licence is the actual fix
Nothing about the repair costs money: deploying a root certificate through Group Policy, opening the revocation URLs and correcting a clock are all free. What a licence buys is doing it once instead of per machine. Bitdefender GravityZone Business Security includes a Content Control module that Bitdefender describes as scanning web traffic including SSL and allowing access restrictions by application, site or category, with policy held in a single integrated management console. That is the difference between an exclusion list somebody maintains and an exclusion list nobody can find. Turning HTTPS scanning off remains free and is a legitimate choice for a small estate. Arco can advise which GravityZone tier carries the web protection features you actually need, and will say so if you do not need them.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
0x80092012 |
CRYPT_E_NO_REVOCATION_CHECK: the revocation function was unable to check revocation for the certificate | Microsoft Learn |
0x800B0101 |
CERT_E_EXPIRED: the certificate has either expired or is not yet valid, which includes the case where the machine’s clock is wrong | Microsoft Learn |
0x800B010F |
CERT_E_CN_NO_MATCH: the common name of the certificate does not match the value specified by the application | Microsoft Learn |
0x80092010 |
CRYPT_E_REVOKED: the certificate is revoked – the lookup worked and the answer was yes | Microsoft Learn |
Confirm the fix worked
certutil -verify -urlfetchagainst the certificate that failed returns a result for every revocation check rather than a timeout.- The inspection authority appears under Trusted Root Certification Authorities in
certlm.msc, the computer store. - The failing operation succeeds from a service or scheduled task context, not only as the signed-in user.
w32tm /query /statusshows a small offset from a time source the machine should be using.- A second machine built the same way behaves the same, which tells you the fix is in policy rather than on one desktop.
Questions people ask about this
Can I just turn off revocation checking?
You can, and it is a fair way to confirm the diagnosis, but it is a poor permanent setting: it disables the mechanism that would tell you a stolen certificate has been withdrawn, for every certificate decision the machine makes. Fix the lookup path or exempt the destination instead.
Why does the browser work when my application does not?
Browsers generally soft-fail revocation, treating an unreachable responder as acceptable, while the Windows chain engine hard-fails. Several browsers and runtimes also keep their own trust stores, so a browser test tells you very little about the machine.
Does HTTPS inspection have to break this?
No. Done properly, the inspection authority reaches every machine and application trust store, revocation endpoints stay reachable, and pinned destinations are exempted. This error is a sign of an incomplete rollout rather than an inherent flaw.
I have 0x80092010 rather than 0x80092012. Same thing?
No, and it is more serious. 0x80092010 is CRYPT_E_REVOKED: the check succeeded and the issuer has revoked the certificate. Do not work around it. Find out why it was revoked.
Is there a cost to fixing this?
Not for the fix. Deploying a root certificate through Group Policy, opening the revocation URLs and correcting the clock are all free. A licence matters only if you want the inspection and exclusion policy managed centrally rather than machine by machine.
