Skip to content

Support public-key-only Secrets in wristband signingKeyRefs for verification #605

Description

@pierDipi

Summary

Allow signingKeyRefs in the wristband response configuration to accept Secrets containing only public keys (for signature verification), not just private keys (for signing). Currently, Authorino rejects public-key-only Secrets with "invalid signing key algorithm".

Problem

In a multi-cluster federation setup, each cluster issues wristband JWTs signed by its own private key. Peer clusters need to verify these tokens but do not need to sign with them. The current signingKeyRefs API requires every referenced Secret to contain a private key — there is no way to add a key for verification only.

This forces operators to distribute private signing keys to every peer cluster, which creates a cascading compromise risk: an attacker who compromises any single cluster gains access to every peer's private signing key and can forge tokens that appear to originate from any cluster in the federation.

Current behavior

response:
  success:
    headers:
      x-wristband-token:
        wristband:
          issuer: "https://..."
          signingKeyRefs:
            - name: local-signing-key    # private key — signs tokens ✓
              algorithm: ES256
            - name: peer-cluster-key     # must also be private key ✗
              algorithm: ES256           # rejected if public-key-only

If peer-cluster-key contains only a public key (e.g., PEM with BEGIN PUBLIC KEY), Authorino rejects it with "invalid signing key algorithm".

Desired behavior

signingKeyRefs:
  - name: local-signing-key        # private key — used for signing
    algorithm: ES256
  - name: peer-cluster-key         # public key only — used for JWKS verification
    algorithm: ES256

The first key (private) signs new tokens. All public keys are published in the JWKS endpoint for verification. The second+ keys only need public keys.

Use case

  • Multi-cluster wristband federation: Clusters issue wristband JWTs for cross-cluster identity portability. Each cluster signs with its own key and verifies tokens from all peers. Currently requires distributing all private keys to all clusters.
  • Key rotation with overlap: During key rotation, the old key (public only, private destroyed) should remain in the JWKS for verification of in-flight tokens while the new key signs.
  • Zero-trust posture: Verification-only peers should never hold signing keys they don't own.

Security impact

With public-key-only support, compromising a peer cluster would only expose:

  • That cluster's own private signing key
  • Other clusters' public keys (non-sensitive)

Without it (current state), compromising any peer exposes all clusters' private keys — a single breach cascades into full federation compromise.

Alternatives considered

  1. Separate JWKS endpoint per peer: Each peer cluster serves its own JWKS at a different URL. The consumer configures multiple jwt authentication entries, one per peer. This works but doesn't scale — adding a peer requires adding a new auth rule on every cluster.
  2. External JWKS aggregator: A sidecar or service that aggregates multiple JWKS endpoints into one. Adds operational complexity.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions