The pledge
MUST initiate BRSKI after boot if it is unconfigured. The pledge
MUST NOT automatically initiate BRSKI if it has been configured or is in the process of being configured.
BRSKI is described as extensions to EST [
RFC 7030]. The goal of these extensions is to reduce the number of TLS connections and crypto operations required on the pledge. The registrar implements the BRSKI REST interface within the "/.well-known/brski" URI tree and implements the existing EST URIs as described in EST
RFC 7030,
Section 3.2.2. The communication channel between the pledge and the registrar is referred to as "BRSKI-EST" (see
Figure 1).
The communication channel between the registrar and MASA is a new communication channel, similar to EST, within the newly registered "/.well-known/brski" tree. For clarity, this channel is referred to as "BRSKI-MASA" (see
Figure 1).
The MASA URI is "https://" authority "/.well-known/brski".
BRSKI uses existing CMS message formats for existing EST operations. BRSKI uses JSON [
RFC 8259] for all new operations defined here and for voucher formats. In all places where a binary value must be carried in a JSON string, a base64 format (
RFC 4648,
Section 4) is to be used, as per
RFC 7951,
Section 6.6.
While EST (
RFC 7030,
Section 3.2) does not insist upon use of HTTP persistent connections (
RFC 7230,
Section 6.3), BRSKI-EST connections
SHOULD use persistent connections. The intention of this guidance is to ensure the provisional TLS state occurs only once, and that the subsequent resolution of the provision state is not subject to a Man-in-the-Middle (MITM) attack during a critical phase.
If non-persistent connections are used, then both the pledge and the registrar
MUST remember the certificates that have been seen and also sent for the first connection. They
MUST check each subsequent connection for the same certificates, and each end
MUST use the same certificates as well. This places a difficult restriction on rolling certificates on the registrar.
Summarized automation extensions for the BRSKI-EST flow are:
-
The pledge either attempts concurrent connections via each discovered proxy or times out quickly and tries connections in series, as explained at the end of Section 5.1.
-
The pledge provisionally accepts the registrar certificate during the TLS handshake as detailed in Section 5.1.
-
The pledge requests a voucher using the new REST calls described below. This voucher is then validated.
-
The pledge completes authentication of the server certificate as detailed in Section 5.6.1. This moves the BRSKI-EST TLS connection out of the provisional state.
-
Mandatory bootstrap steps conclude with voucher status telemetry (see Section 5.7).
The BRSKI-EST TLS connection can now be used for EST enrollment.
The extensions for a registrar (equivalent to an EST server) are:
-
Client authentication is automated using IDevID as per the EST certificate-based client authentication. The subject field's DN encoding MUST include the "serialNumber" attribute with the device's unique serial number as explained in Section 2.3.1.
-
The registrar requests and validates the voucher from the MASA.
-
The registrar forwards the voucher to the pledge when requested.
-
The registrar performs log verifications (described in Section 5.8.3) in addition to local authorization checks before accepting optional pledge device enrollment requests.
The pledge establishes the TLS connection with the registrar through the Circuit Proxy (see
Section 4), but the TLS handshake is with the registrar. The BRSKI-EST pledge is the TLS client, and the BRSKI-EST registrar is the TLS server. All security associations established are between the pledge and the registrar regardless of proxy operations.
Use of TLS 1.3 (or newer) is encouraged. TLS 1.2 or newer is
REQUIRED on the pledge side. TLS 1.3 (or newer)
SHOULD be available on the registrar server interface, and the registrar client interface, but TLS 1.2
MAY be used. TLS 1.3 (or newer)
SHOULD be available on the MASA server interface, but TLS 1.2
MAY be used.
Establishment of the BRSKI-EST TLS connection is as specified in "Bootstrap Distribution of CA Certificates" (Section
4.1.1) of [
RFC 7030], wherein the client is authenticated with the IDevID certificate, and the EST server (the registrar) is provisionally authenticated with an unverified server certificate. Configuration or distribution of the trust anchor database used for validating the IDevID certificate is out of scope of this specification. Note that the trust anchors in / excluded from the database will affect which manufacturers' devices are acceptable to the registrar as pledges and can also be used to limit the set of MASAs that are trusted for enrollment.
The signature in the certificate
MUST be validated even if a signing key cannot (yet) be validated. The certificate (or chain)
MUST be retained for later validation.
A self-signed certificate for the registrar is acceptable as the voucher can validate it upon successful enrollment.
The pledge performs input validation of all data received until a voucher is verified as specified in
Section 5.6.1 and the TLS connection leaves the provisional state. Until these operations are complete, the pledge could be communicating with an attacker.
The pledge code needs to be written with the assumption that all data is being transmitted at this point to an unauthenticated peer, and that received data, while inside a TLS connection,
MUST be considered untrusted. This particularly applies to HTTP headers and CMS structures that make up the voucher.
A pledge that can connect to multiple registrars concurrently
SHOULD do so. Some devices may be unable to do so for lack of threading, or resource issues. Concurrent connections defeat attempts by a malicious proxy from causing a TCP Slowloris-like attack (see [
slowloris]).
A pledge that cannot maintain as many connections as there are eligible proxies will need to rotate among the various choices, terminating connections that do not appear to be making progress. If no connection is making progress after 5 seconds, then the pledge
SHOULD drop the oldest connection and go on to a different proxy: the proxy that has been communicated with least recently. If there were no other proxies discovered, the pledge
MAY continue to wait, as long as it is concurrently listening for new proxy announcements.
When the pledge bootstraps, it makes a request for a voucher from a registrar.
This is done with an HTTPS POST using the operation path value of "/.well-known/brski/requestvoucher".
The pledge voucher-request Content-Type is as follows.
-
application/voucher-cms+json:
-
[RFC 8366] defines a "YANG-defined JSON document that has been signed using a Cryptographic Message Syntax (CMS) structure", and the voucher-request described in Section 3 is created in the same way. The media type is the same as defined in [RFC 8366]. This is also used for the pledge voucher-request. The pledge MUST sign the request using the credentials in Section 2.3.
Registrar implementations
SHOULD anticipate future media types but, of course, will simply fail the request if those types are not yet known.
The pledge
SHOULD include an "Accept" header field (see
RFC 7231,
Section 5.3.2) indicating the acceptable media type for the voucher response. The "application/voucher-cms+json" media type is defined in [
RFC 8366], but constrained voucher formats are expected in the future. Registrars and MASA are expected to be flexible in what they accept.
The pledge populates the voucher-request fields as follows:
-
created-on:
-
Pledges that have a real-time clock are RECOMMENDED to populate this field with the current date and time in yang:date-and-time format. This provides additional information to the MASA. Pledges that have no real-time clocks MAY omit this field.
-
nonce:
-
The pledge voucher-request MUST contain a cryptographically strong random or pseudo-random number nonce (see RFC 4086, Section 6.2). As the nonce is usually generated very early in the boot sequence, there is a concern that the same nonce might be generated across multiple boots, or after a factory reset. Different nonces MUST be generated for each bootstrapping attempt, whether in series or concurrently. The freshness of this nonce mitigates against the lack of a real-time clock as explained in Section 2.6.1.
-
assertion:
-
The pledge indicates support for the mechanism described in this document, by putting the value "proximity" in the voucher-request, and MUST include the proximity-registrar-cert field (below).
-
proximity-registrar-cert:
-
In a pledge voucher-request, this is the first certificate in the TLS server "certificate_list" sequence (see RFC 8446, Section 4.4.2) presented by the registrar to the pledge. That is, it is the end-entity certificate. This MUST be populated in a pledge voucher-request.
-
serial-number:
-
The serial number of the pledge is included in the voucher-request from the pledge. This value is included as a sanity check only, but it is not to be forwarded by the registrar as described in Section 5.5.
All other fields
MAY be omitted in the pledge voucher-request.
See an example JSON payload of a pledge voucher-request in
Section 3.3, Example 1.
The registrar confirms that the assertion is "proximity" and that pinned proximity-registrar-cert is the registrar's certificate. If this validation fails, then there is an on-path attacker (MITM), and the connection
MUST be closed after the returning of an HTTP 401 error code.
In a fully automated network, all devices must be securely identified and authorized to join the domain.
A registrar accepts or declines a request to join the domain, based on the authenticated identity presented. For different networks, examples of automated acceptance may include the allowance of:
-
any device of a specific type (as determined by the X.509 IDevID),
-
any device from a specific vendor (as determined by the X.509 IDevID),
-
a specific device from a vendor (as determined by the X.509 IDevID) against a domain acceptlist. (The mechanism for checking a shared acceptlist potentially used by multiple registrars is out of scope.)
If validation fails, the registrar
SHOULD respond with the HTTP 404 error code. If the voucher-request is in an unknown format, then an HTTP 406 error code is more appropriate. A situation that could be resolved with administrative action (such as adding a vendor to an acceptlist)
MAY be responded to with a 403 HTTP error code.
If authorization is successful, the registrar obtains a voucher from the MASA service (see
Section 5.5) and returns that MASA-signed voucher to the pledge as described in
Section 5.6.
The BRSKI-MASA TLS connection is a "normal" TLS connection appropriate for HTTPS REST interfaces. The registrar initiates the connection and uses the MASA URL that is obtained as described in
Section 2.8. The mechanisms in [
RFC 6125]
SHOULD be used in authentication of the MASA using a DNS-ID that matches that which is found in the IDevID. Registrars
MAY include a mechanism to override the MASA URL on a manufacturer-by-manufacturer basis, and within that override, it is appropriate to provide alternate anchors. This will typically be used by some vendors to establish explicit (or private) trust anchors for validating their MASA that is part of a sales channel integration.
Use of TLS 1.3 (or newer) is encouraged. TLS 1.2 or newer is
REQUIRED. TLS 1.3 (or newer)
SHOULD be available.
As described in [
RFC 7030], the MASA and the registrars
SHOULD be prepared to support TLS Client Certificate authentication and/or HTTP Basic, Digest, or Salted Challenge Response Authentication Mechanism (SCRAM) authentication. This connection
MAY also have no client authentication at all.
Registrars
SHOULD permit trust anchors to be preconfigured on a per-vendor (MASA) basis. Registrars
SHOULD include the ability to configure a TLS Client Certificate on a per-MASA basis, or to use no Client Certificate. Registrars
SHOULD also permit HTTP Basic and Digest authentication to be configured.
The authentication of the BRSKI-MASA connection does not change the voucher-request process, as voucher-requests are already signed by the registrar. Instead, this authentication provides access control to the audit-log as described in
Section 5.8.
Implementers are advised that contacting the MASA establishes a secured API connection with a web service, and that there are a number of authentication models being explored within the industry. Registrars are
RECOMMENDED to fail gracefully and generate useful administrative notifications or logs in the advent of unexpected HTTP 401 (Unauthorized) responses from the MASA.
Providing per-customer options requires the customer's registrar to be uniquely identified. This can be done by any stateless method that HTTPS supports such as HTTP Basic or Digest authentication (that is using a password), but the use of TLS Client Certificate authentication is
RECOMMENDED.
Stateful methods involving API tokens, or HTTP Cookies, are not recommended.
It is expected that the setup and configuration of per-customer Client Certificates is done as part of a sales ordering process.
The use of public PKI (i.e., WebPKI) end-entity certificates to identify the registrar is reasonable, and if done universally, this would permit a MASA to identify a customer's registrar simply by a Fully Qualified Domain Name (FQDN).
The use of DANE records in DNSSEC-signed zones would also permit use of a FQDN to identify customer registrars.
A third (and simplest, but least flexible) mechanism would be for the MASA to simply store the registrar's certificate pinned in a database.
A MASA without any supply-chain integration can simply accept registrars without any authentication or on a blind TOFU basis as described in
Section 7.4.2.
This document does not make a specific recommendation on how the MASA authenticates the registrar as there are likely different tradeoffs in different environments and product values. Even within the ANIMA ACP applicability, there is a significant difference between supply-chain logistics for $100 CPE devices and $100,000 core routers.
When a registrar receives a pledge voucher-request, it in turn submits a registrar voucher-request to the MASA service via an HTTPS interface [
RFC 7231].
This is done with an HTTP POST using the operation path value of "/.well-known/brski/requestvoucher".
The voucher media type "application/voucher-cms+json" is defined in [
RFC 8366] and is also used for the registrar voucher-request. It is a JSON document that has been signed using a CMS structure. The registrar
MUST sign the registrar voucher-request.
MASA implementations
SHOULD anticipate future media ntypes but, of course, will simply fail the request if those types are not yet known.
The voucher-request CMS object includes some number of certificates that are input to the MASA as it populates the pinned-domain-cert. As [
RFC 8366] is quite flexible in what may be put into the pinned-domain-cert, the MASA needs some signal as to what certificate would be effective to populate the field with: it may range from the end-entity certificate that the registrar uses to the entire private Enterprise CA certificate. More-specific certificates result in a tighter binding of the voucher to the domain, while less-specific certificates result in more flexibility in how the domain is represented by certificates.
A registrar that is seeking a nonceless voucher for later offline use benefits from a less-specific certificate, as it permits the actual key pair used by a future registrar to be determined by the pinned CA.
In some cases, a less-specific certificate, such as a public WebPKI CA, could be too open and could permit any entity issued a certificate by that authority to assume ownership of a device that has a voucher pinned. Future work may provide a solution to pin both a certificate and a name that would reduce such risk of malicious ownership assertions.
The registrar
SHOULD request a voucher with the most specificity consistent with the mode that it is operating in. In order to do this, when the registrar prepares the CMS structure for the signed voucher-request, it
SHOULD include only certificates that are a part of the chain that it wishes the MASA to pin. This
MAY be as small as only the end-entity certificate (with id-kp-cmcRA set) that it uses as its TLS server certificate, or it
MAY be the entire chain, including the domain CA.
The registrar
SHOULD include an "Accept" header field (see
RFC 7231,
Section 5.3.2) indicating the response media types that are acceptable. This list
SHOULD be the entire list presented to the registrar in the pledge's original request (see
Section 5.2), but it
MAY be a subset. The MASA is expected to be flexible in what it accepts.
The registrar populates the voucher-request fields as follows:
-
created-on:
-
The registrar SHOULD populate this field with the current date and time when the voucher-request is formed. This field provides additional information to the MASA.
-
nonce:
-
This value, if present, is copied from the pledge voucher-request. The registrar voucher-request MAY omit the nonce as per Section 3.1.
-
serial-number:
-
The serial number of the pledge the registrar would like a voucher for. The registrar determines this value by parsing the authenticated pledge IDevID certificate; see Section 2.3. The registrar MUST verify that the serial-number field it parsed matches the serial-number field the pledge provided in its voucher-request. This provides a sanity check useful for detecting error conditions and logging. The registrar MUST NOT simply copy the serial-number field from a pledge voucher-request as that field is claimed but not certified.
-
idevid-issuer:
-
The Issuer value from the pledge IDevID certificate is included to ensure unique interpretation of the serial-number. In the case of a nonceless (offline) voucher-request, an appropriate value needs to be configured from the same out-of-band source as the serial-number.
-
prior-signed-voucher-request:
-
The signed pledge voucher-request SHOULD be included in the registrar voucher-request. The entire CMS-signed structure is to be included and base64 encoded for transport in the JSON structure.
A nonceless registrar voucher-request
MAY be submitted to the MASA. Doing so allows the registrar to request a voucher when the pledge is offline, or when the registrar anticipates not being able to connect to the MASA while the pledge is being deployed. Some use cases require the registrar to learn the appropriate IDevID serialNumber field and appropriate "Accept" header field values from the physical device labeling or from the sales channel (which is out of scope for this document).
All other fields
MAY be omitted in the registrar voucher-request.
The proximity-registrar-cert field
MUST NOT be present in the registrar voucher-request.
See example JSON payloads of registrar voucher-requests in
Section 3.3, Examples 2 through 4.
The MASA verifies that the registrar voucher-request is internally consistent but does not necessarily authenticate the registrar certificate since the registrar
MAY be unknown to the MASA in advance. The MASA performs the actions and validation checks described in the following subsections before issuing a voucher.
As described in [
RFC 8366], vouchers are normally short lived to avoid revocation issues. If the request is for a previous (expired) voucher using the same registrar (that is, a registrar with the same domain CA), then the request for a renewed voucher
SHOULD be automatically authorized. The MASA has sufficient information to determine this by examining the request, the registrar authentication, and the existing audit-log. The issuance of a renewed voucher is logged as detailed in
Section 5.6.
To inform the MASA that existing vouchers are not to be renewed, one can update or revoke the registrar credentials used to authorize the request (see Sections [
5.5.4] and [
5.5.3]). More flexible methods will likely involve sales channel integration and authorizations (details are out of scope of this document).
A certificate chain is extracted from the registrar's signed CMS container. This chain may be as short as a single end-entity certificate, up to the entire registrar certificate chain, including the domain CA certificate, as specified in
Section 5.5.
If the domain's CA is unknown to the MASA, then it is considered a temporary trust anchor for the rest of the steps in this section. The intention is not to authenticate the message as having come from a fully validated origin but to establish the consistency of the domain PKI.
The MASA
MAY use the certificate in the chain that is farthest from the end-entity certificate of the registrar, as determined by MASA policy. A MASA
MAY have a local policy in which it only pins the end-entity certificate. This is consistent with [
RFC 8366]. Details of the policy will typically depend upon the degree of supply-chain integration and the mechanism used by the registrar to authenticate. Such a policy would also determine how the MASA will respond to a request for a nonceless voucher.
As described in
Section 5.5.2, the MASA has extracted the registrar's domain CA. This is used to validate the CMS signature [
RFC 5652] on the voucher-request.
Normal PKIX revocation checking is assumed during voucher-request signature validation. This CA certificate
MAY have Certificate Revocation List (CRL) distribution points or Online Certificate Status Protocol (OCSP) information [
RFC 6960]. If they are present, the MASA
MUST be able to reach the relevant servers belonging to the registrar's domain CA to perform the revocation checks.
The use of OCSP Stapling is preferred.
The MASA
MUST verify that the registrar voucher-request is signed by a registrar. This is confirmed by verifying that the id-kp-cmcRA extended key usage extension field (as detailed in EST
RFC 7030,
Section 3.6.1) exists in the certificate of the entity that signed the registrar voucher-request. This verification is only a consistency check to ensure that the unauthenticated domain CA intended the voucher-request signer to be a registrar. Performing this check provides value to the domain PKI by assuring the domain administrator that the MASA service will only respect claims from authorized registration authorities of the domain.
Even when a domain CA is authenticated to the MASA, and there is strong sales channel integration to understand who the legitimate owner is, the above id-kp-cmcRA check prevents arbitrary end-entity certificates (such as an LDevID certificate) from having vouchers issued against them.
Other cases of inappropriate voucher issuance are detected by examination of the audit-log.
If a nonceless voucher-request is submitted, the MASA
MUST authenticate the registrar either as described in EST (see Sections
3.2.3 and
3.3.2 of [
RFC 7030]) or by validating the registrar's certificate used to sign the registrar voucher-request using a configured trust anchor. Any of these methods reduce the risk of DDoS attacks and provide an authenticated identity as an input to sales channel integration and authorizations (details are out of scope of this document).
In the nonced case, validation of the registrar's identity (via TLS Client Certificate or HTTP authentication)
MAY be omitted if the MASA knows that the device policy is to accept audit-only vouchers.
The MASA
MAY verify that the registrar voucher-request includes the prior-signed-voucher-request field. If so, the prior-signed-voucher-request
MUST include a proximity-registrar-cert that is consistent with the certificate used to sign the registrar voucher-request. Additionally, the voucher-request serial-number leaf
MUST match the pledge serial-number that the MASA extracts from the signing certificate of the prior-signed-voucher-request. The consistency check described above entails checking that the proximity-registrar-cert Subject Public Key Info (SPKI) Fingerprint exists within the registrar voucher-request CMS signature's certificate chain. This is substantially the same as the pin validation described in
RFC 7469,
Section 2.6.
If these checks succeed, the MASA updates the voucher and audit-log assertion leafs with the "proximity" assertion, as defined by
RFC 8366,
Section 5.3.
The MASA does not verify the nonce itself. If the registrar voucher-request contains a nonce, and the prior-signed-voucher-request exists, then the MASA
MUST verify that the nonce is consistent. (Recall from above that the voucher-request might not contain a nonce; see Sections [
5.5] and [
5.5.4].)
The MASA populates the audit-log with the nonce that was verified. If a nonceless voucher is issued, then the audit-log is to be populated with the JSON value "null".
The MASA voucher response to the registrar is forwarded without changes to the pledge; therefore, this section applies to both the MASA and the registrar. The HTTP signaling described applies to both the MASA and registrar responses.
When a voucher-request arrives at the registrar, if it has a cached response from the MASA for the corresponding registrar voucher-request, that cached response can be used according to local policy; otherwise, the registrar constructs a new registrar voucher-request and sends it to the MASA.
Registrar evaluation of the voucher itself is purely for transparency and audit purposes to further inform log verification (see
Section 5.8.3); therefore, a registrar could accept future voucher formats that are opaque to the registrar.
If the voucher-request is successful, the server (a MASA responding to a registrar or a registrar responding to a pledge) response
MUST contain an HTTP 200 response code. The server
MUST answer with a suitable 4xx or 5xx HTTP [
RFC 7230] error code when a problem occurs. In this case, the response data from the MASA
MUST be a plain text human-readable (UTF-8) error message containing explanatory information describing why the request was rejected.
The registrar
MAY respond with an HTTP 202 ("the request has been accepted for processing, but the processing has not been completed") as described in EST
RFC 7030,
Section 4.2.3, wherein the client "
MUST wait at least the specified "retry-after" time before repeating the same request" (also see
RFC 7231,
Section 6.6.4). The pledge is
RECOMMENDED to provide local feedback (blinked LED, etc.) during this wait cycle if mechanisms for this are available. To prevent an attacker registrar from significantly delaying bootstrapping, the pledge
MUST limit the Retry-After time to 60 seconds. Ideally, the pledge would keep track of the appropriate Retry-After header field values for any number of outstanding registrars, but this would involve a state table on the pledge. Instead, the pledge
MAY ignore the exact Retry-After value in favor of a single hard-coded value (a registrar that is unable to complete the transaction after the first 60 seconds has another chance a minute later). A pledge
SHOULD be willing to maintain a 202 retry-state for up to 4 days, which is longer than a long weekend, after which time the enrollment attempt fails, and the pledge returns to Discovery state. This allows time for an alert to get from the registrar to a human operator who can make a decision as to whether or not to proceed with the enrollment.
A pledge that retries a request after receiving a 202 message
MUST resend the same voucher-request. It
MUST NOT sign a new voucher-request each time, and in particular, it
MUST NOT change the nonce value.
In order to avoid infinite redirect loops, which a malicious registrar might do in order to keep the pledge from discovering the correct registrar, the pledge
MUST NOT follow more than one redirection (3xx code) to another web origin. EST supports redirection but requires user input; this change allows the pledge to follow a single redirection without a user interaction.
A 403 (Forbidden) response is appropriate if the voucher-request is not signed correctly or is stale or if the pledge has another outstanding voucher that cannot be overridden.
A 404 (Not Found) response is appropriate when the request is for a device that is not known to the MASA.
A 406 (Not Acceptable) response is appropriate if a voucher of the desired type or that uses the desired algorithms (as indicated by the "Accept" header fields and algorithms used in the signature) cannot be issued as such because the MASA knows the pledge cannot process that type. The registrar
SHOULD use this response if it determines the pledge is unacceptable due to inventory control, MASA audit-logs, or any other reason.
A 415 (Unsupported Media Type) response is appropriate for a request that has a voucher-request or "Accept" value that is not understood.
The voucher response format is as indicated in the submitted "Accept" header fields or based on the MASA's prior understanding of proper format for this pledge. Only the "application/voucher-cms+json" media type [
RFC 8366] is defined at this time. The syntactic details of vouchers are described in detail in [
RFC 8366].
Figure 14 shows a sample of the contents of a voucher.
{
"ietf-voucher:voucher": {
"nonce": "62a2e7693d82fcda2624de58fb6722e5",
"assertion": "logged",
"pinned-domain-cert": "base64encodedvalue==",
"serial-number": "JADA123456789"
}
}
The MASA populates the voucher fields as follows:
-
nonce:
-
The nonce from the pledge if available. See Section 5.5.6.
-
assertion:
-
The method used to verify the relationship between the pledge and registrar. See Section 5.5.5.
-
pinned-domain-cert:
-
A certificate; see Section 5.5.2. This figure is illustrative; for an example, see Appendix C.2 where an end-entity certificate is used.
-
serial-number:
-
The serial-number as provided in the voucher-request. Also see Section 5.5.5.
-
domain-cert-revocation-checks:
-
Set as appropriate for the pledge's capabilities and as documented in [RFC 8366]. The MASA MAY set this field to "false" since setting it to "true" would require that revocation information be available to the pledge, and this document does not make normative requirements for [RFC 6961], Section 4.4.2.1 of RFC 8446, or equivalent integrations.
-
expires-on:
-
This is set for nonceless vouchers. The MASA ensures the voucher lifetime is consistent with any revocation or pinned-domain-cert consistency checks the pledge might perform. See Section 2.6.1. There are three times to consider: (a) a configured voucher lifetime in the MASA, (b) the expiry time for the registrar's certificate, and (c) any CRL lifetime. The expires-on field SHOULD be before the earliest of these three values. Typically, (b) will be some significant time in the future, but (c) will typically be short (on the order of a week or less). The RECOMMENDED period for (a) is on the order of 20 minutes, so it will typically determine the life span of the resulting voucher. 20 minutes is sufficient time to reach the post-provisional state in the pledge, at which point there is an established trust relationship between the pledge and registrar. The subsequent operations can take as long as required from that point onwards. The lifetime of the voucher has no impact on the life span of the ownership relationship.
Whenever a voucher is issued, the MASA
MUST update the audit-log sufficiently to generate the response as described in
Section 5.8.1. The internal state requirements to maintain the audit-log are out of scope.
The pledge
MUST verify the voucher signature using the manufacturer-installed trust anchor(s) associated with the manufacturer's MASA (this is likely included in the pledge's firmware). Management of the manufacturer-installed trust anchor(s) is out of scope of this document; this protocol does not update this trust anchor(s).
The pledge
MUST verify that the serial-number field of the signed voucher matches the pledge's own serial-number.
The pledge
MUST verify the nonce information in the voucher. If present, the nonce in the voucher must match the nonce the pledge submitted to the registrar; vouchers with no nonce can also be accepted (according to local policy; see
Section 7.2).
The pledge
MUST be prepared to parse and fail gracefully from a voucher response that does not contain a pinned-domain-cert field. Such a thing indicates a failure to enroll in this domain, and the pledge
MUST attempt joining with other available Join Proxies.
The pledge
MUST be prepared to ignore additional fields that it does not recognize.
Following the process described in [
RFC 8366], the pledge should consider the public key from the pinned-domain-cert as the sole temporary trust anchor.
The pledge then evaluates the TLS server certificate chain that it received when the TLS connection was formed using this trust anchor. It is possible that the public key in the pinned-domain-cert directly matches the public key in the end-entity certificate provided by the TLS server.
If a registrar's credentials cannot be verified using the pinned-domain-cert trust anchor from the voucher, then the TLS connection is discarded, and the pledge abandons attempts to bootstrap with this discovered registrar. The pledge
SHOULD send voucher status telemetry (described below) before closing the TLS connection. The pledge
MUST attempt to enroll using any other proxies it has found. It
SHOULD return to the same proxy again after unsuccessful attempts with other proxies. Attempts should be made at repeated intervals according to the back-off timer described earlier. Attempts
SHOULD be repeated as failure may be the result of a temporary inconsistency (an inconsistently rolled registrar key, or some other misconfiguration). The inconsistency could also be the result of an active MITM attack on the EST connection.
The registrar
MUST use a certificate that chains to the pinned-domain-cert as its TLS server certificate.
The pledge's PKIX path validation of a registrar certificate's validity period information is as described in
Section 2.6.1. Once the PKIX path validation is successful, the TLS connection is no longer provisional.
The pinned-domain-cert
MAY be installed as a trust anchor for future operations such as enrollment (e.g., as recommended per [
RFC 7030]) or trust anchor management or raw protocols that do not need full PKI-based key management. It can be used to authenticate any dynamically discovered EST server that contains the id-kp-cmcRA extended key usage extension as detailed in EST (see
RFC 7030,
Section 3.6.1); but to reduce system complexity, the pledge
SHOULD avoid additional discovery operations. Instead, the pledge
SHOULD communicate directly with the registrar as the EST server. The pinned-domain-cert is not a complete distribution of the CA certificate response, as described in
RFC 7030,
Section 4.1.3, which is an additional justification for the recommendation to proceed with EST key management operations. Once a full CA certificate response is obtained, it is more authoritative for the domain than the limited pinned-domain-cert response.
The domain is expected to provide indications to the system administrators concerning device life-cycle status. To facilitate this, it needs telemetry information concerning the device's status.
The pledge
MUST indicate its pledge status regarding the voucher. It does this by sending a status message to the registrar.
The posted data media type: application/json
The client sends an HTTP POST to the server at the URI ".well-known/brski/voucher_status".
The format and semantics described below are for version 1. A version field is included to permit significant changes to this feedback in the future. A registrar that receives a status message with a version larger than it knows about
SHOULD log the contents and alert a human.
The status field indicates if the voucher was acceptable. Boolean values are acceptable, where "true" indicates the voucher was acceptable.
If the voucher was not acceptable, the Reason string indicates why. In a failure case, this message may be sent to an unauthenticated, potentially malicious registrar; therefore, the Reason string
SHOULD NOT provide information beneficial to an attacker. The operational benefit of this telemetry information is balanced against the operational costs of not recording that a voucher was ignored by a client that the registrar expected was going to continue joining the domain.
The reason-context attribute is an arbitrary JSON object (literal value or hash of values) that provides additional information specific to this pledge. The contents of this field are not subject to standardization.
The version and status fields
MUST be present. The Reason field
SHOULD be present whenever the status field is false. The Reason-Context field is optional. In the case of a SUCCESS, the Reason string
MAY be omitted.
The keys to this JSON object are case sensitive and
MUST be lowercase.
Figure 16 shows an example JSON.
voucherstatus-post = {
"version": uint,
"status": bool,
? "reason": text,
? "reason-context" : { $$arbitrary-map }
}
}
{
"version": 1,
"status":false,
"reason":"Informative human-readable message",
"reason-context": { "additional" : "JSON" }
}
The server
SHOULD respond with an HTTP 200 but
MAY simply fail with an HTTP 404 error. The client ignores any response. The server
SHOULD capture this telemetry information within the server logs.
Additional standard JSON fields in this POST
MAY be added; see
Section 8.5. A server that sees unknown fields should log them, but otherwise ignore them.
After receiving the pledge status telemetry (see
Section 5.7), the registrar
SHOULD request the MASA audit-log from the MASA service.
This is done with an HTTP POST using the operation path value of "/.well-known/brski/requestauditlog".
The registrar
SHOULD HTTP POST the same registrar voucher-request as it did when requesting a voucher (using the same Content-Type). It is posted to the /requestauditlog URI instead. The idevid-issuer and serial-number informs the MASA which log is requested, so the appropriate log can be prepared for the response. Using the same media type and message minimizes cryptographic and message operations, although it results in additional network traffic. The relying MASA implementation
MAY leverage internal state to associate this request with the original, and by now already validated, voucher-request so as to avoid an extra crypto validation.
A registrar
MAY request logs at future times. If the registrar generates a new request, then the MASA is forced to perform the additional cryptographic operations to verify the new request.
A MASA that receives a request for a device that does not exist, or for which the requesting owner was never an owner, returns an HTTP 404 ("Not found") code.
It is reasonable for a registrar, that the MASA does not believe to be the current owner, to request the audit-log. There are probably reasons for this, which are hard to predict in advance. For instance, such a registrar may not be aware that the device has been resold; it may be that the device has been resold inappropriately, and this is how the original owner will learn of the occurrence. It is also possible that the device legitimately spends time in two different networks.
Rather than returning the audit-log as a response to the POST (with a return code 200), the MASA
MAY instead return a 201 ("Created") response ([
RFC 7231], Sections
6.3.2 and
7.1), with the URL to the prepared (and idempotent, therefore cachable) audit response in the "Location" header field.
In order to avoid enumeration of device audit-logs, a MASA that returns URLs
SHOULD take care to make the returned URL unguessable. [
W3C.capability-urls] provides very good additional guidance. For instance, rather than returning URLs containing a database number such as https://example.com/auditlog/1234 or the Extended Unique Identifier (EUI) of the device such https://example.com/auditlog/10-00-00-11-22-33, the MASA
SHOULD return a randomly generated value (a "slug" in web parlance). The value is used to find the relevant database entry.
A MASA that returns a code 200
MAY also include a "Location" header for future reference by the registrar.
A log data file is returned consisting of all log entries associated with the device selected by the IDevID presented in the request. The audit-log may be abridged by removal of old or repeated values as explained below. The returned data is in JSON format [
RFC 8259], and the Content-Type
SHOULD be "application/json".
The following CDDL [
RFC 8610] explains the structure of the JSON format audit-log response:
audit-log-response = {
"version": uint,
"events": [ + event ]
"truncation": {
? "nonced duplicates": uint,
? "nonceless duplicates": uint,
? "arbitrary": uint,
}
}
event = {
"date": text,
"domainID": text,
"nonce": text / null,
"assertion": "verified" / "logged" / "proximity",
? "truncated": uint,
}
An example:
{
"version":"1",
"events":[
{
"date":"2019-05-15T17:25:55.644-04:00",
"domainID":"BduJhdHPpfhQLyponf48JzXSGZ8=",
"nonce":"VOUFT-WwrEv0NuAQEHoV7Q",
"assertion":"proximity",
"truncated":"0"
},
{
"date":"2017-05-15T17:25:55.644-04:00",
"domainID":"BduJhdHPpfhQLyponf48JzXSGZ8=",
"nonce":"f4G6Vi1t8nKo/FieCVgpBg==",
"assertion":"proximity"
}
],
"truncation": {
"nonced duplicates": "0",
"nonceless duplicates": "1",
"arbitrary": "2"
}
}
The domainID is a binary SubjectKeyIdentifier value calculated according to
Section 5.8.2. It is encoded once in base64 in order to be transported in this JSON container.
The date is formatted per [
RFC 3339], which is consistent with typical JavaScript usage of JSON.
The truncation structure
MAY be omitted if all values are zero. Any counter missing from the truncation structure is assumed to be zero.
The nonce is a string, as provided in the voucher-request, and is used in the voucher. If no nonce was placed in the resulting voucher, then a value of null
SHOULD be used in preference to omitting the entry. While the nonce is often created as a base64-encoded random series of bytes, this should not be assumed.
Distribution of a large log is less than ideal. This structure can be optimized as follows: nonced or nonceless entries for the same domainID
MAY be abridged from the log leaving only the single most recent nonced or nonceless entry for that domainID. In the case of truncation, the "event" truncation value
SHOULD contain a count of the number of events for this domainID that were omitted. The log
SHOULD NOT be further reduced, but an operational situation could exist where maintaining the full log is not possible. In such situations, the log
MAY be arbitrarily abridged for length, with the number of removed entries indicated as "arbitrary".
If the truncation count exceeds 1024, then the MASA
MAY use this value without further incrementing it.
A log where duplicate entries for the same domain have been omitted ("nonced duplicates" and/or "nonceless duplicates") could still be acceptable for informed decisions. A log that has had "arbitrary" truncations is less acceptable, but manufacturer transparency is better than hidden truncations.
A registrar that sees a version value greater than 1 indicates an audit-log format that has been enhanced with additional information. No information will be removed in future versions; should an incompatible change be desired in the future, then a new HTTP endpoint will be used.
This document specifies a simple log format as provided by the MASA service to the registrar. This format could be improved by distributed consensus technologies that integrate vouchers with technologies such as block-chain or hash trees or optimized logging approaches. Doing so is out of the scope of this document but is an anticipated improvement for future work. As such, the registrar
SHOULD anticipate new kinds of responses and
SHOULD provide operator controls to indicate how to process unknown responses.
The domainID is a binary value (a BIT STRING) that uniquely identifies a registrar by the pinned-domain-cert.
If the pinned-domain-cert certificate includes the SubjectKeyIdentifier (
RFC 5280,
Section 4.2.1.2), then it is used as the domainID. If not, the SPKI Fingerprint as described in
RFC 7469,
Section 2.4 is used. This value needs to be calculated by both the MASA (to populate the audit-log) and the registrar (to recognize itself in the audit-log).
RFC 5280,
Section 4.2.1.2 does not mandate that the SubjectKeyIdentifier extension be present in non-CA certificates. It is
RECOMMENDED that registrar certificates (even if self-signed) always include the SubjectKeyIdentifier to be used as a domainID.
The domainID is determined from the certificate chain associated with the pinned-domain-cert and is used to update the audit-log.
Each time the MASA issues a voucher, it appends details of the assignment to an internal audit-log for that device. The internal audit-log is processed when responding to requests for details as described in
Section 5.8. The contents of the audit-log can express a variety of trust levels, and this section explains what kind of trust a registrar can derive from the entries.
While the audit-log provides a list of vouchers that were issued by the MASA, the vouchers are issued in response to voucher-requests, and it is the content of the voucher-requests that determines how meaningful the audit-log entries are.
A registrar
SHOULD use the log information to make an informed decision regarding the continued bootstrapping of the pledge. The exact policy is out of scope of this document as it depends on the security requirements within the registrar domain. Equipment that is purchased preowned can be expected to have an extensive history. The following discussion is provided to help explain the value of each log element:
-
date:
-
The date field provides the registrar an opportunity to divide the log around known events such as the purchase date. Depending on the context known to the registrar or administrator, events before/after certain dates can have different levels of importance. For example, for equipment that is expected to be new, and thus has no history, it would be a surprise to find prior entries.
-
domainID:
-
If the log includes an unexpected domainID, then the pledge could have imprinted on an unexpected domain. The registrar can be expected to use a variety of techniques to define "unexpected" ranging from acceptlists of prior domains to anomaly detection (e.g., "this device was previously bound to a different domain than any other device deployed"). Log entries can also be compared against local history logs in search of discrepancies (e.g., "this device was re-deployed some number of times internally, but the external audit-log shows additional re-deployments our internal logs are unaware of").
-
nonce:
-
Nonceless entries mean the logged domainID could theoretically trigger a reset of the pledge and then take over management by using the existing nonceless voucher.
-
assertion:
-
The assertion leaf in the voucher and audit-log indicates why the MASA issued the voucher. A "verified" entry means that the MASA issued the associated voucher as a result of positive verification of ownership. However, this entry does not indicate whether or not the pledge was actually deployed in the prior domain. A "logged" assertion informs the registrar that the prior vouchers were issued with minimal verification. A "proximity" assertion assures the registrar that the pledge was truly communicating with the prior domain and thus provides assurance that the prior domain really has deployed the pledge.
A relatively simple policy is to acceptlist known (internal or external) domainIDs and require all vouchers to have a nonce. An alternative is to require that all nonceless vouchers be from a subset (e.g., only internal) of domainIDs. If the policy is violated, a simple action is to revoke any locally issued credentials for the pledge in question or to refuse to forward the voucher. The registrar
MUST then refuse any EST actions and
SHOULD inform a human via a log. A registrar
MAY be configured to ignore (i.e., override the above policy) the history of the device, but it is
RECOMMENDED that this only be configured if hardware-assisted (i.e., Transport Performance Metrics (TPM) anchored) Network Endpoint Assessment (NEA) [
RFC 5209] is supported.
The pledge
SHOULD follow the BRSKI operations with EST enrollment operations including "CA Certificates Request", "CSR Attributes Request", and "Client Certificate Request" or "Server-Side Key Generation", etc. This is a relatively seamless integration since BRSKI API calls provide an automated alternative to the manual bootstrapping method described in [
RFC 7030]. As noted above, use of HTTP-persistent connections simplifies the pledge state machine.
Although EST allows clients to obtain multiple certificates by sending multiple Certificate Signing Requests (CSRs), BRSKI does not support this mechanism directly. This is because BRSKI pledges
MUST use the CSR Attributes request (
RFC 7030,
Section 4.5). The registrar
MUST validate the CSR against the expected attributes. This implies that client requests will "look the same" and therefore result in a single logical certificate being issued even if the client were to make multiple requests. Registrars
MAY contain more complex logic, but doing so is out of scope of this specification. BRSKI does not signal any enhancement or restriction to this capability.
The pledge
SHOULD request the full EST Distribution of CA certificate messages; see
RFC 7030,
Section 4.1.
This ensures that the pledge has the complete set of current CA certificates beyond the pinned-domain-cert (see
Section 5.6.2 for a discussion of the limitations inherent in having a single certificate instead of a full CA certificate response). Although these limitations are acceptable during initial bootstrapping, they are not appropriate for ongoing PKIX end-entity certificate validation.
Automated bootstrapping occurs without local administrative configuration of the pledge. In some deployments, it is plausible that the pledge generates a certificate request containing only identity information known to the pledge (essentially the X.509 IDevID information) and ultimately receives a certificate containing domain-specific identity information. Conceptually, the CA has complete control over all fields issued in the end-entity certificate. Realistically, this is operationally difficult with the current status of PKI CA deployments, where the CSR is submitted to the CA via a number of non-standard protocols. Even with all standardized protocols used, it could operationally be problematic to expect that service-specific certificate fields can be created by a CA that is likely operated by a group that has no insight into different network services/protocols used. For example, the CA could even be outsourced.
To alleviate these operational difficulties, the pledge
MUST request the EST "CSR Attributes" from the EST server, and the EST server needs to be able to reply with the attributes necessary for use of the certificate in its intended protocols/services. This approach allows for minimal CA integrations, and instead, the local infrastructure (EST server) informs the pledge of the proper fields to include in the generated CSR (such as rfc822Name). This approach is beneficial to automated bootstrapping in the widest number of environments.
In networks using the BRSKI enrolled certificate to authenticate the ACP, the EST CSR Attributes
MUST include the ACP domain information fields defined in
RFC 8994,
Section 6.2.2.
The registrar
MUST also confirm that the resulting CSR is formatted as indicated before forwarding the request to a CA. If the registrar is communicating with the CA using a protocol such as full Certificate Management over CMS (CMC), which provides mechanisms to override the CSR Attributes, then these mechanisms
MAY be used even if the client ignores the guidance for the CSR Attributes.
For automated bootstrapping of devices, the administrative elements that provide bootstrapping also provide indications to the system administrators concerning device life-cycle status. This might include information concerning attempted bootstrapping messages seen by the client. The MASA provides logs and the status of credential enrollment. Since an end user is assumed per [
RFC 7030], a final success indication back to the server is not included. This is insufficient for automated use cases.
The client
MUST send an indicator to the registrar about its enrollment status. It does this by using an HTTP POST of a JSON dictionary with the attributes described below to the new EST endpoint at "/.well-known/brski/enrollstatus".
When indicating a successful enrollment, the client
SHOULD first re-establish the EST TLS session using the newly obtained credentials. TLS 1.3 supports doing this in-band, but TLS 1.2 does not. The client
SHOULD therefore always close the existing TLS connection and start a new one, using the same Join Proxy.
In the case of a failed enrollment, the client
MUST send the telemetry information over the same TLS connection that was used for the enrollment attempt, with a Reason string indicating why the most recent enrollment failed. (For failed attempts, the TLS connection is the most reliable way to correlate server-side information with what the client provides.)
The version and status fields
MUST be present. The Reason field
SHOULD be present whenever the status field is false. In the case of a SUCCESS, the Reason string
MAY be omitted.
The reason-context attribute is an arbitrary JSON object (literal value or hash of values) that provides additional information specific to the failure to unroll from this pledge. The contents of this field are not subject to standardization. This is represented by the group-socket "$$arbitrary-map" in the CDDL.
enrollstatus-post = {
"version": uint,
"status": bool,
? "reason": text,
? "reason-context" : { $$arbitrary-map }
}
}
An example status report can be seen below. It is sent with the media type: application/json
{
"version": 1,
"status":true,
"reason":"Informative human readable message",
"reason-context": { "additional" : "JSON" }
}
The server
SHOULD respond with an HTTP 200 but
MAY simply fail with an HTTP 404 error.
Within the server logs, the server
MUST capture if this message was received over a TLS session with a matching Client Certificate.
Pledges that require multiple certificates could establish direct EST connections to the registrar.
This document describes extensions to EST for the purpose of bootstrapping remote key infrastructures. Bootstrapping is relevant for CoAP enrollment discussions as well. The definition of EST and BRSKI over CoAP is not discussed within this document beyond ensuring proxy support for CoAP operations. Instead, it is anticipated that a definition of CoAP mappings will occur in subsequent documents such as [
ACE-COAP-EST] and that CoAP mappings for BRSKI will be discussed either there or in future work.