Skip to content

How does establishing subordination work? #186

@tgeoghegan

Description

@tgeoghegan

The draft describes at length how to represent an established subordination relationship: the subordinate lists its superior's identifier in its authority_hints, and the superior serves entity statements for its subordinates from its federation_fetch_endpoint, federation_list_endpoint, etc. However the draft doesn't really explain how two entities would go about establishing such a relationship. I think it's doable with the current text (draft 41), but it requires reading between the lines a bit, and careful interpretation of existing requirements.

Here's my guess at how we would go about getting entity A to subordinate entity B:

  1. B publishes an entity configuration with an empty authority_hints, or no authority_hints at all (see Note 1 below)
  2. Some entity (could be B, could be something else) makes a request to A asking it to subordinate B, providing B's entity identifier (see Note 2 below)
  3. A fetches B's EC from /.well-known/openid-federation, relative to B's identifier
  4. A evaluates some policy to decide whether or not it wants to subordinate B (see Note 3 below)
  5. If yes, A begins acknowledging requests sent to its fetch, list, resolve endpoints pertaining to B (see Note 4 below)
  6. B's EC is updated to include A's identifier in its authority_hints

Note 1: Step (1) would seem to violate the specification's requirements for an EC, but actually authority_hints is only required for "Entities that have at least one Superior above them". An entity that isn't yet subordinate to anything has no Superior, and so despite not being a trust anchor or an EC, it's permitted for it to have no authority_hints. Another option here would be for the EC to speculatively include its desired superior in authority_hints. The draft requires that superiors be listed in authority_hints, but it doesn't forbid listing other entities.

Note 2: OpenID Federation doesn't currently define an endpoint that works for this. I think that either federation_fetch_endpoint or federation_resolve_endpoint could be overloaded for this, though, if the semantic of either was implied to be "give me an ES for the named entity if you already know about it. If you don't know about it, then please subordinate it, and once that's done, give me an ES". I'm not sure that's a great idea, though.

Note 3: IMO this policy is outside the scope of the OpenID Federation draft.

Note 4: The delta of time between this step and the next is interesting. What does it mean if A publishes an ES about B, but B does not yet have A in its authority_hints? Should an RP consider B to be subordinate in this case?

So this is workable, and good enough for the OIDF prototype I'm working on right now. But I think it'd be nice to formalize some of this to make sure it remains workable, and make it more clear how it works. In particular:

a. authority_hints are more than hints. Since RPs will generally be starting from leaf entities and working their way up the trust chain, the whole thing falls apart without these hints. I think the name should be changed to make it more clear that authority_hints is nearly authoritative.
b. Define something like an Entity Configuration but with a distinct type (e.g., entity-subordination-request+jwt) and make it clear its purpose is requesting subordination to reduce the risk of misuse. This would be akin to a PKCS#10 CSR, or a Certificate Transparency precertificate.
c. Add endpoints alongside federation_fetch_endpoint that are explicitly for requesting subordination, and spell out what the requests and responses look like.
d. Clarify what happens when subordination is partially established, i.e. only one side of the relationship has been updated to reflect the subordination.

It's possible that the mechanics of subordination establishment are outside of the scope of this document, in which case I'd be grateful for a pointer to which draft I should be watching.

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions