BRSKI: zero-touch device onboarding (RFC 8995)¶
BRSKI — Bootstrapping Remote Secure Key Infrastructure — lets a factory-fresh device join an operator's domain with no per-device configuration. The device ships with a manufacturer birth certificate (an IEEE 802.1AR IDevID) and a pre-installed trust anchor for the manufacturer's signing service. On first power- up it discovers the domain registrar, proves its identity, obtains a signed voucher that tells it which domain now owns it, and then enrolls its operational certificate (an LDevID) over EST — all automatically.
secsy-pki implements the registrar (the Join Registrar/Coordinator, JRC) on top of the existing EST enrollment and the hardware-attestation trust anchors. The LDevID is issued through the shared HSM-backed CA, so the domain signing key never leaves its token.
BRSKI is disabled by default. It requires
est.enabled, since the operational certificate is issued over EST. See thebrski:block inconfig.yaml.
1. The actors¶
| Actor | Who runs it | Role |
|---|---|---|
| Pledge | the new device | Holds an IDevID + MASA trust anchor; drives the flow. |
| Registrar | secsy-pki | Validates the IDevID, relays to the MASA, returns the voucher, hands off to EST. |
| MASA | the manufacturer | Signs the voucher that authorizes the pledge→domain binding. |
| Domain CA | secsy-pki (HSM) | Signs the LDevID via the EST handoff. |
The MASA is pluggable: point the registrar at an external manufacturer MASA
over HTTPS (brski.masa.url), or run the minimal built-in MASA
(brski.masa.builtin) for single-vendor / lab deployments where secsy-pki holds
the manufacturer signing key too.
2. The flow¶
Pledge Registrar (secsy-pki) MASA
│ provisional TLS ───────────►│ │
│ (pins server cert) │ │
│ │ │
│ POST requestvoucher ────────►│ 1. verify pledge-request signature│
│ (signed by IDevID, │ recover & TRUST the IDevID │
│ pins proximity cert) │ (chain to manufacturer roots) │
│ │ 2. check proximity + serial │
│ │ 3. sign registrar-request ───────►│ verify pledge & registrar
│ │ │ requests, pin domain cert,
│ │◄──────────── signed voucher ───────│ sign voucher
│◄──────── voucher ─────────────│ 4. authorize pledge for EST │
│ verify MASA sig, nonce, │ │
│ pin domain cert │ │
│ │ │
│ POST voucher_status ────────►│ (telemetry) │
│ │ │
│ EST simpleenroll ───────────►│ authorize by IDevID (TLS client │
│ (IDevID as TLS client cert) │ cert) → issue LDevID on the HSM │
│◄──────── LDevID ──────────────│ │
│ POST enrollstatus ──────────►│ (telemetry) │
Registrar validation is fail-closed. A voucher is issued only when:
- The IDevID is authentic — its certificate chains to a configured trusted
manufacturer root. These are the same anchors the
attestation gate uses; the registrar reuses them and any
additional
brski.trust_anchor_filesyou supply. - Proximity holds — the
proximity-registrar-certthe pledge pinned from its provisional TLS connection equals this registrar's domain certificate (require_proximity, on by default). This is the defense against a pledge being steered to an attacker's registrar. - The serial numbers agree — the pledge's asserted
serial-numbermatches its IDevID, and the MASA re-checks this against the embedded pledge request.
The voucher (RFC 8366) is a small JSON document wrapped in a CMS SignedData
(application/voucher-cms+json), built and verified through the shared
internal/cms layer. Its pinned-domain-cert is the registrar
certificate the pledge connected to, so the pledge can complete its provisional
TLS connection into a fully trusted one.
The EST handoff¶
After the voucher exchange the registrar records the pledge as authorized to
enroll (keyed by the IDevID public key, bounded by pledge_ttl_minutes). The
pledge then calls EST simpleenroll over the same connection, presenting its
IDevID as the TLS client certificate. The EST server recognizes the authorized
pledge, and the operational LDevID is signed on the HSM. The pledge generates a
fresh LDevID key for this CSR — the IDevID authorizes the session, the LDevID is
the new operational identity.
3. Configuration¶
est:
enabled: true # BRSKI hands off to EST — required
ca_label: "Secsy Issuing CA"
profile: client
# Trusted manufacturer roots for the pledge IDevID (reused by BRSKI).
attestation:
trusted_root_files:
- /etc/secsy/manufacturer-roots.pem
brski:
enabled: true
# base_path: /.well-known/brski # default
ca_label: "Secsy Issuing CA" # domain CA for the LDevID (defaults to the EST CA)
profile: client # issuance profile a pledge enrolls under
registrar_key_label: brski-registrar # HSM key that signs registrar voucher-requests
registrar_cert_file: /etc/secsy/brski/registrar.pem
# domain_cert_file: /etc/secsy/tls/server.pem # cert the pledge pins; defaults to the registrar cert
# trust_anchor_files: # extra IDevID roots on top of attestation's
# - /etc/secsy/brski/vendor-b-roots.pem
require_proximity: true
pledge_ttl_minutes: 10
masa:
builtin: true # minimal in-process MASA, OR set masa.url
key_label: brski-masa # HSM key that signs vouchers
cert_file: /etc/secsy/brski/masa.pem # MASA cert the pledge trusts
# voucher_validity_hours: 24 # bounds nonceless vouchers
Per-profile enable. When any issuance profile sets brski.enabled: true, the
registrar refuses to onboard under a profile that does not — the per-profile
enable gate. When no profile sets it, the registrar's configured profile is
implicitly allowed.
Registrar vs domain certificate. The pledge pins the certificate that
terminates its provisional TLS connection. Set domain_cert_file to that TLS
server certificate when it differs from the registrar's voucher-request signing
certificate; otherwise the single registrar identity is used for both.
External MASA. For a real manufacturer MASA, set masa.url (its
/requestvoucher lives under that base) instead of masa.builtin. Pin the MASA's
server trust anchor at the transport layer in production.
4. Endpoints¶
The registrar mounts three endpoints under base_path (RFC 8995 §5):
| Method | Path | Body | Purpose |
|---|---|---|---|
| POST | /.well-known/brski/requestvoucher |
application/voucher-cms+json |
Submit the pledge voucher-request, receive the signed voucher |
| POST | /.well-known/brski/voucher_status |
application/json |
Pledge voucher-processing telemetry |
| POST | /.well-known/brski/enrollstatus |
application/json |
Pledge enrollment telemetry |
When the built-in MASA is exposed as a standalone service it additionally serves
POST <base>/requestvoucher for the registrar voucher-request.
5. Auditing & metrics¶
Every registrar action appends to the hash-chained
audit log under action cert.brski, actor
brski-pledge:<serial>:
| Result | Meaning |
|---|---|
success |
Voucher issued and the pledge authorized to enroll; or a telemetry report with status:true. |
denied |
Fail-closed policy refusal: untrusted IDevID, failed proximity, or serial mismatch. |
error |
Malformed request, or the MASA declined to issue a voucher. |
Prometheus metrics:
| Metric | Labels | Meaning |
|---|---|---|
secsy_brski_voucher_requests_total |
result |
Registrar /requestvoucher outcomes (success/denied/error). |
secsy_brski_vouchers_issued_total |
result |
Vouchers minted by the built-in MASA. |
secsy_brski_status_reports_total |
kind, status |
Pledge voucher_status/enrollstatus telemetry. |
secsy_brski_enroll_authorized_total |
result |
EST-handoff authorization checks. |
The /requestvoucher endpoint is metered and gated behind the
rate-limit + HSM concurrency guard like the other signing
endpoints (it signs a registrar voucher-request on the HSM).
6. Security notes¶
- The manufacturer trust anchor is the root of authenticity. Only IDevIDs
chaining to a configured manufacturer root are onboarded; treat
attestation.trusted_root_files/brski.trust_anchor_filesas a deliberate, audited trust decision. - Keep
require_proximityon. Without it a pledge could be relayed to a registrar it never connected to. With it, the pledge-pinned cert must be this registrar's identity. - HSM-backed issuance. The LDevID is signed on the HSM through EST; the domain CA key never leaves its token. The registrar and (built-in) MASA signing keys are also provider-backed and sign through the bounded session pool.
- Nonceful by default. Live vouchers echo the pledge nonce and cannot be
replayed. The built-in MASA falls back to a short-lived
expires-onvoucher only when a pledge presents no nonce (e.g. a device with no real-time clock). - Bounded enrollment window. A bootstrapped pledge is authorized to EST-enroll
only for
pledge_ttl_minutes; enrollment must follow bootstrapping promptly. - Serve over TLS. BRSKI is a TLS protocol; the pledge presents its IDevID as the TLS client certificate for the EST handoff, and pins the registrar's TLS server certificate as the domain anchor.