summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9431.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc9431.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc9431.txt')
-rw-r--r--doc/rfc/rfc9431.txt1824
1 files changed, 1824 insertions, 0 deletions
diff --git a/doc/rfc/rfc9431.txt b/doc/rfc/rfc9431.txt
new file mode 100644
index 0000000..ef0912c
--- /dev/null
+++ b/doc/rfc/rfc9431.txt
@@ -0,0 +1,1824 @@
+
+
+
+
+Internet Engineering Task Force (IETF) C. Sengul
+Request for Comments: 9431 Brunel University
+Category: Standards Track A. Kirby
+ISSN: 2070-1721 Oxbotica
+ July 2023
+
+
+Message Queuing Telemetry Transport (MQTT) and Transport Layer Security
+ (TLS) Profile of Authentication and Authorization for Constrained
+ Environments (ACE) Framework
+
+Abstract
+
+ This document specifies a profile for the Authentication and
+ Authorization for Constrained Environments (ACE) framework to enable
+ authorization in a publish-subscribe messaging system based on
+ Message Queuing Telemetry Transport (MQTT). Proof-of-Possession
+ keys, bound to OAuth 2.0 access tokens, are used to authenticate and
+ authorize MQTT Clients. The protocol relies on TLS for
+ confidentiality and MQTT server (Broker) authentication.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9431.
+
+Copyright Notice
+
+ Copyright (c) 2023 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Revised BSD License text as described in Section 4.e of the
+ Trust Legal Provisions and are provided without warranty as described
+ in the Revised BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Requirements Language
+ 1.2. ACE-Related Terminology
+ 1.3. MQTT-Related Terminology
+ 2. Authorizing Connection Requests
+ 2.1. Client Token Request to the Authorization Server (AS)
+ 2.2. Client Connection Request to the Broker (C)
+ 2.2.1. Overview of Client-RS Authentication Methods over TLS
+ and MQTT
+ 2.2.2. authz-info: The Authorization Information Topic
+ 2.2.3. Client Authentication over TLS
+ 2.2.3.1. Raw Public Key Mode
+ 2.2.3.2. Pre-Shared Key Mode
+ 2.2.4. Client Authentication over MQTT
+ 2.2.4.1. Transporting the Access Token inside the MQTT
+ CONNECT
+ 2.2.4.2. Authentication Using the AUTH Property
+ 2.2.5. Broker Token Validation
+ 2.3. Token Scope and Authorization
+ 2.4. Broker Response to Client Connection Request
+ 2.4.1. Unauthorized Request and the Optional Authorization
+ Server Discovery
+ 2.4.2. Authorization Success
+ 3. Authorizing PUBLISH and SUBSCRIBE Packets
+ 3.1. PUBLISH Packets from the Publisher Client to the Broker
+ 3.2. PUBLISH Packets from the Broker to the Subscriber Clients
+ 3.3. Authorizing SUBSCRIBE Packets
+ 4. Token Expiration, Update, and Reauthentication
+ 5. Handling Disconnections and Retained Messages
+ 6. Reduced Protocol Interactions for MQTT v3.1.1
+ 6.1. Token Transport
+ 6.2. Handling Authorization Errors
+ 7. IANA Considerations
+ 7.1. TLS Exporter Labels Registration
+ 7.2. Media Type Registration
+ 7.3. ACE OAuth Profile Registration
+ 7.4. AIF
+ 8. Security Considerations
+ 9. Privacy Considerations
+ 10. References
+ 10.1. Normative References
+ 10.2. Informative References
+ Appendix A. Checklist for Profile Requirements
+ Acknowledgments
+ Authors' Addresses
+
+1. Introduction
+
+ This document specifies a profile for the ACE framework [RFC9200].
+ In this profile, Clients and Servers (Brokers) use MQTT to exchange
+ Application Messages. The protocol relies on TLS for communication
+ security between entities. The MQTT protocol interactions are
+ described based on the MQTT v5.0 OASIS Standard
+ [MQTT-OASIS-Standard-v5]. Since it is expected that MQTT deployments
+ will continue to support MQTT v3.1.1 Clients, this document also
+ describes a reduced set of protocol interactions for the MQTT v3.1.1
+ OASIS Standard [MQTT-OASIS-Standard-v3.1.1]. However, MQTT v5.0 is
+ the RECOMMENDED version, as it works more naturally with ACE-style
+ authentication and authorization.
+
+ MQTT is a publish-subscribe protocol, and after connecting to the
+ MQTT Server (Broker), a Client can publish and subscribe to multiple
+ topics. The Broker, which acts as the Resource Server (RS), is
+ responsible for distributing messages published by the publishers to
+ their subscribers. In the rest of the document, the terms "RS",
+ "MQTT Server", and "Broker" are used interchangeably.
+
+ Messages are published under a Topic Name, and subscribers subscribe
+ to the Topic Names to receive the corresponding messages. The Broker
+ uses the Topic Name in a published message to determine which
+ subscribers to relay the messages to. In this document, topics (more
+ specifically, Topic Names) are treated as resources. The Clients are
+ assumed to have identified the publish/subscribe topics of interest
+ out of band (topic discovery is not a feature of the MQTT protocol).
+ A Resource Owner can preconfigure policies at the Authorization
+ Server (AS) that give Clients publish or subscribe permissions to
+ different topics.
+
+ Clients prove their permission to publish and subscribe to topics
+ hosted on an MQTT Broker using an access token that is bound to a
+ Proof-of-Possession (PoP) key. This document describes how to
+ authorize the following exchanges between the Clients and the Broker.
+
+ * connection requests from the Clients to the Broker
+
+ * publish requests from the Clients to the Broker and from the
+ Broker to the Clients
+
+ * subscribe requests from the Clients to the Broker
+
+ Clients use the MQTT PUBLISH packet to publish to a topic. The
+ mechanisms specified in this document do not protect the Payload of
+ the PUBLISH packet from the Broker. Hence, the Payload is not signed
+ or encrypted specifically for the subscribers. This functionality
+ may be implemented using the proposal outlined in the ACE Pub-Sub
+ Profile [ACE-PUBSUB-PROFILE].
+
+ To provide communication confidentiality and Broker authentication to
+ the MQTT Clients, TLS is used, and TLS 1.3 [RFC8446] is RECOMMENDED.
+ This document makes the same assumptions as Section 4 of the ACE
+ framework [RFC9200] regarding Client and RS registration with the AS
+ for setting up the keying material. While the Client-Broker
+ exchanges are only over MQTT, the required Client-AS and RS-AS
+ interactions are described for HTTPS-based communication [RFC9110],
+ using the "application/ace+json" content type and, unless otherwise
+ specified, JSON encoding. The token MAY be an opaque reference to
+ authorization information or a JSON Web Token (JWT) [RFC7519]. For
+ JWTs, this document follows [RFC7800] for PoP semantics for JWTs, and
+ the mechanisms for providing and verifying PoP are detailed in
+ Section 2.2. The Client-AS and RS-AS exchanges MAY also use
+ protocols other than HTTP, e.g., Constrained Application Protocol
+ (CoAP) [RFC7252] or MQTT. It is recommended that TLS is used to
+ secure these communication channels between Client-AS and RS-AS. To
+ reduce the protocol memory and bandwidth requirements,
+ implementations MAY also use the "application/ace+cbor" content type,
+ Concise Binary Object Representation (CBOR) encoding [RFC8949], CBOR
+ Web Tokens (CWTs) [RFC8392], and associated PoP semantics. For more
+ information, see "Proof-of-Possession Key Semantics for CBOR Web
+ Tokens (CWTs)" [RFC8747]. A JWT uses JSON Object Signing and
+ Encryption (JOSE), while a CWT uses CBOR Object Signing and
+ Encryption (COSE) [RFC9052] for security protection.
+
+1.1. Requirements Language
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+1.2. ACE-Related Terminology
+
+ Certain security-related terms, such as "authentication",
+ "authorization", "data confidentiality", "(data) integrity", "message
+ authentication code" (MAC), and "verify", are taken from [RFC4949].
+
+ The terminology for entities in the architecture is defined in OAuth
+ 2.0 [RFC6749], such as "Client" (C), "Resource Server" (RS), and
+ "Authorization Server" (AS).
+
+ The term "resource" is used to refer to an MQTT Topic Name, which is
+ defined in Section 1.3. Hence, the "Resource Owner" is any entity
+ that can authoritatively speak for the topic. This document also
+ defines a Client Authorization Server for Clients that are not able
+ to support HTTP.
+
+ Client Authorization Server (CAS)
+ An entity that prepares and endorses authentication and
+ authorization data for a Client and communicates to the AS
+ using HTTPS.
+
+1.3. MQTT-Related Terminology
+
+ The document describes message exchanges as MQTT protocol
+ interactions. The Clients are MQTT Clients, which connect to the
+ Broker to publish and subscribe to Application Messages (which are
+ labeled with their topics). For additional information, please refer
+ to the MQTT v5.0 OASIS Standard [MQTT-OASIS-Standard-v5] or MQTT
+ v3.1.1 OASIS Standard [MQTT-OASIS-Standard-v3.1.1].
+
+ Broker
+ The Server in MQTT. It acts as an intermediary between the
+ Clients that publish Application Messages and the Clients
+ that made Subscriptions. The Broker acts as the Resource
+ Server for the Clients.
+
+ Client
+ A device or program that uses MQTT.
+
+ Network Connection
+ A construct provided by the underlying transport protocol
+ that is being used by MQTT. It connects the Client to the
+ Server. It provides the means to send an ordered, lossless
+ stream of bytes in both directions. This document uses TLS
+ as the transport protocol.
+
+ Session
+ A stateful interaction between a Client and a Broker. Some
+ Sessions last only as long as the Network Connection; others
+ can span multiple Network Connections.
+
+ Application Message
+ The data carried by the MQTT protocol. The data has an
+ associated Quality-of-Service (QoS) level and Topic Name.
+
+ MQTT Control Packet
+ The MQTT protocol operates by exchanging a series of MQTT
+ Control Packets. Each packet is composed of a Fixed Header,
+ a Variable Header (depending on the Control Packet type), and
+ a Payload.
+
+ UTF-8-encoded string
+ A string prefixed with a two-byte-length field that gives the
+ number of bytes in a UTF-8-encoded string itself. Unless
+ stated otherwise, all UTF-8-encoded strings can have any
+ length in the range 0 to 65535 bytes.
+
+ Binary Data
+ Binary Data is represented by a two-byte-length field, which
+ indicates the number of data bytes, followed by that number
+ of bytes. Thus, the length of Binary Data is limited to the
+ range of 0 to 65535 bytes.
+
+ Variable Byte Integer
+ A Variable Byte Integer is encoded using an encoding scheme
+ that uses a single byte for values up to 127. For larger
+ values, the least significant seven bits of each byte encode
+ the data, and the most significant bit is used to indicate
+ whether there are bytes following in the representation.
+ Thus, each byte encodes 128 values and a "continuation bit".
+ The maximum number of bytes in the Variable Byte Integer
+ field is four.
+
+ QoS level
+ The level of assurance for the delivery of an Application
+ Message. The QoS level can be 0-2, where 0 indicates "At
+ most once delivery", 1 indicates "At least once delivery",
+ and 2 indicates "Exactly once delivery".
+
+ Property
+ The last field of the Variable Header is a set of properties
+ for several MQTT Control Packets (e.g., CONNECT and CONNACK).
+ A property consists of an Identifier that defines its usage
+ and data type, followed by a value. The Identifier is
+ encoded as a Variable Byte Integer. For example, the
+ "Authentication Data" property uses the identifier 22.
+
+ Topic Name
+ The label attached to an Application Message, which is
+ matched to a Subscription.
+
+ Subscription
+ A Subscription comprises a Topic Filter and a maximum QoS. A
+ Subscription is associated with a single Session.
+
+ Topic Filter
+ An expression that indicates interest in one or more Topic
+ Names. Topic Filters may include wildcards.
+
+ MQTT sends various Control Packets across a Network Connection. The
+ following is not an exhaustive list, and the Control Packets that are
+ not relevant for authorization are not explained. For instance,
+ these include the PUBREL and PUBCOMP packets used in the 4-step
+ handshake required for QoS level 2.
+
+ CONNECT
+ The Client requests to connect to the Broker. This is the
+ first packet sent by a Client.
+
+ CONNACK
+ The Broker connection acknowledgment. CONNACK packets
+ contain return codes that indicate either a success or an
+ error state in response to a Client's CONNECT packet.
+
+ AUTH
+ An AUTH Control Packet is sent from the Client to the Broker
+ or from the Broker to the Client as part of an extended
+ authentication exchange. AUTH properties include the
+ Authentication Method and Authentication Data. The
+ Authentication Method is set in the CONNECT packet, and
+ consequent AUTH packets follow the same Authentication
+ Method. The contents of the Authentication Data are defined
+ by the Authentication Method.
+
+ PUBLISH
+ Publish request sent from a publishing Client to the Broker
+ or from the Broker to a subscribing Client.
+
+ PUBACK
+ Response to a PUBLISH request with QoS level 1. PUBACK can
+ be sent from the Broker to a Client or from a Client to the
+ Broker.
+
+ PUBREC
+ Response to a PUBLISH request with QoS level 2. PUBREC can
+ be sent from the Broker to a Client or from a Client to the
+ Broker.
+
+ SUBSCRIBE
+ Subscribe request sent from a Client.
+
+ SUBACK
+ Subscribe acknowledgment from the Broker to the Client.
+
+ PINGREQ
+ A ping request sent from a Client to the Broker. It signals
+ to the Broker that the Client is alive and is used to confirm
+ that the Broker is also alive. The "Keep Alive" period is
+ set in the CONNECT packet.
+
+ PINGRESP
+ Response sent by the Broker to the Client in response to
+ PINGREQ. It indicates the Broker is alive.
+
+ DISCONNECT
+ The DISCONNECT packet is the final MQTT Control Packet sent
+ from the Client or the Broker. It indicates the reason why
+ the Network Connection is being closed. If the Network
+ Connection is closed without the Client first sending a
+ DISCONNECT packet with reason code 0x00 (Normal
+ disconnection) and the MQTT Connection has a Will Message,
+ the Will Message is published.
+
+ Will
+ If the Network Connection is not closed normally, the Broker
+ sends a last Will Message for the Client if the Client
+ provided one in its CONNECT packet. Situations in which the
+ Will Message is published include, but are not limited to,
+ the following:
+
+ * an I/O error or network failure detected by the Broker,
+
+ * the Client fails to communicate within the Keep Alive
+ period,
+
+ * the Client closes the Network Connection without first
+ sending a DISCONNECT packet with reason code 0x00 (Normal
+ disconnection), and
+
+ * the Broker closes the Network Connection without first
+ receiving a DISCONNECT packet with reason code 0x00
+ (Normal disconnection).
+
+ If the Will Flag is set in the CONNECT flags, then the
+ Payload of the CONNECT packet includes information about the
+ Will. The information consists of the Will Properties, Will
+ Topic, and Will Payload fields.
+
+2. Authorizing Connection Requests
+
+ This section specifies how Client connections are authorized by the
+ AS and verified by the MQTT Broker. Figure 1 shows the basic
+ protocol flows during connection setup. The token request and
+ response use the token endpoint at the AS, specified for HTTP-based
+ interactions in Section 5.8 of the ACE framework [RFC9200]. Steps
+ (D) and (E) are optional and use the introspection endpoint specified
+ in Section 5.9 of the ACE framework [RFC9200]. The discussion in
+ this document assumes that the Client and the Broker use HTTPS to
+ communicate with the AS via these endpoints. The Client and the
+ Broker use MQTT to communicate between them. The C-AS and Broker-AS
+ communications MAY be implemented using protocols other than HTTPS,
+ e.g., CoAP or MQTT. Whatever protocol is used for the C-AS and
+ Broker-AS communications MUST provide mutual authentication,
+ confidentiality protection, and integrity protection.
+
+ If the Client is resource constrained or does not support HTTPS, a
+ separate Client Authorization Server may carry out the token request
+ on behalf of the Client (Figure 1, steps (A) and (B)) and, later,
+ onboard the Client with the token. The interactions between a Client
+ and its Client Authorization Server for token onboarding and support
+ for MQTT-based token requests at the AS are out of the scope of this
+ document.
+
+ +---------------------+
+ | Client |
+ | |
+ +---(A) Token request------| Client - |
+ | | Authorization |
+ | +-(B) Access token-----> Server Interface |
+ | | | (HTTPS) |
+ | | |_____________________|
+ | | | |
+ +--v-------------+ | Pub/Sub Interface |
+ | Authorization | | (MQTT over TLS) |
+ | Server | +----------------^----+
+ |________________| | |
+ | ^ (C) Connection (F) Connection
+ | | request + response
+ | | access token |
+ | | | |
+ | | +---v--------------+
+ | | | Broker |
+ | | | (MQTT over TLS) |
+ | | |__________________|
+ | +(D) Introspection-----| |
+ | request (optional)| RS-AS interface |
+ | | (HTTPS) |
+ +-(E) Introspection-------->|__________________|
+ response (optional)
+
+ Figure 1: Connection Setup
+
+2.1. Client Token Request to the Authorization Server (AS)
+
+ The first step in the protocol flow (Figure 1, step (A)) is the token
+ acquisition by the Client from the AS. The Client and the AS MUST
+ perform mutual authentication. The Client requests an access token
+ from the AS, as described in Section 5.8.1 of the ACE framework
+ [RFC9200]. The document follows the procedures defined in
+ Section 3.2.1 of the DTLS profile [RFC9202] for raw public keys
+ (RPKs) [RFC7250]) and in Section 3.3.1 of [RFC7250] for pre-shared
+ keys (PSKs). However, the content type of the request is set to
+ "application/ace+json", and the AS uses JSON in the Payload of its
+ responses to the Client and the RS. As explained earlier,
+ implementations MAY also use the "application/ace+cbor" content type.
+
+ On receipt of the token request, the AS verifies the request. If the
+ AS successfully verifies the access token request and authorizes the
+ Client for the indicated audience (i.e., RS) and scopes (i.e.,
+ publish/subscribe permissions over topics, as described in
+ Section 2.3), the AS issues an access token (Figure 1, step (B)).
+
+ The response includes the parameters described in Section 5.8.2 of
+ the ACE framework [RFC9200]. For RPKs, the parameters are as
+ described in Section 3.2.1 of the DTLS profile [RFC9202]. For PSKs,
+ the document follows Section 3.3.1 of the DTLS profile [RFC9202]. In
+ both cases, if the response contains an "ace_profile" parameter, this
+ parameter is set to "mqtt_tls". The returned token is a Proof-of-
+ Possession (PoP) token by default.
+
+ This document follows [RFC7800] for PoP semantics for JWTs (CWTs MAY
+ also be used). The AS includes a "cnf" (confirmation) parameter in
+ the PoP token to declare that the Client possesses a particular key
+ and the RS can cryptographically confirm that the Client has
+ possession of that key, as described in [RFC9201].
+
+ Note that the contents of the web tokens (including the "cnf"
+ parameter) are to be consumed by the RS and not the Client (the
+ Client obtains the key information in a different manner). The RPK
+ case is handled as described in Section 3.2.1 of the DTLS profile
+ [RFC9202]. For the PSK case, the referenced procedures apply, with
+ the following exceptions to accommodate JWT and JOSE use. In this
+ case, the AS adds a "cnf" parameter to the Access Information
+ carrying a JSON Web Key (JWK) [RFC7517] object that contains either
+ the symmetric key itself or a key identifier that can be used by the
+ RS to determine the secret key it shares with the Client. The JWT is
+ created as explained in Section 7 of [RFC7519], and the JWT MUST
+ include a JSON Web Encryption (JWE) [RFC7516]. If a CWT/COSE is
+ used, this information MUST be inside the "COSE_Key" object and MUST
+ be encrypted using a "COSE_Encrypt0" structure.
+
+ The AS returns error responses for JSON-based interactions following
+ Section 5.2 of [RFC6749]. When CBOR is used, the interactions MUST
+ implement the procedure described in Section 5.8.3 of the ACE
+ framework [RFC9200].
+
+2.2. Client Connection Request to the Broker (C)
+
+2.2.1. Overview of Client-RS Authentication Methods over TLS and MQTT
+
+ Unless the Client publishes and subscribes to only public topics, the
+ Client and the Broker MUST perform mutual authentication. The Client
+ MUST authenticate to the Broker either over MQTT or TLS before
+ performing any other action. For MQTT, the options are "None" and
+ "ace". For TLS, the options are "Anon" for an anonymous client, and
+ "Known(RPK/PSK)" for RPKs and PSKs, respectively. The "None" and
+ "Anon" options do not provide client authentication but can be used
+ either during authentication or in combination with authentication at
+ the other layer. When the Client uses TLS:Anon,MQTT:None, the Client
+ can only publish or subscribe to public topics. Thus, the client
+ authentication procedures involve the following possible
+ combinations:
+
+ TLS:Anon,MQTT:None:
+ This option is used only for the topics that do not require
+ authorization, including the "authz-info" topic. Publishing
+ to the "authz-info" topic is described in Section 2.2.2.
+
+ TLS:Anon,MQTT:ace:
+ The token is transported inside the CONNECT packet and MUST
+ be validated using one of the methods described in
+ Section 2.2.2. This option also supports a tokenless
+ connection request for AS discovery. As per the ACE
+ framework [RFC9200], a separate step is needed to determine
+ whether the discovered AS URI is authorized to act as an AS.
+
+ TLS:Known(RPK/PSK),MQTT:none:
+ This specification supports client authentication with TLS
+ with RPKs and PSKs, following the procedures described in the
+ DTLS profile [RFC9202]. For the RPK, the Client MUST have
+ published the token to the "authz-info" topic. For the PSK,
+ the token MAY be published to the "authz-info" topic or MAY
+ be, alternatively, provided as a "PSK identity" (e.g., an
+ "identity" in the "identities" field in the Client's
+ "pre_shared_key" extension in TLS 1.3).
+
+ TLS:Known(RPK/PSK),MQTT:ace:
+ This option SHOULD NOT be chosen as the token transported in
+ the CONNECT packet and overwrites any permissions passed
+ during the TLS authentication.
+
+ It is RECOMMENDED that the Client implements TLS:Anon,MQTT:ace as the
+ first choice when working with protected topics. However, MQTT
+ v3.1.1 Clients that do not prefer to overload the User Name and
+ Password fields for ACE (as described in Section 6) MAY implement
+ TLS:Known(RPK/PSK),MQTT:none and, consequently, TLS:Anon,MQTT:None to
+ submit their token to "authz-info".
+
+ The Broker MUST support TLS:Anon,MQTT:ace. To support Clients with
+ different capabilities, the Broker MAY provide multiple client
+ authentication options, e.g., support TLS:Known(RPK),MQTT:none and
+ TLS:Anon,MQTT:None, to enable RPK-based client authentication.
+
+ The Client MUST authenticate the Broker during the TLS handshake. If
+ the Client authentication uses TLS:Known(RPK/PSK), then the Broker is
+ authenticated using the respective method. Otherwise, to
+ authenticate the Broker, the Client MUST validate a public key from
+ an X.509 certificate or an RPK from the Broker against the "rs_cnf"
+ parameter in the token response, which contains information about the
+ public key used by the RS to authenticate if the token type is "pop"
+ and asymmetric keys are used as defined in [RFC9201]. The AS MAY
+ include the thumbprint of the RS's X.509 certificate in the "rs_cnf"
+ (thumbprint, as defined in [RFC9360]). In this case, the Client MUST
+ validate the RS certificate against this thumbprint.
+
+2.2.2. authz-info: The Authorization Information Topic
+
+ In the cases when the Client must transport the token to the Broker
+ first, the Client connects to the Broker to publish its token to the
+ "authz-info" topic. The "authz-info" topic MUST only be published
+ (i.e., the Clients are not allowed to subscribe to it). "authz-info"
+ is not protected, and hence, the Client uses the TLS:Anon,MQTT:None
+ option over a TLS connection. After publishing the token, the Client
+ disconnects from the Broker and is expected to reconnect using client
+ authentication over TLS (i.e., TLS:Known(RPK/PSK),MQTT:none).
+
+ The Broker stores and indexes all tokens received to the "authz-info"
+ topic in its key store (similar to the DTLS profile for ACE
+ [RFC9202]). This profile follows the recommendation of
+ Section 5.10.1 of the ACE framework [RFC9200] and expects that the
+ Broker stores only one token per PoP key, and any other token linked
+ to the same key overwrites an existing token.
+
+ The Broker MUST verify the validity of the token (i.e., through local
+ validation or introspection if the token is a reference), as
+ described in Section 2.2.5. If the token is not valid, the Broker
+ MUST discard the token.
+
+ Depending on the QoS level of the PUBLISH packet, the Broker returns
+ the error response as a PUBACK, PUBREC, or DISCONNECT packet. If the
+ QoS level is equal to 0, and the token is not valid, or if the claims
+ cannot be obtained in the case of an introspected token, the Broker
+ MUST send a DISCONNECT packet with reason code 0x87 (Not authorized).
+ If the PUBLISH Payload does not parse to a token, the Broker MUST
+ send a DISCONNECT with reason code 0x99 (Payload format invalid).
+
+ If the QoS level of the PUBLISH packet is greater than or equal to 1,
+ and the token is not valid, or the claims cannot be obtained in the
+ case of an introspected token, the Broker MUST send reason code 0x87
+ (Not authorized) in the PUBACK or PUBREC. If the PUBLISH Payload
+ does not parse to a token, the PUBACK/PUBREC reason code is 0x99
+ (Payload format invalid).
+
+ When the Broker sends the "Not authorized" response, it must be noted
+ that this corresponds to the token being not valid and not that the
+ actual PUBLISH packet was not authorized. Given that the "authz-
+ info" is a public topic, this response is not expected to cause
+ confusion.
+
+2.2.3. Client Authentication over TLS
+
+ This document supports TLS with raw public keys (RPKs) [RFC7250] and
+ with pre-shared keys (PSKs). The TLS session setup follows the DTLS
+ profile for ACE [RFC9202], as the profile applies to TLS equally well
+ [RFC9430]. When there are exceptions to the DTLS profile, these are
+ explicitly stated in the document. If TLS 1.2 is used, [RFC7925]
+ describes how TLS can be used for constrained devices, alongside
+ recommended cipher suites. Additionally, TLS 1.2 implementations
+ MUST use the "Extended Main Secret" extension (terminology adopted
+ from [TLS-bis]) to incorporate the handshake transcript into the main
+ secret [RFC7627]. TLS implementations SHOULD use the Server Name
+ Indication (SNI) [RFC6066] and Application-Layer Protocol Negotiation
+ (ALPN) [RFC7301] extensions so the TLS handshake authenticates as
+ much of the protocol context as possible.
+
+2.2.3.1. Raw Public Key Mode
+
+ This document follows the procedures defined in Section 3.2.2 of the
+ DTLS profile for ACE [RFC9202] with the following exceptions. The
+ Client MUST upload the access token to the Broker using the method
+ specified in Section 2.2.2 before initiating the handshake.
+
+2.2.3.2. Pre-Shared Key Mode
+
+ This document follows the procedures defined in Section 3.3.2 of the
+ DTLS profile for ACE [RFC9202] with the following exceptions.
+
+ To use TLS 1.3 with pre-shared keys, the Client utilizes the PSK
+ extension specified in [RFC8446] using the key conveyed in the "cnf"
+ parameter of the AS response. The same key is bound to the access
+ token in the "cnf" claim. The Client can upload the token, as
+ specified in Section 2.2.2, before initiating the handshake. When
+ using a previously uploaded token, the Client MUST indicate during
+ the handshake which previously uploaded access token it intends to
+ use. To do so, it MUST create a "COSE_Key" or "JWK" structure with
+ the "kid" that was conveyed in the "rs_cnf" claim in the token
+ response from the AS and the key type "symmetric". This structure is
+ then included as the only element in the "cnf" structure and the
+ encoded value of that "cnf" structure used as a PSK identity in TLS.
+ As an alternative to the access token upload, the Client can provide
+ the most recent access token, JWT or CWT, as a PSK identity.
+
+ In contrast to the DTLS profile for ACE [RFC9202], a Client MAY omit
+ support for the cipher suites TLS_PSK_WITH_AES_128_CCM_8 and
+ TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8. For TLS 1.2, however, a client
+ MUST support TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 for PSKs [RFC8442]
+ and TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for RPKs [RFC8422], as
+ recommended in [RFC9325] (and adjusted to be a PSK cipher suite as
+ appropriate).
+
+2.2.4. Client Authentication over MQTT
+
+2.2.4.1. Transporting the Access Token inside the MQTT CONNECT
+
+ This section describes how the Client transports the token to the
+ Broker inside the CONNECT packet. If this method is used, the Client
+ TLS connection is expected to be anonymous, and the Broker is
+ authenticated during the TLS connection setup. The approach
+ described in this section is similar to an earlier proposal by
+ Fremantle, et al. [Fremantle14].
+
+ After sending the CONNECT packet, the Client MUST wait to receive the
+ CONNACK packet from the Broker. The only packets it is allowed to
+ send are DISCONNECT or AUTH that are in response to the Broker AUTH.
+ Similarly, except for a DISCONNECT and AUTH response from the Client,
+ the Broker MUST NOT process any packets before sending a CONNACK
+ packet.
+
+ Figure 2 shows the structure of the MQTT CONNECT packet used in MQTT
+ v5.0. A CONNECT packet is composed of a Fixed Header, a Variable
+ Header, and a Payload The Fixed Header contains the Control Packet
+ Type (CPT), Reserved, and Remaining Length fields. The Remaining
+ Length is a Variable Byte Integer that represents the number of bytes
+ remaining within the current Control Packet, including data in the
+ Variable Header and the Payload. The Variable Header contains the
+ Protocol Name, Protocol Level, Connect flags, Keep Alive, and
+ Properties fields. The Connect flags in the Variable Header specify
+ the properties of the MQTT Session. It also indicates the presence
+ or absence of some fields in the Payload. The Payload contains one
+ or more encoded fields, namely a unique Client Identifier for the
+ Client, a Will Topic, Will Payload, User Name, and Password. All but
+ the Client Identifier can be omitted depending on the flags in the
+ Variable Header. The Client Identifier identifies the Client to the
+ Broker and, therefore, is unique for each Client. It must be noted
+ that the Client Identifier is an unauthenticated identifier used
+ within the MQTT protocol and so is not bound to the access token.
+
+
+ 0 8 16
+ +---------------------------+
+ |Protocol name length = 4 |
+ +---------------------------+
+ | 'M' 'Q' |
+ +---------------------------+
+ | 'T' 'T' |
+ +---------------------------+
+ |Proto.level=5|Connect flags|
+ +---------------------------+
+ | Keep alive |
+ +---------------------------+
+ | CONNECT Properties Length |
+ | (up to 4 bytes) |
+ +---------------------------+
+ | ( ..Other properties..) |
+ +---------------------------+
+ | Authentication Method |
+ | (0x15) | Len |
+ | Len | 'a' |
+ | 'c' | 'e' |
+ +---------------------------+
+ | Authentication Data |
+ | (0x16) | Len |
+ | Len | token |
+ | or token + PoP data |
+ +---------------------------+
+
+ Figure 2: MQTT v5 CONNECT Variable Header with Authentication
+ Method Property for ACE
+
+ The CONNECT flags are User Name, Password, Will Retain, Will QoS,
+ Will Flag, Clean Start, and Reserved. Table 1 shows how the flags
+ MUST be set to use AUTH packets for authentication and authorization,
+ i.e., the User Name Flag and Password Flag MUST be set to 0. An MQTT
+ v5.0 Broker MAY also support token transport using the User Name and
+ Password to provide a security option for MQTT v3.1.1 Clients, as
+ described in Section 6.
+
+ +===========+==========+========+======+======+=======+==========+
+ | User Name | Password | Will | Will | Will | Clean | Reserved |
+ | Flag | Flag | Retain | QoS | Flag | Start | |
+ +===========+==========+========+======+======+=======+==========+
+ | 0 | 0 | X | X X | X | X | 0 |
+ +-----------+----------+--------+------+------+-------+----------+
+
+ Table 1: CONNECT Flags for AUTH
+
+ The Will Flag indicates that a Will Message needs to be sent. The
+ Client MAY set the Will Flag as desired (marked as "X" in Table 1).
+ If the Will Flag is set to 1, the Broker MUST check that the token
+ allows the publication of the Will Message (i.e., the Will Topic
+ Filter is in the scope array). The check is performed against the
+ token scope described in Section 2.3. If the Will authorization
+ fails, the connection is refused, as described in Section 2.4.1. If
+ the Broker accepts the connection request, the Broker stores the Will
+ Message and publishes it when the Network Connection is closed
+ according to Will QoS, Will Retain parameters, and MQTT Will
+ management rules. To avoid publishing the Will Messages in the case
+ of temporary network disconnections, the Client specifies a Will
+ Delay Interval in the Will Properties. Section 5 explains how the
+ Broker deals with the retained messages in further detail.
+
+ In MQTT v5.0, the Client signals a new Session (i.e., that the
+ Session does not continue an existing Session) by setting the Clean
+ Start flag to 1 in the CONNECT packet. In this profile, the Client
+ SHOULD always start with a new Session. The Broker MAY also signal
+ that it does not support the continuation of an existing Session by
+ setting the Session Expiry Interval to 0 in the CONNACK. If the
+ Broker starts a new Session, the Broker MUST set the Session Present
+ flag to 0 in the CONNACK packet to signal this to the Client.
+
+ The Broker MAY support continuing an existing Session, e.g., if the
+ Broker requires it for QoS reasons. In this case, if a CONNECT
+ packet is received with Clean Start set to 0, and there is a Session
+ associated with the Client Identifier, the Broker MUST resume
+ communications with the Client based on the state from the existing
+ Session. In its response, the Broker MUST set the Session Present
+ flag to 1 in the CONNACK packet to signal the continuation of an
+ existing Session to the Client. The Session State stored by the
+ Client and the Broker is described in Section 5.
+
+ When reconnecting to a Broker that supports continuing existing
+ Sessions, the Client MUST still provide a token in addition to using
+ the same Client Identifier and setting the Clean Start to 0. The
+ Broker MUST still perform PoP validation on the provided token. If
+ the token matches the stored state, the Broker MAY skip introspecting
+ a token-by-reference and use the stored introspection result. The
+ Broker MUST also verify the Client is authorized to receive or send
+ MQTT packets that are pending transmission. When a Client connects
+ with a long Session Expiry Interval, the Broker may need to maintain
+ the Client's MQTT Session State after it disconnects for an extended
+ period. Brokers SHOULD implement administrative policies to limit
+ misuse.
+
+ Note that, according to the MQTT standard, the Broker uses the Client
+ Identifier to identify the Session State. In the case of a Client
+ Identifier collision, a Client may take over another Client's
+ Session. Given that the Broker MUST associate the Client with a
+ valid token, a Client will only send or receive messages to its
+ authorized topics. Therefore, while this issue is not expected to
+ affect security, it may affect QoS (i.e., PUBLISH or QoS messages
+ saved for Client A may be delivered to a Client B). In addition, if
+ this Client Identifier represents a Client already connected to the
+ Broker, the Broker sends a DISCONNECT packet to the existing Client
+ with reason code 0x8E (Session taken over) and closes the connection
+ to the Client.
+
+2.2.4.2. Authentication Using the AUTH Property
+
+ Figure 2 shows the Authentication Method and Authentication Data
+ fields when the client authenticates using the AUTH property. The
+ Client MUST set the Authentication Method as a property of a CONNECT
+ packet by using the property identifier 21 (0x15). This is followed
+ by a UTF-8-encoded string containing the name of the Authentication
+ Method, which MUST be set to "ace". If the Broker does not support
+ this profile, it sends a CONNACK packet with reason code 0x8C (Bad
+ authentication method).
+
+ The Authentication Method is followed by the Authentication Data,
+ which has a property identifier 22 (0x16) and is Binary Data. Based
+ on the Authentication Data, the Broker MUST support both options
+ below:
+
+ * proof of possession using a challenge from the TLS session
+
+ * proof of possession via a Broker-generated challenge/response
+
+2.2.4.2.1. Proof of Possession Using a Challenge from the TLS Session
+
+ +-----------------------------------------------------------------+
+ |Authentication|Token Length|Token |MAC or Signature |
+ |Data Length | | |(over TLS exporter content) |
+ +-----------------------------------------------------------------+
+
+ Figure 3: Authentication Data for PoP Based on TLS Exporter Content
+
+ For this option, the Authentication Data inside the Client's CONNECT
+ packet MUST contain the two-byte integer token length, the token, and
+ the keyed message digest (MAC) or the Client signature (as shown in
+ Figure 3). The Proof-of-Possession key in the token is used to
+ calculate the keyed message digest (MAC) or the Client signature
+ based on the content obtained from the TLS exporter ([RFC5705] for
+ TLS 1.2 and Section 7.5 of [RFC8446] for TLS 1.3). This content is
+ exported from the TLS session using the exporter label "EXPORTER-ACE-
+ MQTT-Sign-Challenge", an empty context, and a length of 32 bytes.
+ The token is also validated, as described in Section 2.2.5, and the
+ Broker responds with a CONNACK packet with the appropriate response
+ code. The Client cannot reauthenticate using this method during the
+ same TLS session (see Section 4).
+
+2.2.4.2.2. Proof of Possession via Broker-generated Challenge/Response
+
+ +------------------------------------+
+ |Authentication|Token Length|Token |
+ |Data Length | | |
+ +------------------------------------+
+
+ Figure 4: Authentication Data to Initiate PoP Based on Challenge/
+ Response
+
+ +--------------------------+
+ |Authentication|RS Nonce |
+ |Data Length |(8 bytes) |
+ +--------------------------+
+
+ Figure 5: Authentication Data for Broker Challenge
+
+ For this option, the Broker follows a Broker-generated challenge/
+ response protocol. If the Authentication Data inside the Client's
+ CONNECT contains only the two-byte integer token length and the token
+ (as shown in Figure 4), the Broker MUST respond with an AUTH packet
+ with the authenticated reason code set to 0x18 (Continue
+ Authentication). The Broker also uses this method if the
+ Authentication Data does not contain a token, but the Broker has a
+ token stored for the connecting Client.
+
+ The Broker continues authentication using an AUTH packet that
+ contains the Authentication Method and the Authentication Data. The
+ Authentication Method MUST be set to "ace", and the Authentication
+ Data MUST NOT be empty and MUST contain an 8-byte RS nonce as a
+ challenge for the Client (Figure 5).
+
+ +---------------------------------------------------------+
+ |Authentication|Client Nonce |MAC or Signature |
+ |Data Length |(8 bytes) |(over RS nonce+Client nonce)|
+ +---------------------------------------------------------+
+
+ Figure 6: Authentication Data for the Client Challenge Response
+
+ The Client responds to this with an AUTH packet with reason code 0x18
+ (Continue Authentication). Similarly, the Client packet sets the
+ Authentication Method to "ace". The Authentication Data in the
+ Client's response is formatted as shown in Figure 6 and includes the
+ 8-byte Client nonce and the signature or MAC computed over the RS
+ nonce concatenated with the Client nonce using PoP key in the token.
+
+ Next, the token is validated as described in Section 2.2.5. The
+ success case is illustrated in Figure 7. The Client MAY also
+ reauthenticate using this challenge-response flow, as described in
+ Section 4.
+
+ Client Broker
+ | |
+ |<===========>| TLS connection setup
+ | |
+ | |
+ +------------>| CONNECT with Authentication Data
+ | | contains only token
+ | |
+ <-------------+ AUTH 0x18 (Cont. Authentication)
+ | | 8-byte RS nonce as challenge
+ | |
+ |------------>| AUTH 0x18 (Cont. Authentication)
+ | | 8-byte Client nonce + signature/MAC
+ | |
+ | |---+ Token validation
+ | | | (may involve introspection)
+ | |<--+
+ | |
+ |<------------+ CONNACK 0x00 (Success)
+
+ Figure 7: PoP Challenge/Response Flow - Success
+
+2.2.5. Broker Token Validation
+
+ The Broker MUST verify the validity of the token either locally
+ (e.g., in the case of a self-contained token) or MAY send a request
+ to the introspection endpoint of the AS (as described for HTTP-based
+ interactions in Section 5.9 of the ACE framework [RFC9200]). The
+ Broker MUST verify the claims in the access token according to the
+ rules set in Section 5.10.1.1 of the ACE framework [RFC9200].
+
+ To authenticate the Client, the Broker validates the signature or the
+ MAC, depending on how the PoP protocol is implemented. For self-
+ contained tokens, the Broker MUST process the security protection of
+ the token first, as specified by the respective token format, i.e., a
+ CWT uses COSE, while a JWT uses JOSE. For a token-by-reference, the
+ Broker uses the "cnf" structure returned as a result of token
+ introspection, as specified in [RFC7519]. HMAC-SHA-256 (HS256)
+ [RFC6234] and Ed25519 [RFC8032] are mandatory to implement for the
+ Broker. The Client MUST implement at least one of them depending on
+ the choice of symmetric or asymmetric validation. Validation of the
+ signature or MAC MUST fail if the signature algorithm is set to
+ "none" when the key used for the signature algorithm cannot be
+ determined or the computed and received signature/MAC do not match.
+
+ The Broker MUST check if the access token is still valid, if it is
+ the intended destination (i.e., the audience) of the token, and if
+ the token was issued by an authorized Authorization Server. If the
+ Client is using TLS RPK mode to authenticate to the Broker, the AS
+ constructs the access token so that the Broker can associate the
+ access token with the Client's public key. The "cnf" claim MUST
+ contain either the Client's RPK or, if the key is already known by
+ the Broker (e.g., from previous communication), a reference to it.
+
+2.3. Token Scope and Authorization
+
+ The scope field contains the publish and subscribe permissions for
+ the Client. Therefore, the token or its introspection result MUST be
+ cached to allow a Client's future PUBLISH and SUBSCRIBE messages.
+ During the CONNECT, if the Will Flag is set to 1, the Broker MUST
+ also authorize the publication of the Will Topic and Will Message
+ using the token's scope field. The Broker uses the scope to match
+ against the Topic Name in a PUBLISH packet (including Will Topic in
+ the CONNECT) or a Topic Filter in a SUBSCRIBE packet.
+
+ The scope in the token is a single value. For a JWT, the single
+ scope is a base64url-encoded string with any padding characters
+ removed, which has an internal structure of a JSON array. For a CWT,
+ this information is represented in CBOR. The internal structure
+ follows the Authorization Information Format (AIF) for ACE [RFC9237].
+ Using the Concise Data Definition Language (CDDL) [RFC8610], the
+ specific data model for MQTT is:
+
+ AIF-MQTT = AIF-Generic<mqtt-topic-filter, mqtt-permissions>
+ AIF-Generic<Toid, Tperm> = [* [Toid, Tperm]]
+ mqtt-topic-filter = tstr ; as per Section 4.7 of MQTT v5.0
+ mqtt-permissions = [+permission]
+ permission = "pub"/"sub"
+
+ Figure 8: AIF-MQTT Data Model
+
+ Topic Filters are implemented according to Section 4.7 of the MQTT
+ v5.0 OASIS Standard [MQTT-OASIS-Standard-v5]. By default, Wildcard
+ Subscriptions are supported, and so, the Topic Filter may include
+ special wildcard characters. The multi-level wildcard, "#", matches
+ any number of levels within a topic, and the single-level wildcard,
+ "+", matches one topic level. The Broker MAY signal in the CONNACK
+ explicitly whether Wildcard Subscriptions are supported by returning
+ a CONNACK property "Wildcard Subscription Available". A value of 0
+ means that Wildcard Subscriptions are not supported. A value of 1
+ means Wildcard Subscriptions are supported.
+
+ Following this model, an example scope may contain:
+
+ [["topic1",["pub","sub"]],["topic2/#",["pub"]],["+/topic3",["sub"]]]
+
+ Figure 9: Example Scope
+
+ This access token gives publish ("pub") and subscribe ("sub")
+ permissions to the "topic1", publish permission to all the subtopics
+ of "topic2", and subscribe permission to all "topic3", skipping one
+ level.
+
+ If the scope is empty, the Broker records no permissions for the
+ Client for any topic. In this case, the Client is not able to
+ publish or subscribe to any protected topics. The non-empty scope is
+ used to authorize the Will Topic, if provided, in the CONNECT packet,
+ during connection setup and, if the connection request succeeds, the
+ Topic Names or Topic Filters requested in the future PUBLISH and
+ SUBSCRIBE packets. For the authorization to succeed, the Broker MUST
+ verify that the Topic Name or Topic Filter in question is either an
+ exact match to or a subset of at least one "topic_filter" in the
+ scope.
+
+2.4. Broker Response to Client Connection Request
+
+ Based on the validation result (obtained either via local inspection
+ or using the introspection interface of the AS), the Broker MUST send
+ a CONNACK packet to the Client.
+
+2.4.1. Unauthorized Request and the Optional Authorization Server
+ Discovery
+
+ Authentication can fail for the following reasons:
+
+ * if the Client does not provide a valid token,
+
+ * the Client omits the Authentication Data field and the Broker has
+ no token stored for the Client,
+
+ * the token or Authentication data are malformed, or
+
+ * if the Will Flag is set, the authorization checks for the Will
+ Topic fails.
+
+ The Broker responds with the CONNACK reason code 0x87 (Not
+ Authorized) or any other applicable reason code.
+
+ The Broker MAY also trigger AS discovery and include a User Property
+ (identified as property type 38 (0x26)) in the CONNACK for the AS
+ Request Creation Hints. The User Property is a UTF-8 string pair,
+ composed of a name and a value. The name of the User Property MUST
+ be set to "ace_as_hint". The value of the User Property is a UTF-
+ 8-encoded JSON object containing the mandatory "AS" parameter and the
+ optional parameters "audience", "kid", "cnonce", and "scope", as
+ defined in Section 5.3 of the ACE framework [RFC9200].
+
+2.4.2. Authorization Success
+
+ On success, the reason code of the CONNACK is 0x00 (Success). If the
+ Broker starts a new Session, it MUST also set Session Present to 0 in
+ the CONNACK packet to signal a new Session to the Client. Otherwise,
+ it MUST set Session Present to 1.
+
+ Having accepted the connection, the Broker MUST be prepared to store
+ the token during the connection and after disconnection for future
+ use. If the token is not self-contained and the Broker uses token
+ introspection, it MAY cache the validation result to authorize the
+ subsequent PUBLISH and SUBSCRIBE packets. PUBLISH and SUBSCRIBE
+ packets, which are sent after a connection setup, do not contain
+ access tokens. If the introspection result is not cached, the Broker
+ needs to introspect the saved token for each request. The Broker
+ SHOULD also use a cache timeout to introspect tokens regularly. The
+ timeout value is specific to the application and should be chosen to
+ reduce the risk of using stale introspection responses.
+
+3. Authorizing PUBLISH and SUBSCRIBE Packets
+
+ Using the cached token or its introspection result, the Broker uses
+ the scope field to match against the Topic Name in a PUBLISH packet
+ or a Topic Filter in a SUBSCRIBE packet.
+
+3.1. PUBLISH Packets from the Publisher Client to the Broker
+
+ On receiving the PUBLISH packet, the Broker MUST use the type of
+ packet (i.e., PUBLISH) and the Topic Name in the packet header to
+ match against the scope array items in the cached token or its
+ introspection result. Following the example in Section 2.3, the
+ Client sending a PUBLISH packet for "topic2/a" would be allowed, as
+ the scope array includes the ["topic2/#",["pub"]].
+
+ If the Client is allowed to publish to the topic, the Broker
+ publishes the message to all valid subscribers of the topic. In the
+ case of an authorization failure, the Broker MUST return an error if
+ the Client has set the QoS level of the PUBLISH packet to greater
+ than or equal to 1. Depending on the QoS level, the Broker responds
+ with either a PUBACK or PUBREC packet with reason code 0x87 (Not
+ authorized). On receiving an acknowledgment with 0x87 (Not
+ authorized), the Client MAY reauthenticate by providing a new token,
+ as described in Section 4.
+
+ For QoS level 0, the Broker sends a DISCONNECT packet with reason
+ code 0x87 (Not authorized) and closes the Network Connection. Note
+ that the server-side DISCONNECT is a new feature of MQTT v5.0 (in
+ MQTT v3.1.1, the server needs to drop the connection).
+
+ For all QoS levels, the Broker MAY return 0x80 (Unspecified error) if
+ they do not want to leak the Topic Names to unauthorized clients.
+
+3.2. PUBLISH Packets from the Broker to the Subscriber Clients
+
+ To forward PUBLISH packets to the subscribing Clients, the Broker
+ identifies all the subscribers that have valid matching Topic
+ Subscriptions to the Topic Name of the PUBLISH packet (i.e., the
+ tokens are valid, and token scopes allow a Subscription to this
+ particular Topic Name). The Broker forwards the PUBLISH packet to
+ all the valid subscribers.
+
+ The Broker MUST NOT forward messages to unauthorized subscribers. To
+ avoid silently dropping messages, the Broker MUST close the Network
+ Connection and SHOULD inform the affected subscribers. In this case,
+ the only way to inform a client would be sending a DISCONNECT packet.
+ Therefore, the Broker SHOULD send a DISCONNECT packet with reason
+ code 0x87 (Not authorized) before closing the Network Connection to
+ these clients.
+
+3.3. Authorizing SUBSCRIBE Packets
+
+ In MQTT, a SUBSCRIBE packet is sent from a Client to the Broker to
+ create one or more Subscriptions to one or more topics. The
+ SUBSCRIBE packet may contain multiple Topic Filters. The Topic
+ Filters may include wildcard characters.
+
+ On receiving the SUBSCRIBE packet, the Broker MUST use the type of
+ packet (i.e., SUBSCRIBE) and the Topic Filter in the packet header to
+ match against the scope field of the stored token or introspection
+ result. The Topic Filters MUST be an exact match to or be a subset
+ of at least one of the "topic_filter" fields in the scope array found
+ in the Client's token. For example, if the Client sends a SUBSCRIBE
+ request for topic "a/b/*" and has a token that permits "a/*", this is
+ a valid SUBSCRIBE request, as "a/b/*" is a subset of "a/*". (The
+ process is similar to a Broker matching the Topic Name in a PUBLISH
+ packet against the Subscriptions known to the Server.)
+
+ As a response to the SUBSCRIBE packet, the Broker issues a SUBACK
+ packet. For each Topic Filter, the SUBACK packet includes a return
+ code matching the QoS level for the corresponding Topic Filter. In
+ the case of failure, the return code is 0x87, indicating that the
+ Client is not authorized. The Broker MAY return 0x80 (Unspecified
+ error) if they do not want to leak the Topic Names to unauthorized
+ clients. A reason code is returned for each Topic Filter.
+ Therefore, the Client may receive success codes for a subset of its
+ Topic Filters while being unauthorized for the rest.
+
+4. Token Expiration, Update, and Reauthentication
+
+ The Broker MUST check for token expiration whenever a CONNECT,
+ PUBLISH, or SUBSCRIBE packet is received or sent. The Broker SHOULD
+ check for token expiration on receiving a PINGREQ packet. The Broker
+ MAY also check for token expiration periodically, e.g., every hour.
+ This may allow for early detection of a token expiry.
+
+ The token expiration is checked by checking the "exp" claim of a JWT
+ or introspection response or via performing an introspection request
+ with the AS, as described in Section 5.9 of the ACE framework
+ [RFC9200]. Token expirations may trigger the Broker to send PUBACK,
+ SUBACK, and DISCONNECT packets with the return code set to "Not
+ authorized". After sending a DISCONNECT packet, the Network
+ Connection is closed, and no more messages can be sent.
+
+ The Client MAY reauthenticate a response to PUBACK and SUBACK, which
+ signal loss of authorization. The Clients MAY also proactively
+ update their tokens, i.e., before they receive a packet with a "Not
+ authorized" return code. To start reauthentication, the Client MUST
+ send an AUTH packet with reason code 0x19 (Reauthentication). The
+ Client MUST set the Authentication Method as "ace" and transport the
+ new token in the Authentication Data. If reauthenticating during the
+ current TLS session, the Client MUST NOT use the method described in
+ Section 2.2.4.2.1, i.e., proof of possession using a challenge from
+ the TLS session, to avoid reusing the same challenge value from the
+ TLS-Exporter. Note that this means that servers will either need to
+ record in the session ticket or database entry whether the TLS-
+ Exporter-derived challenge was used or always deny use of the TLS-
+ Exporter-derived challenge for resumed sessions. In TLS 1.3, the
+ resumed connection would have a new exporter value, but the
+ requirement is phrased this way for simplicity. For
+ reauthentications in the same TLS-session, the Client MUST use the
+ challenge-response PoP, as defined in Section 2.2.4.2.2. The Broker
+ accepts reauthentication requests if the Client has already submitted
+ a token (may be expired), for which it performed proof of possession.
+ Otherwise, the Broker MUST deny the request. If the reauthentication
+ fails, the Broker MUST send a DISCONNECT packet with reason code 0x87
+ (Not Authorized).
+
+5. Handling Disconnections and Retained Messages
+
+ In the case of a Client DISCONNECT, if the Session Expiry Interval is
+ set to 0, the Broker doesn't store the Session State but MUST keep
+ the retained messages. If the Broker stores the Session State, the
+ state MAY include the token and its introspection result (for
+ reference tokens) in addition to the MQTT Session State. The MQTT
+ Session State is identified by the Client Identifier and includes the
+ following:
+
+ * the Client Subscriptions,
+
+ * messages with QoS levels 1 and 2, which have not been completely
+ acknowledged or are pending transmission to the Client, and
+
+ * if the Session is currently not connected, the time at which the
+ Session will end and the Session State will be discarded.
+
+ The token/introspection state is not part of the MQTT Session State,
+ and PoP validation is required for each new connection, regardless of
+ whether existing MQTT Sessions are continued.
+
+ The messages to be retained are indicated to the Broker by setting a
+ RETAIN flag in a PUBLISH packet. This way, the publisher signals to
+ the Broker to store the most recent message for the associated topic.
+ Hence, the new subscribers can receive the last sent message from the
+ publisher for that particular topic without waiting for the next
+ PUBLISH packet. The Broker MUST continue publishing the retained
+ messages as long as the associated tokens are valid. In the MQTT
+ standard, if QoS is 0 for the PUBLISH packet, the Broker may discard
+ the retained message any time. For QoS > 1, the message expiry
+ interval dictates how long the retained message is kept. However, it
+ is important that the Broker avoids sending messages indefinitely for
+ the Clients that never update their tokens (i.e., the Client connects
+ briefly with a valid token, sends a PUBLISH packet with the RETAIN
+ flag set to 1 and QoS > 1, disconnects, and never connects again).
+ Therefore, the Broker MUST use the minimum of the token expiry and
+ message expiry interval to discard a retained message.
+
+ In case of disconnections due to network errors or server
+ disconnection due to a protocol error (which includes authorization
+ errors), the Will Message is sent if the Client supplied a Will in
+ the CONNECT packet. The Client's token scope array MUST include the
+ Will Topic. The Will Message MUST be published to the Will Topic,
+ regardless of whether the corresponding token has expired (as it has
+ been validated and accepted during CONNECT).
+
+6. Reduced Protocol Interactions for MQTT v3.1.1
+
+ This section describes a reduced set of protocol interactions for the
+ MQTT v3.1.1 Clients. An MQTT v5.0 Broker MAY implement these
+ interactions for the MQTT v3.1.1 Clients; the flows described in this
+ section are NOT RECOMMENDED for use by MQTT v5.0 Clients. Brokers
+ that do not support MQTT v3.1.1 Clients return a CONNACK packet with
+ reason code 0x84 (Unsupported Protocol Version) in response to the
+ connection requests.
+
+6.1. Token Transport
+
+ As in MQTT v5.0, the token MAY either be transported before, by
+ publishing to the "authz-info" topic, or inside the CONNECT packet.
+ If the Client provided the token via the "authz-info" topic and will
+ not update the token in the CONNECT packet, it MUST authenticate over
+ TLS. The Broker SHOULD still be prepared to store the Client access
+ token for future use (regardless of the method of transport).
+
+ In MQTT v3.1.1, after the Client has published to the "authz-info"
+ topic, the Broker cannot communicate the result of the token
+ validation because PUBACK reason codes or server-side DISCONNECT
+ packets are not supported. In any case, the subsequent TLS handshake
+ would fail without a valid token, which can prompt the Client to
+ obtain a valid token.
+
+ To transport the token to the Broker inside the CONNECT packet, the
+ Client uses the User Name and Password fields. Figure 10 shows the
+ structure of the MQTT CONNECT packet.
+
+ 0 8 16
+ +---------------------------+
+ |Protocol name length = 4 |
+ +---------------------------+
+ | 'M' 'Q' |
+ +---------------------------+
+ | 'T' 'T' |
+ +---------------------------+
+ |Proto.level=5|Connect flags|
+ +---------------------------+
+ | Keep alive |
+ +---------------------------+
+ | Payload |
+ | Client Identifier |
+ | (UTF-8-encoded string) |
+ | User Name as access token |
+ | (UTF-8-encoded string) |
+ | Password for signature/MAC|
+ | (Binary Data) |
+ +---------------------------+
+
+ Figure 10: MQTT CONNECT Variable Header Using a User Name and
+ Password for ACE
+
+ Table 2 shows how the MQTT connect flags MUST be set to initiate a
+ connection with the Broker.
+
+ +================+==========+========+======+======+=======+=======+
+ | User Name Flag | Password | Will | Will | Will | Clean | Rsvd. |
+ | | Flag | Retain | QoS | Flag | | |
+ +================+==========+========+======+======+=======+=======+
+ | 1 | 1 | X | X X | X | X | 0 |
+ +----------------+----------+--------+------+------+-------+-------+
+
+ Table 2: MQTT CONNECT Flags (Rsvd. = Reserved)
+
+ The Client SHOULD set the Clean flag to 1 to always start a new
+ Session. If the Clean flag is set to 0, the Broker MUST resume
+ communications with the Client based on the state from the current
+ Session (as identified by the Client Identifier). If there is no
+ Session associated with the Client Identifier, the Broker MUST create
+ a new Session. The Broker MUST set the Session Present flag in the
+ CONNACK packet accordingly, i.e., 0 to indicate a new Session to the
+ Client and 1 to indicate that the existing Session is continued. The
+ Broker MUST still perform PoP validation on the provided Client
+ token. MQTT v3.1.1 does not use a Session Expiry Interval, and the
+ Client expects that the Broker maintains the Session State after it
+ disconnects. However, the stored Session State can be discarded as a
+ result of administrator action or policies (e.g., defining an
+ automated response based on storage capabilities), and Brokers SHOULD
+ implement administrative policies to limit misuse.
+
+ The Client MAY set the Will Flag as desired (marked as "X" in
+ Table 2). User Name and Password flags MUST be set to 1 to ensure
+ that the Payload of the CONNECT packet includes both the User Name
+ and Password fields. The MQTT User Name is a UTF-8-encoded string,
+ and the MQTT Password is Binary Data.
+
+ The CONNECT in MQTT v3.1.1 does not have a field to indicate the
+ Authentication Method. To signal that the User Name field contains
+ an ACE token, this field MUST be prefixed with the keyword "ace",
+ i.e., the User Name field is a concatenation of 'a', 'c', 'e', and
+ the access token represented as:
+
+ 'U+0061'||'U+0063'||'U+0065'||UTF-8(access token)
+
+ Figure 11: User Name in CONNECT
+
+ To this end, the access token MUST be encoded with base64url,
+ omitting the "=" padding characters [RFC4648].
+
+ The Password field MUST be set to the keyed message digest (MAC) or
+ signature associated with the access token for PoP. The Client MUST
+ apply the PoP key on the challenge derived from the TLS session, as
+ described in Section 2.2.4.2.1.
+
+6.2. Handling Authorization Errors
+
+ Error handling is more primitive in MQTT v3.1.1 due to not having
+ appropriate error fields, error codes, and server-side DISCONNECTs.
+ Therefore, the Broker will disconnect on almost any error and may not
+ keep the Session State, necessitating that clients make a greater
+ effort to ensure that tokens remain valid and do not attempt to
+ publish to topics that they do not have permissions for. The
+ following lists how the Broker responds to specific errors.
+
+ CONNECT without a token:
+ The tokenless CONNECT attempt MUST fail. This is because the
+ challenge-response-based PoP is not possible for MQTT v3.1.1.
+ It is also not possible to support AS discovery since a
+ CONNACK packet in MQTT v3.1.1 does not include a means to
+ provide additional information to the Client. Therefore, AS
+ discovery needs to take place out of band.
+
+ Client-Broker PUBLISH authorization failure:
+ In the case of a failure, it is not possible to return an
+ error in MQTT v3.1.1. Acknowledgment messages only indicate
+ success. In the case of an authorization error, the Broker
+ MUST ignore the PUBLISH packet and disconnect the Client.
+ Also, as DISCONNECT packets are only sent from a Client to
+ the Broker, the server disconnection needs to take place
+ below the application layer.
+
+ SUBSCRIBE authorization failure:
+ In the SUBACK packet, the return code is 0x80, indicating
+ failure for the unauthorized topic(s). Note that, in both
+ MQTT versions, a reason code is returned for each Topic
+ Filter.
+
+ Broker-Client PUBLISH authorization failure:
+ When the Broker is forwarding PUBLISH packets to the
+ subscribed Clients, it may discover that some of the
+ subscribers are no longer authorized due to expired tokens.
+ These token expirations MUST lead to disconnecting the Client
+ rather than silently dropping messages.
+
+7. IANA Considerations
+
+7.1. TLS Exporter Labels Registration
+
+ This document registers "EXPORTER-ACE-MQTT-Sign-Challenge"
+ (introduced in Section 2.2.4.2.1 in this document) in the "TLS
+ Exporter Labels" registry [RFC8447].
+
+ Recommended: N
+
+ DTLS-OK: N
+
+ Reference: RFC 9431
+
+7.2. Media Type Registration
+
+ This document registers the "application/ace+json" media type for
+ messages of the protocols defined in this document carrying
+ parameters encoded in JSON.
+
+ Type name: application
+
+ Subtype name: ace+json
+
+ Required parameters: N/A
+
+ Optional parameters: N/A
+
+ Encoding considerations: Encoding considerations are identical to
+ those specified for the "application/json" media type.
+
+ Security considerations: Section 8 of RFC 9431
+
+ Interoperability considerations: none
+
+ Published specification: RFC 9431
+
+ Applications that use this media type: This media type is intended
+ for Authorization-Server-Client and Authorization-Server-Resource-
+ Server communication as part of the ACE framework using JSON
+ encoding, as specified in RFC 9431.
+
+ Fragment identifier considerations: none
+
+ Additional information:
+
+ Deprecated alias names for this type: none
+
+ Magic number(s): none
+
+ File extension(s): none
+
+ Macintosh file type code(s): none
+
+ Person & email address to contact for further information:
+ Cigdem Sengul <csengul@acm.org>
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: Cigdem Sengul <csengul@acm.org>
+
+ Change controller: IETF
+
+7.3. ACE OAuth Profile Registration
+
+ The following registrations have been made in the "ACE Profiles"
+ registry, following the procedure specified in [RFC9200].
+
+ Name: mqtt_tls
+
+ Description: Profile for delegating Client authentication and
+ authorization using MQTT for the Client and Broker (RS)
+ interactions and HTTP for the AS interactions. TLS is used for
+ confidentiality and integrity protection and server
+ authentication. Client authentication can be provided either via
+ TLS or using in-band PoP validation at the MQTT application layer.
+
+ CBOR Value: 3
+
+ Reference: RFC 9431
+
+7.4. AIF
+
+ For the media types "application/aif+cbor" and "application/
+ aif+json", defined in Section 5.1 of [RFC9237], IANA has registered
+ the following entries for the two media type parameters Toid and
+ Tperm in the respective subregistry defined in Section 5.2 of
+ [RFC9237] within the "Media Type Sub-Parameter Registries".
+
+ For Toid:
+ Name: mqtt-topic-filter
+
+ Description/Specification: Topic Filter, as defined in
+ Section 2.3 of RFC 9431.
+
+ Reference: RFC 9431, Section 2.3
+
+ For Tperm:
+ Name: mqtt-permissions
+
+ Description/Specification: Permissions for the MQTT Client, as
+ defined in Section 2.3 of RFC 9431. Tperm is an array of one
+ or more text strings that each have a value of either "pub" or
+ "sub".
+
+ Reference: RFC 9431, Section 2.3
+
+8. Security Considerations
+
+ This document specifies a profile for the Authentication and
+ Authorization for Constrained Environments (ACE) framework [RFC9200].
+ Therefore, the security considerations outlined in [RFC9200] apply to
+ this work.
+
+ In addition, the security considerations outlined in the MQTT v5.0
+ OASIS Standard [MQTT-OASIS-Standard-v5] and MQTT v3.1.1 OASIS
+ Standard [MQTT-OASIS-Standard-v3.1.1] apply. Mainly, this document
+ provides an authorization solution for MQTT, the responsibility of
+ which is left to the specific implementation in the MQTT standards.
+ In the following, we comment on a few relevant issues based on the
+ current MQTT specifications.
+
+ After the Broker validates an access token and accepts a connection
+ from a client, it caches the token to authorize a Client's publish
+ and subscribe requests in an ongoing Session. The Broker does not
+ cache any tokens that cannot be validated. If a Client's permissions
+ get revoked, but the access token has not expired, the Broker may
+ still grant publish/subscribe to revoked topics. If the Broker
+ caches the token introspection responses, then the Broker SHOULD use
+ a reasonable cache timeout to introspect tokens regularly. The
+ timeout value is application specific and should be chosen to reduce
+ the risk of using stale introspection responses. When permissions
+ change dynamically, it is expected that the AS also follows a
+ reasonable expiration strategy for the access tokens.
+
+ The Broker may monitor Client behavior to detect potential security
+ problems, especially those affecting availability. These include
+ repeated token transfer attempts to the public "authz-info" topic,
+ repeated connection attempts, abnormal terminations, and Clients that
+ connect but do not send any data. If the Broker supports the public
+ "authz-info" topic, described in Section 2.2.2, then this may be
+ vulnerable to a DDoS attack, where many Clients use the "authz-info"
+ public topic to transport tokens that are not meant to be used and
+ that the Broker may need to store until they expire.
+
+ For MQTT v5.0, when a Client connects with a long Session Expiry
+ Interval, the Broker may need to maintain the Client's MQTT Session
+ State after it disconnects for an extended period. For MQTT v3.1.1,
+ the Session State may need to be stored indefinitely, as it does not
+ have a Session Expiry Interval feature. The Broker SHOULD implement
+ administrative policies to limit misuse by the Client resulting from
+ continuing existing Sessions.
+
+9. Privacy Considerations
+
+ The privacy considerations outlined in [RFC9200] apply to this work.
+
+ In MQTT, the Broker is a central trusted party and may forward
+ potentially sensitive information between Clients. The mechanisms
+ defined in this document do not protect the contents of the PUBLISH
+ packet from the Broker, and hence, the content of the PUBLISH packet
+ is not signed or encrypted separately for the subscribers. This
+ functionality may be implemented using the proposal outlined in the
+ ACE Pub-Sub Profile [ACE-PUBSUB-PROFILE]. However, this solution
+ would still not provide privacy for other fields of the packet, such
+ as Topic Name.
+
+10. References
+
+10.1. Normative References
+
+ [MQTT-OASIS-Standard-v3.1.1]
+ Banks, A., Ed. and R. Gupta, Ed., "MQTT Version 3.1.1 Plus
+ Errata 01", OASIS Standard, December 2015,
+ <https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-
+ v3.1.1.html>.
+
+ [MQTT-OASIS-Standard-v5]
+ Banks, A., Ed., Briggs, E., Ed., Borgendale, K., Ed., and
+ R. Gupta, Ed., "MQTT Version 5.0", OASIS Standard, March
+ 2019, <https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-
+ v5.0.html>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
+ Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
+ <https://www.rfc-editor.org/info/rfc4648>.
+
+ [RFC5705] Rescorla, E., "Keying Material Exporters for Transport
+ Layer Security (TLS)", RFC 5705, DOI 10.17487/RFC5705,
+ March 2010, <https://www.rfc-editor.org/info/rfc5705>.
+
+ [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS)
+ Extensions: Extension Definitions", RFC 6066,
+ DOI 10.17487/RFC6066, January 2011,
+ <https://www.rfc-editor.org/info/rfc6066>.
+
+ [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)", RFC 6234,
+ DOI 10.17487/RFC6234, May 2011,
+ <https://www.rfc-editor.org/info/rfc6234>.
+
+ [RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework",
+ RFC 6749, DOI 10.17487/RFC6749, October 2012,
+ <https://www.rfc-editor.org/info/rfc6749>.
+
+ [RFC7250] Wouters, P., Ed., Tschofenig, H., Ed., Gilmore, J.,
+ Weiler, S., and T. Kivinen, "Using Raw Public Keys in
+ Transport Layer Security (TLS) and Datagram Transport
+ Layer Security (DTLS)", RFC 7250, DOI 10.17487/RFC7250,
+ June 2014, <https://www.rfc-editor.org/info/rfc7250>.
+
+ [RFC7301] Friedl, S., Popov, A., Langley, A., and E. Stephan,
+ "Transport Layer Security (TLS) Application-Layer Protocol
+ Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301,
+ July 2014, <https://www.rfc-editor.org/info/rfc7301>.
+
+ [RFC7516] Jones, M. and J. Hildebrand, "JSON Web Encryption (JWE)",
+ RFC 7516, DOI 10.17487/RFC7516, May 2015,
+ <https://www.rfc-editor.org/info/rfc7516>.
+
+ [RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517,
+ DOI 10.17487/RFC7517, May 2015,
+ <https://www.rfc-editor.org/info/rfc7517>.
+
+ [RFC7519] Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token
+ (JWT)", RFC 7519, DOI 10.17487/RFC7519, May 2015,
+ <https://www.rfc-editor.org/info/rfc7519>.
+
+ [RFC7627] Bhargavan, K., Ed., Delignat-Lavaud, A., Pironti, A.,
+ Langley, A., and M. Ray, "Transport Layer Security (TLS)
+ Session Hash and Extended Master Secret Extension",
+ RFC 7627, DOI 10.17487/RFC7627, September 2015,
+ <https://www.rfc-editor.org/info/rfc7627>.
+
+ [RFC7800] Jones, M., Bradley, J., and H. Tschofenig, "Proof-of-
+ Possession Key Semantics for JSON Web Tokens (JWTs)",
+ RFC 7800, DOI 10.17487/RFC7800, April 2016,
+ <https://www.rfc-editor.org/info/rfc7800>.
+
+ [RFC8032] Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital
+ Signature Algorithm (EdDSA)", RFC 8032,
+ DOI 10.17487/RFC8032, January 2017,
+ <https://www.rfc-editor.org/info/rfc8032>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC8422] Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, "Elliptic
+ Curve Cryptography (ECC) Cipher Suites for Transport Layer
+ Security (TLS) Versions 1.2 and Earlier", RFC 8422,
+ DOI 10.17487/RFC8422, August 2018,
+ <https://www.rfc-editor.org/info/rfc8422>.
+
+ [RFC8442] Mattsson, J. and D. Migault, "ECDHE_PSK with AES-GCM and
+ AES-CCM Cipher Suites for TLS 1.2 and DTLS 1.2", RFC 8442,
+ DOI 10.17487/RFC8442, September 2018,
+ <https://www.rfc-editor.org/info/rfc8442>.
+
+ [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+ [RFC8610] Birkholz, H., Vigano, C., and C. Bormann, "Concise Data
+ Definition Language (CDDL): A Notational Convention to
+ Express Concise Binary Object Representation (CBOR) and
+ JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610,
+ June 2019, <https://www.rfc-editor.org/info/rfc8610>.
+
+ [RFC8747] Jones, M., Seitz, L., Selander, G., Erdtman, S., and H.
+ Tschofenig, "Proof-of-Possession Key Semantics for CBOR
+ Web Tokens (CWTs)", RFC 8747, DOI 10.17487/RFC8747, March
+ 2020, <https://www.rfc-editor.org/info/rfc8747>.
+
+ [RFC9052] Schaad, J., "CBOR Object Signing and Encryption (COSE):
+ Structures and Process", STD 96, RFC 9052,
+ DOI 10.17487/RFC9052, August 2022,
+ <https://www.rfc-editor.org/info/rfc9052>.
+
+ [RFC9110] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP Semantics", STD 97, RFC 9110,
+ DOI 10.17487/RFC9110, June 2022,
+ <https://www.rfc-editor.org/info/rfc9110>.
+
+ [RFC9200] Seitz, L., Selander, G., Wahlstroem, E., Erdtman, S., and
+ H. Tschofenig, "Authentication and Authorization for
+ Constrained Environments Using the OAuth 2.0 Framework
+ (ACE-OAuth)", RFC 9200, DOI 10.17487/RFC9200, August 2022,
+ <https://www.rfc-editor.org/info/rfc9200>.
+
+ [RFC9201] Seitz, L., "Additional OAuth Parameters for Authentication
+ and Authorization for Constrained Environments (ACE)",
+ RFC 9201, DOI 10.17487/RFC9201, August 2022,
+ <https://www.rfc-editor.org/info/rfc9201>.
+
+ [RFC9202] Gerdes, S., Bergmann, O., Bormann, C., Selander, G., and
+ L. Seitz, "Datagram Transport Layer Security (DTLS)
+ Profile for Authentication and Authorization for
+ Constrained Environments (ACE)", RFC 9202,
+ DOI 10.17487/RFC9202, August 2022,
+ <https://www.rfc-editor.org/info/rfc9202>.
+
+ [RFC9237] Bormann, C., "An Authorization Information Format (AIF)
+ for Authentication and Authorization for Constrained
+ Environments (ACE)", RFC 9237, DOI 10.17487/RFC9237,
+ August 2022, <https://www.rfc-editor.org/info/rfc9237>.
+
+ [RFC9360] Schaad, J., "CBOR Object Signing and Encryption (COSE):
+ Header Parameters for Carrying and Referencing X.509
+ Certificates", RFC 9360, DOI 10.17487/RFC9360, February
+ 2023, <https://www.rfc-editor.org/info/rfc9360>.
+
+ [RFC9430] Bergmann, O., Preuß Mattsson, J., and G. Selander,
+ "Extension of the Datagram Transport Layer Security (DTLS)
+ Profile for Authentication and Authorization for
+ Constrained Environments (ACE) to Transport Layer Security
+ (TLS)", RFC 9430, DOI 10.17487/RFC9430, July 2023,
+ <https://www.rfc-editor.org/info/rfc9430>.
+
+10.2. Informative References
+
+ [ACE-PUBSUB-PROFILE]
+ Palombini, F., Sengul, C., and M. Tiloca, "Publish-
+ Subscribe Profile for Authentication and Authorization for
+ Constrained Environments (ACE)", Work in Progress,
+ Internet-Draft, draft-ietf-ace-pubsub-profile-06, 13 March
+ 2023, <https://datatracker.ietf.org/doc/html/draft-ietf-
+ ace-pubsub-profile-06>.
+
+ [Fremantle14]
+ Fremantle, P., Aziz, B., Kopecky, J., and P. Scott,
+ "Federated Identity and Access Management for the Internet
+ of Things", International Workshop on Secure Internet of
+ Things, DOI 10.1109/SIoT.2014.8, September 2014,
+ <https://dx.doi.org/10.1109/SIoT.2014.8>.
+
+ [RFC4949] Shirey, R., "Internet Security Glossary, Version 2",
+ FYI 36, RFC 4949, DOI 10.17487/RFC4949, August 2007,
+ <https://www.rfc-editor.org/info/rfc4949>.
+
+ [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained
+ Application Protocol (CoAP)", RFC 7252,
+ DOI 10.17487/RFC7252, June 2014,
+ <https://www.rfc-editor.org/info/rfc7252>.
+
+ [RFC7925] Tschofenig, H., Ed. and T. Fossati, "Transport Layer
+ Security (TLS) / Datagram Transport Layer Security (DTLS)
+ Profiles for the Internet of Things", RFC 7925,
+ DOI 10.17487/RFC7925, July 2016,
+ <https://www.rfc-editor.org/info/rfc7925>.
+
+ [RFC8392] Jones, M., Wahlstroem, E., Erdtman, S., and H. Tschofenig,
+ "CBOR Web Token (CWT)", RFC 8392, DOI 10.17487/RFC8392,
+ May 2018, <https://www.rfc-editor.org/info/rfc8392>.
+
+ [RFC8447] Salowey, J. and S. Turner, "IANA Registry Updates for TLS
+ and DTLS", RFC 8447, DOI 10.17487/RFC8447, August 2018,
+ <https://www.rfc-editor.org/info/rfc8447>.
+
+ [RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object
+ Representation (CBOR)", STD 94, RFC 8949,
+ DOI 10.17487/RFC8949, December 2020,
+ <https://www.rfc-editor.org/info/rfc8949>.
+
+ [RFC9325] Sheffer, Y., Saint-Andre, P., and T. Fossati,
+ "Recommendations for Secure Use of Transport Layer
+ Security (TLS) and Datagram Transport Layer Security
+ (DTLS)", BCP 195, RFC 9325, DOI 10.17487/RFC9325, November
+ 2022, <https://www.rfc-editor.org/info/rfc9325>.
+
+ [TLS-bis] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", Work in Progress, Internet-Draft, draft-
+ ietf-tls-rfc8446bis-09, 7 July 2023,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-tls-
+ rfc8446bis-09>.
+
+Appendix A. Checklist for Profile Requirements
+
+ Based on the requirements on profiles for the ACE framework
+ [RFC9200], this document fulfills the following:
+
+ * Optional AS discovery: AS discovery is supported with the MQTT
+ v5.0 described in Section 2.2.
+
+ * The communication protocol between the Client and Broker (RS):
+ MQTT
+
+ * The security protocol between the Client and RS: TLS
+
+ * Client and RS mutual authentication: Several options are possible
+ and described in Section 2.2.1.
+
+ * Proof-of-possession protocols: Both symmetric and asymmetric keys
+ are supported, as specified in Section 2.2.4.2.
+
+ * Content-Format: For the HTTPS interactions with AS, "application/
+ ace+json".
+
+ * Unique profile identifier: mqtt_tls
+
+ * Token introspection: The RS uses the HTTPS introspection interface
+ of the AS.
+
+ * Token request: The Client or its Client AS uses the HTTPS token
+ endpoint of the AS.
+
+ * authz-info endpoint: It MAY be supported using the method
+ described in Section 2.2.2 but is not protected other than by the
+ TLS channel between the Client and RS.
+
+ * Token transport: Via the "authz-info" topic, TLS with PSKs
+ (provided as a PSK identity), or in the MQTT CONNECT packet for
+ both versions of MQTT. The AUTH extensions can also be used for
+ authentication and reauthentication for MQTT v5.0, as described in
+ Sections 2.2 and 4.
+
+Acknowledgments
+
+ The authors would like to thank Ludwig Seitz for his review and his
+ input on the authorization information endpoint; Benjamin Kaduk for
+ his review, insightful comments, and contributions to resolving
+ issues; and Carsten Bormann for his review and revisions to the AIF-
+ MQTT data model. The authors would like to thank Paul Fremantle for
+ the initial discussions on MQTT v5.0 support.
+
+Authors' Addresses
+
+ Cigdem Sengul
+ Brunel University
+ Dept. of Computer Science
+ Uxbridge
+ UB8 3PH
+ United Kingdom
+ Email: csengul@acm.org
+
+
+ Anthony Kirby
+ Oxbotica
+ 1a Milford House
+ Mayfield Road, Summertown
+ Oxford
+ OX2 7EL
+ United Kingdom
+ Email: anthony@anthony.org