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