skip to content

Where on a host does a client's trust in a certificate authority actually live, and what happens when an issuer is absent from it?

level: juniorimportance: must knowfreq 72%

answer

  1. trust is a lookup, not a judgement
  2. the list is local configuration
  3. shipped by a vendor or added by hand
  4. no entry for the issuer means rejected
  5. an anchor may vouch for any name

basics

~20 s

Trust lives in a local anchor list - a file or database of root certificates the client was configured to accept. If the issuer at the top of what a server presents has no entry there, the client rejects it.

solid answer

~50 s

A client does not reason about whether a certificate authority is reputable; it performs a lookup. Somewhere on the host there is a list of **trust anchors**, and an authority is trusted precisely when it has an entry in the list the running process reads. That list arrives as configuration: a platform vendor ships and updates a set of roots, a language runtime ships its own bundle, a browser root program curates one, or an administrator adds an entry by hand. When the issuer at the top of what a server presented is not in that list, the client cannot get from the presented certificate to anything it was told to accept, and it fails the connection with a trust error rather than a name or expiry error. That is why a self-signed end-entity certificate and one issued by an internal CA that was never installed both warn.

code

pseudocode · 7 lines
pseudocode
anchors = load the anchor list configured for this process
issuer  = the issuer of the topmost certificate the peer sent

if issuer has an entry in anchors:
    continue validating
else:
    reject: "issuer is not a trusted anchor"

go deeper

for a junior

Recall that trust is a local list of root certificates, that the client checks membership in it, and that a self-signed certificate fails because nothing anchors it.

for a middle

Explain where the list comes from - vendor-shipped, runtime-shipped, or administrator-added - and separate an untrusted-issuer failure from an expiry or name-mismatch failure.

for a senior

Show the diagnostic habit: ask which list the failing process actually reads before touching any certificate, and treat adding an anchor as an authority grant with a blast radius.

for a principal

Frame anchor contents as policy. Who may add an entry, what an entry authorises, and how that decision is reviewed matter more than any individual certificate on the estate.

A client that refuses a connection "because the certificate is not trusted" is reporting the outcome of a **lookup**, not a judgement. Somewhere on the machine there is a list of trust anchors, and the authority that issued the server's end-entity certificate either has an entry in the list that this particular process reads, or it does not. Nothing else happens. There is no network query about reputation, no authority-of-authorities, and no scoring. ## The anchor list is local, and it is a policy decision made earlier The list is configuration that arrived on the host before the connection did. It gets there in a small number of ways: - an **operating-system anchor store**, assembled and updated by the platform vendor, read by services that link the platform's own transport-security facilities; - a **language runtime's own keystore file**, shipped with the runtime and updated on the runtime's release schedule rather than the platform's; - a **separate security-library certificate database**, used by whatever links that library; - a **browser root program's list**, curated by the browser's vendor against its own inclusion policy and shipped with the browser; - **entries an administrator added by hand**, typically an internal or corporate issuing authority. So "the client trusts that CA" always decomposes into: somebody decided, at some earlier point, that this authority may vouch for names, and encoded that decision as an entry in a list this process happens to read. ## The three shapes of an "untrusted issuer" failure Almost every trust warning a junior engineer meets is one of these: 1. **A self-signed end-entity certificate.** The certificate names itself as its own issuer, so the only anchor that could accept it is itself - and it has no entry. This is the default outcome of generating a certificate locally and pointing a service at it. 2. **Issued by an internal CA that is not installed on this host.** The chain is perfectly well formed and the internal root exists; it simply has no entry in the list this client reads. The same server will be accepted from a host where the internal root was installed. 3. **Issued under a root the list no longer carries.** An anchor entry that a platform once shipped and has since removed, or that an administrator removed, makes everything issued under it stop verifying at once - without any change to the certificates themselves. ## Why two servers on the same network behave differently | The end-entity certificate was issued by | Entry in this client's anchor list? | Result | |---|---|---| | a public certificate authority the platform ships | yes, shipped by the vendor | connects with no warning | | an internal CA installed on this host | yes, added by an administrator | connects with no warning | | an internal CA installed only on other hosts | no | rejected as an untrusted issuer | | the server itself (self-signed) | no | rejected as an untrusted issuer | Read that table the other way round and it is the single most useful diagnostic habit on this subject: the question is never "is this certificate valid?" but **"valid according to whose list?"** ## What an anchor entry authorises An entry is not scoped to the one server you added it for. An anchor is an authority to vouch for names, and unless the entry itself carries a constraint, an authority you anchor can issue for *any* name and the client will accept it. That is the reason adding an anchor is an administrative act with a blast radius, and the reason a list of anchors is worth knowing the contents of. It is also why "just add the certificate to the trust store" is a heavier instruction than it sounds when the thing being added is a certificate authority rather than a single server's certificate. ## The distinction that trips people A trust error is not an expiry error and not a name-mismatch error. Those three are reported separately and have separate fixes: - **untrusted issuer** - fix the anchor list, or get the certificate issued under an authority already in it; - **expired** - the presented certificate's own validity window has passed; - **name mismatch** - the name you connected to is not among the names the certificate covers. Only the first is a trust-store question. Conflating them is why people install a root certificate to fix a problem that installing a root certificate cannot fix. ## Practical consequence On a hardened host that must accept instrumentation signed by one internal authority and nothing else, the entire security posture reduces to the contents of the anchor lists on that host: which entries are present, who put them there, and which process reads which list. Everything downstream of that - path building, revocation, expiry - only ever runs against anchors the list already contains.

  • The server's operator says "but the certificate is valid, I checked it" - what are they likely to have checked, and why does it not settle the argument?
    They almost certainly checked the certificate's own contents: that its validity window has not passed and that it covers the name in question. Neither of those involves the client's anchor list. Validity is a property of the certificate; trust is a property of the verifier's configuration. A perfectly well-formed, unexpired, correctly named certificate is rejected by any client that has no entry for the authority that issued it.
  • Why does adding the server's own end-entity certificate to the anchor list sometimes appear to work, and why is it a poor habit?
    Some validators will accept a presented certificate that is itself an entry in the anchor list, so the connection succeeds. It is poor practice because the entry expires when that one certificate does, so the fix silently breaks at the next renewal, and because it teaches the habit of editing anchor lists to solve per-server problems. Anchoring the issuing authority, or fixing issuance, is the durable answer.

A doorman does not decide whether your host is important; he checks a guest list handed to him before the party. Trust anchors are that list, and the guest cannot supply it.

saying these in an interview costs you the question

  • Says the client checks the CA's reputation over the network
  • Thinks one global trust list exists for all software
  • Calls a self-signed certificate invalid rather than unanchored
  • Confuses an untrusted-issuer error with an expiry error
  • Believes an anchor only vouches for the server it was added for