skip to content

Should your relying party request attestation at passkey registration, and what does verifying it buy?

level: principalimportance: nice to knowfreq 34%

answer

  1. model evidence, not user evidence
  2. none is the honest default
  3. trust anchors need an owner
  4. the client may zero the aaguid
  5. no model policy, no reason to ask

basics

~20 s

Attestation is evidence about the authenticator's model, not about the person. It is worth requesting only where a model policy exists and someone owns the trust anchors; otherwise none is the honest default, and the client may then zero the aaguid entirely.

solid answer

~40 s

A verified attestation statement tells you which model of authenticator generated the key pair and that it did so genuinely - the `aaguid` plus a signature chaining to that model's trust anchor. It tells you nothing about who is holding the device. The cost is a verification path for each attestation statement format, a trust store of authenticator metadata that has to be kept current, and privacy considerations, which is why many authenticators share one attestation certificate across a large batch of units. Unless you actually have a policy that restricts which authenticators may be registered, and an owner for the trust store, you are maintaining a verification path that feeds no decision. Request `none`, and accept that the client may replace the statement so the `aaguid` reads all zeros.

go deeper

for a junior

Know what attestation is about: evidence concerning the authenticator's model, produced once at registration. It is not user verification and it says nothing about who is holding the device.

for a middle

Explain the conveyance choices and what each returns, and why none is the common default. Be able to say that the client may replace the statement so the model identifier reads all zeros.

for a senior

Talk about the operational cost honestly: a verification path per statement format, a trust store that degrades if nobody maintains it, and registrations that start failing for reasons a user cannot act on.

for a principal

Anchor the decision on whether a written policy restricting authenticator models exists and who owns it. Without one the whole chain feeds no decision, and the middle position - collect it, never verify it - is the only choice that is wrong on its own terms.

## What attestation is At registration the authenticator can return, alongside the new public key, a signed statement about itself: this key was generated inside a device of this model, under these protections. That statement lives in the `attestationObject`, and the model is named by the `aaguid` in the attested credential data. What you ask for is set by the attestation conveyance preference in the creation options, and the choice is genuinely a judgment call rather than a security ratchet. | conveyance | what you receive | what you then owe | |---|---|---| | `none` | no statement worth verifying; the client may replace it and zero the `aaguid` | nothing | | `indirect` | a statement the client may have anonymised on the way through | a verification path, with weaker model certainty | | `direct` | the authenticator's own statement, as produced | per-format verification and a maintained trust store | | `enterprise` | a statement that may carry a unit-level identifier, where the platform permits it | all of the above, plus a policy for handling an identifier that follows a device | ## What a verified statement proves - **The model.** This key came from a device of the kind the `aaguid` names. - **That the key was generated there.** Not imported, not fabricated by software claiming to be that model. - **Nothing about the human.** Attestation is not user verification and not identity proofing. The person holding the authenticator is exactly as unknown as they were before. - **Nothing that persists.** A credential does not become revocable by you because you learned its model. ## What it costs 1. **A verification path per attestation statement format.** Each format has its own signature layout, its own certificate handling, and its own set of trust anchors. All of them must stay correct, because a verification path that fails open is worse than none - it produces a policy decision on evidence nobody checked. 2. **A trust store you have to maintain.** Authenticator metadata moves: new models appear, certificates roll over, some units get flagged. A trust store that was accurate at launch and never touched since silently degrades into a list that rejects new hardware and accepts revoked hardware. 3. **Privacy considerations.** An attestation certificate unique to one unit would make a device trackable across every site that asks, which is why authenticators commonly share one certificate across a large batch and why clients are permitted to anonymise the statement. 4. **A registration path that can now fail for reasons the skipper cannot fix.** A perfectly good roaming key from an unlisted model is turned away by a policy nobody remembers writing. ## The question that decides it **Do you have a decision that changes based on the model?** If the answer is no, the entire chain above is machinery feeding nothing, and the honest default is `none`. The answer is yes in a narrow set of cases: a regulated requirement that credentials sit on certified hardware; a managed fleet where the organisation issues the authenticators and wants to refuse anything else; an insurance or audit obligation that names the device class. All three share a shape - **someone outside engineering has written down which authenticators are acceptable**, and that document is what the trust store implements. For a quota reporting service whose skippers register whatever they own - the wheelhouse tablet's built-in authenticator, a roaming key in a dry bag, a phone in a waterproof pouch - there is no such document, and inventing one would reduce enrolment for no measurable gain. ## The trap in deferring the decision It is tempting to request `direct`, store the statement, and decide later. Two things spoil it. Storing an unverified statement and verifying it later means every existing registration was accepted on evidence nobody checked, so the policy you eventually write applies to nothing you already hold. And if you requested `none` the model evidence is not merely unverified, it is gone - the client may have replaced the statement and zeroed the `aaguid`, so the registration cannot be re-examined at all. The defensible positions are therefore the two ends: request `none` and accept that a model policy is permanently off the table for the credentials you already have, or request and verify properly from the first registration because you already know the policy exists. The middle - request it, store it, never verify it - gets you the cost of both and the benefit of neither.

  • You requested attestation, stored it, and never verified it. What have you got?
    A blob and a false sense of optionality. Verifying later does not retroactively validate the registrations you already accepted - every one of them was admitted on unchecked evidence - so the policy you eventually write applies only to credentials registered after it. You have paid the storage and the appearance of diligence without buying a decision.
  • Does attestation give you any handle on a lost authenticator?
    No. Attestation is a statement made once, at registration, about the model of a device. It gives you no way to reach that device, disable it, or learn anything about it afterwards. What actually removes a lost authenticator's access is deleting its credential record, which works exactly the same whether you asked for attestation or not.

saying these in an interview costs you the question

  • Says attestation proves who the person at the authenticator is
  • Requests attestation and stores it without ever verifying it
  • Assumes an aaguid is always present and meaningful
  • Believes attestation makes a credential revocable by the relying party
  • Treats attestation as free when it needs trust anchors and per-format verification
  • Adds a model policy without anyone owning the metadata behind it