skip to content

How can one end-entity certificate have two valid certification paths, ending at two different trust anchors, at the same moment?

level: seniorimportance: nice to knowfreq 33%

answer

  1. same key, certified twice
  2. the path belongs to the verifier
  3. a cross-certificate covers another CA's key
  4. new anchor reached in fewer hops
  5. old anchor still reachable through the extra hop

basics

~20 s

Cross-certification. The same CA name and public key can be certified by more than one issuer, so a verifier reaches whichever anchor its own certificates and anchor list allow - and both paths verify at once.

solid answer

~50 s

A **cross-certificate** is a certificate one CA issues over another CA's name and public key. Because the key being certified is unchanged, everything issued beneath that CA is untouched: a leaf it signed now reaches whichever anchor a given verifier can get to. That is how an anchor transition is performed without reissuing anything below. A newer root is cross-certified by an older root that is already widely held, so a verifier holding the new anchor stops one hop earlier, while one holding only the old anchor keeps walking through the cross-certificate and still succeeds. The consequence is that a path is not a property of the certificate - it is a property of the verifier. A verifier that assembles one path and stops can reject a leaf that a searching verifier accepts, which is why the same certificate works on one client and not another.

code

pseudocode · 14 lines
pseudocode
end-entity certificate
    subject = CN=service.example.com
    issuer  = CN=Example Issuing CA

path A  (verifier holds the newer anchor)
    CN=Example Issuing CA   issued by CN=Example Root R2
    anchor held             CN=Example Root R2            -- stops here

path B  (verifier holds only the older anchor)
    CN=Example Issuing CA   issued by CN=Example Root R2
    CN=Example Root R2      issued by CN=Legacy Root R1   -- cross-certificate
    anchor held             CN=Legacy Root R1             -- stops here

-- same leaf, same issuing CA key, two valid paths at the same instant

go deeper

for a junior

Take away one idea: a certificate does not carry its own chain. The run of certificates leading to something trusted depends on what the machine doing the checking happens to hold.

for a middle

Explain what a cross-certificate certifies - another authority's name and public key - and why that leaves every certificate already issued beneath that authority untouched.

for a senior

This is the shape of a real incident. Be able to say why one client population fails while another does not, and how you would confirm it without touching the end-entity certificate.

for a principal

An anchor transition is a multi-year commitment to two populations at once. Decide up front how long the compatibility path will be carried and what evidence will tell you the older population has shrunk enough to stop.

## What a cross-certificate actually is A cross-certificate is an ordinary certificate with an unusual subject: one certification authority issues it over *another authority's* name and public key. Nothing exotic is happening in the encoding. The `subject` is the second authority's name, the `SubjectPublicKeyInfo` holds that authority's existing public key, and the signature is made by the first authority's key. The crucial property follows from that: **the key being certified does not change.** Every certificate that authority has already issued was signed with the same private key, so every one of them still verifies. A new certificate has appeared *above* the authority, and nothing below it has moved. That is what makes two simultaneous paths possible. Given one leaf: - a verifier holding the newer anchor walks leaf, issuing CA, done - it has already reached something it trusts; - a verifier holding only the older anchor walks leaf, issuing CA, cross-certificate over the newer root, and arrives at the older anchor. Both runs consist of unbroken name and signature links ending at a trust anchor. Both are valid. They are different lengths, they end in different places, and they exist at the same instant. ## Why hierarchies are transitioned this way The problem an anchor transition has to solve is not technical, it is demographic: **the verifiers you cannot reach.** Anchor lists on shipped devices, in pinned images and inside long-lived installations update on their own schedule, or never. A leaf that reaches only the new anchor is worthless on every one of them. A cross-certificate lets both populations validate the same leaf, with no change required at the leaf and no reissuance anywhere below: | Verifier population | Path it builds | What the operator had to do | |---|---|---| | Holds the newer anchor | short, stops at the new root | nothing | | Holds only the older anchor | longer, through the cross-certificate | nothing | | Holds both | either, depending on its search | nothing | The cost is that this arrangement runs for as long as the old population survives - often years - and during that time the operator is maintaining two truths about the same hierarchy. ## The failure this produces Because a path belongs to the verifier and not to the certificate, verifiers disagree. The characteristic incident looks like this: 1. A leaf and the certificates supplied with it are identical everywhere. 2. Some clients validate, others report a trust failure, and the split does not follow anything obvious. 3. The split actually follows which anchors each verifier holds and how hard it searches after a first failure. The sharpest version arrives when a widely held older root finally reaches the end of its own validity window. A verifier that considers only the supplied ordering, and that enforces the expiry of a certificate representing that old root, now finds an expired certificate on the one path it looked at, and rejects. A verifier that keeps searching finds the shorter path to the newer anchor and accepts. Whether a stored anchor's own validity window is enforced at all varies between implementations, which is exactly why this failure appears unevenly rather than everywhere at once. ## What the two paths do and do not prove Both paths establish the same thing: that the leaf's name and public key were bound by a run of signatures ending at something the verifier chose to trust. Neither is stronger. What differs is *who vouched at the top*, and therefore which verifiers can check it at all. A leaf reachable from two anchors is trusted by the union of the two populations - broader reach, not deeper assurance. A few precise distinctions are worth holding: - a cross-certificate is **not** a reissue of the leaf, and the leaf is unaware of it; - it is **not** a duplicate of the other authority's certificate, because the issuer and the signature differ; - it does **not** merge two hierarchies into one - it adds one edge between them; - and the alternative path it creates is only usable by a verifier that actually looks for it. ## The operational takeaway When you are asked to diagnose "it works here and not there" on identical certificates, cross-signing is one of the first things to consider, and the investigation is about the verifiers rather than the certificate. Ask what anchors each population holds, what candidates each had available, and whether each keeps searching after a rejection. Changing the leaf, which is the instinctive first move, addresses none of those.

  • Why is cross-certification preferred to simply shipping the new anchor and waiting?
    Because the verifiers you cannot reach are the problem. Anchor lists on shipped devices, pinned images and long-lived installations update on their own schedule or never, and a leaf that reaches only the new anchor is invalid on every one of them. A cross-certificate lets both populations validate the same leaf throughout the years it takes the old population to shrink, with no change required at the leaf.
  • What breaks when a widely held older anchor finally reaches the end of its validity window?
    A verifier that considers only the supplied ordering, and that enforces the expiry of a certificate representing that old root, now sees an expired certificate on the one path it examined and rejects. A verifier that keeps searching finds the shorter path to the newer anchor and accepts. Whether a stored anchor's own window is enforced varies between implementations, which is why this failure appears unevenly.
  • Do the two paths prove different things about the leaf?
    No. Each is an independent run of signatures ending at something the verifier chose to trust, and both establish the same binding between the leaf's name and its public key. What differs is who vouched at the top and therefore which verifiers can check it. A leaf reachable from two anchors is trusted by the union of the two populations, not more strongly by either.

saying these in an interview costs you the question

  • Thinks a certificate has exactly one chain that is simply true.
  • Says cross-signing means the end-entity certificate was issued twice.
  • Assumes every verifier walks the same path from the same certificates.
  • Believes an expired root among the supplied certificates is always fatal.
  • Confuses a cross-certificate with a copy of the certificate it covers.