Skip to content

RFC 9345 Delegated Credentials support #309

Description

@gosunuts

Goal

Add optional support for RFC 9345 – TLS Delegated Credentials on top of Portal's existing Keyless TLS architecture.

Today, the tunnel terminates tenant TLS but calls the relay's /v1/sign during full TLS handshakes.

With RFC 9345, the relay can periodically delegate TLS authentication to a short-lived key generated by the tunnel:

Relay
  └─ long-term certificate key
        ↓ signs periodically
Delegated Credential
        ↓
Tunnel
  └─ short-lived private key
        ↓
local TLS handshakes

This removes /v1/sign from the handshake hot path for compatible clients while keeping the long-term certificate private key on the relay.

Compatibility

Use Delegated Credentials when the client advertises RFC 9345 support. Otherwise, fall back to the existing Keyless TLS path.

RFC 9345 client → Delegated Credential → local signing
Other clients   → Keyless TLS          → /v1/sign

Current constraints

  • The relay certificate must contain the RFC 9345 DelegationUsage extension.
  • Ordinary wildcard certificates without this extension cannot be used for delegation.
  • CA support for DelegationUsage is currently limited.
  • Browser support is currently limited, so Keyless TLS must remain as a compatibility fallback.
  • Prefer a native Go implementation rather than introducing BoringSSL/CGO into the production binary.

Direction

Keep the existing relay-owned wildcard certificate and long-term private key.

Add a credential-level operation such as:

POST /v1/delegate

The tunnel generates an ephemeral key, receives a short-lived Delegated Credential from the relay, and renews it before expiration.

RFC 9345 should initially be experimental and capability-gated, with the existing Keyless TLS path used as fallback.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions