rfc8827xml2.original.xml | rfc8827.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<!ENTITY RFC2119 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2119.xml"> | ||||
<!ENTITY RFC2818 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2818.xml"> | ||||
<!ENTITY RFC3261 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3261.xml"> | ||||
<!ENTITY RFC3264 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3264.xml"> | ||||
<!ENTITY RFC3711 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3711.xml"> | ||||
<!ENTITY RFC3986 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3986.xml"> | ||||
<!ENTITY RFC4566 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.4566.xml"> | ||||
<!ENTITY RFC4568 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.4568.xml"> | ||||
<!ENTITY RFC4648 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.4648.xml"> | ||||
<!ENTITY RFC5246 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5246.xml"> | ||||
<!ENTITY RFC5479 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5479.xml"> | ||||
<!ENTITY RFC5705 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5705.xml"> | ||||
<!ENTITY RFC5763 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5763.xml"> | ||||
<!ENTITY RFC5764 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5764.xml"> | ||||
<!ENTITY RFC5785 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5785.xml"> | ||||
<!ENTITY RFC5890 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5890.xml"> | ||||
<!ENTITY RFC6265 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6265.xml"> | ||||
<!ENTITY RFC6347 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6347.xml"> | ||||
<!ENTITY RFC6454 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6454.xml"> | ||||
<!ENTITY RFC6455 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6455.xml"> | ||||
<!ENTITY RFC6943 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6943.xml"> | ||||
<!ENTITY RFC7022 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7022.xml"> | ||||
<!ENTITY RFC6120 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6120.xml"> | ||||
<!ENTITY RFC7617 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7617.xml"> | ||||
<!ENTITY RFC7675 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7675.xml"> | ||||
<!ENTITY RFC7918 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7918.xml"> | ||||
<!ENTITY RFC8174 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8174.xml"> | ||||
<!ENTITY RFC8122 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8122.xml"> | ||||
<!ENTITY RFC8259 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8259.xml"> | ||||
<!ENTITY RFC8261 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8261.xml"> | ||||
<!ENTITY RFC8445 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8445.xml"> | ||||
<!ENTITY I-D.ietf-rtcweb-overview SYSTEM "http://xml2rfc.ietf.org/public/rfc/bib | ||||
xml3/reference.I-D.ietf-rtcweb-overview.xml"> | ||||
<!ENTITY I-D.ietf-rtcweb-jsep SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml3 | ||||
/reference.I-D.ietf-rtcweb-jsep.xml"> | ||||
<!ENTITY I-D.ietf-rtcweb-security SYSTEM "http://xml2rfc.ietf.org/public/rfc/bib | ||||
xml3/reference.I-D.ietf-rtcweb-security.xml"> | ||||
<!ENTITY I-D.ietf-rtcweb-rtp-usage SYSTEM "http://xml2rfc.ietf.org/public/rfc/bi | ||||
bxml3/reference.I-D.ietf-rtcweb-rtp-usage.xml"> | ||||
<!ENTITY I-D.ietf-mmusic-sdp-uks SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibx | ||||
ml3/reference.I-D.ietf-mmusic-sdp-uks"> | ||||
]> | ||||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" | |||
<?rfc toc="yes" ?> | number="8827" docName="draft-ietf-rtcweb-security-arch-20" | |||
<?rfc symrefs="yes" ?> | ipr="pre5378Trust200902" obsoletes="" updates="" submissionType="IETF" | |||
<?rfc strict="yes" ?> | consensus="true" xml:lang="en" tocInclude="true" tocDepth="4" | |||
<?rfc compact="yes" ?> | symRefs="true" sortRefs="true" version="3"> | |||
<?rfc sortrefs="yes" ?> | <!-- xml2rfc v2v3 conversion 2.33.0 --> | |||
<?rfc colonspace="yes" ?> | ||||
<?rfc rfcedstyle="no" ?> | ||||
<!-- Don't change this. It breaks stuff --> | ||||
<?rfc tocdepth="4"?> | ||||
<rfc category="std" docName="draft-ietf-rtcweb-security-arch-20" | ||||
ipr="pre5378Trust200902"> | ||||
<front> | <front> | |||
<title abbrev="WebRTC Sec. Arch.">WebRTC Security Architecture</title> | <title abbrev="WebRTC Sec. Arch.">WebRTC Security Architecture</title> | |||
<seriesInfo name="RFC" value="8827"/> | ||||
<author fullname="Eric Rescorla" initials="E.K." surname="Rescorla"> | <author fullname="Eric Rescorla" initials="E." surname="Rescorla"> | |||
<organization>RTFM, Inc.</organization> | <organization>RTFM, Inc.</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>2064 Edgewood Drive</street> | <street>2064 Edgewood Drive</street> | |||
<city>Palo Alto</city> | <city>Palo Alto</city> | |||
<region>CA</region> | <region>CA</region> | |||
<code>94303</code> | <code>94303</code> | |||
<country>United States of America</country> | ||||
<country>USA</country> | ||||
</postal> | </postal> | |||
<phone>+1 650 678 2350</phone> | <phone>+1 650 678 2350</phone> | |||
<email>ekr@rtfm.com</email> | <email>ekr@rtfm.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="October" year="2020"/> | ||||
<date/> | <!-- [rfced] Please insert any keywords (beyond those that appear in the | |||
title) for use on https://www.rfc-editor.org/search --> | ||||
<area>ART</area> | <abstract> | |||
<!-- [rfced] In this cluster, we have been expanding WebRTC in the body of the | ||||
document (but not the title) as Web Real-Time Communication. Do you want to | ||||
include this expansion somewhere, or is not needed with the current | ||||
explanatory text? | ||||
<workgroup>RTCWEB</workgroup> | Original (first occurrence): | |||
This document defines the security architecture for WebRTC, a | ||||
protocol suite intended for use with real-time applications that can | ||||
be deployed in browsers - "real time communication on the Web". | ||||
--> | ||||
<abstract> | ||||
<t> | <t> | |||
This document defines the security architecture for WebRTC, a protocol | This document defines the security architecture for WebRTC, a protocol | |||
suite intended for use with real-time applications that can be deployed | suite intended for use with real-time applications that can be deployed | |||
in browsers - "real time communication on the Web". | in browsers -- "real-time communication on the Web". | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="sec.introduction" numbered="true" toc="default"> | ||||
<section title="Introduction" anchor="sec.introduction"> | <name>Introduction</name> | |||
<t> | <t> | |||
The Real-Time Communications on the Web (RTCWEB) working group | The Real-Time Communications on the Web (RTCWEB) Working Group | |||
standardized protocols for real-time communications between Web | standardized protocols for real-time communications between Web | |||
browsers, generally called "WebRTC" <xref target="I-D.ietf-rtcweb-overvi ew"/>. | browsers, generally called "WebRTC" <xref target="RFC8825" format="defau lt"/>. | |||
The major use cases for WebRTC technology are real-time audio | The major use cases for WebRTC technology are real-time audio | |||
and/or video calls, Web conferencing, and direct data transfer. Unlike | and/or video calls, Web conferencing, and direct data transfer. Unlike | |||
most conventional real-time systems, (e.g., SIP-based <xref | most conventional real-time systems (e.g., SIP-based <xref target="RFC32 | |||
target="RFC3261"></xref> soft phones) WebRTC communications are directly | 61" format="default"/> soft phones), WebRTC communications are directly | |||
controlled by some Web server, via a JavaScript (JS) API as shown in | controlled by some Web server, via a JavaScript (JS) API as shown in | |||
<xref target="fig.simple"/>. | <xref target="fig.simple" format="default"/>. | |||
</t> | </t> | |||
<figure title="A simple WebRTC system" anchor="fig.simple"> | <figure anchor="fig.simple"> | |||
<artwork><![CDATA[ | <name>A Simple WebRTC System</name> | |||
+----------------+ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| | | +----------------+ | |||
| Web Server | | | | | |||
| | | | Web Server | | |||
+----------------+ | | | | |||
^ ^ | +----------------+ | |||
/ \ | ^ ^ | |||
HTTP / \ HTTP | / \ | |||
/ \ | HTTP / \ HTTP | |||
/ \ | / \ | |||
v v | / \ | |||
JS API JS API | v v | |||
+-----------+ +-----------+ | JS API JS API | |||
| | Media | | | +-----------+ +-----------+ | |||
| Browser |<---------->| Browser | | | | Media | | | |||
| | | | | | Browser |<---------->| Browser | | |||
+-----------+ +-----------+ | | | | | | |||
]]></artwork> | +-----------+ +-----------+ ]]></artwork> | |||
</figure> | </figure> | |||
<t> | <t> | |||
A more complicated system might allow for interdomain calling, as shown | A more complicated system might allow for interdomain calling, as shown | |||
in <xref target="fig.multidomain"/>. The protocol to be used between | in <xref target="fig.multidomain" format="default"/>. The protocol to b e used between | |||
the domains is not standardized by WebRTC, but given the installed base | the domains is not standardized by WebRTC, but given the installed base | |||
and the form of the WebRTC API is likely to be something SDP-based like | and the form of the WebRTC API is likely to be something SDP-based like | |||
SIP or something like Extensible Messaging and Presence Protocol (XMPP) | SIP or something like the Extensible Messaging and Presence Protocol (XM | |||
<xref target="RFC6120"/>. | PP) | |||
<xref target="RFC6120" format="default"/>. | ||||
</t> | </t> | |||
<figure title="A multidomain WebRTC system" anchor="fig.multidomain"> | <figure anchor="fig.multidomain"> | |||
<artwork><![CDATA[ | <name>A Multidomain WebRTC System</name> | |||
+--------------+ +--------------+ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| | SIP,XMPP,...| | | +--------------+ +--------------+ | |||
| Web Server |<----------->| Web Server | | | | SIP, XMPP, ... | | | |||
| | | | | | Web Server |<-------------->| Web Server | | |||
+--------------+ +--------------+ | | | | | | |||
^ ^ | +--------------+ +--------------+ | |||
| | | ^ ^ | |||
HTTP | | HTTP | | | | |||
| | | HTTP | | HTTP | |||
v v | | | | |||
JS API JS API | v v | |||
+-----------+ +-----------+ | JS API JS API | |||
| | Media | | | +-----------+ +-----------+ | |||
| Browser |<---------------->| Browser | | | | Media | | | |||
| | | | | | Browser |<------------------->| Browser | | |||
+-----------+ +-----------+ | | | | | | |||
]]></artwork> | +-----------+ +-----------+ ]]></artwork> | |||
</figure> | </figure> | |||
<t> | <t> | |||
This system presents a number of new security challenges, which are | This system presents a number of new security challenges, which are | |||
analyzed in <xref target="I-D.ietf-rtcweb-security"/>. This document | analyzed in <xref target="RFC8826" format="default"/>. This document | |||
describes a security architecture for WebRTC which addresses the threats | describes a security architecture for WebRTC which addresses the threats | |||
and requirements described in that document. | and requirements described in that document. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec-term" numbered="true" toc="default"> | ||||
<name>Terminology</name> | ||||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | ||||
"<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | ||||
"<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | ||||
to be interpreted as described in BCP 14 <xref target="RFC2119"/> | ||||
<xref target="RFC8174"/> when, and only when, they appear in all capitals, | ||||
as shown here.</t> | ||||
<section anchor="sec-term" title="Terminology"> | ||||
<t> | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | ||||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | ||||
"MAY", and "OPTIONAL" in this document are to be interpreted as | ||||
described in BCP 14 <xref target="RFC2119"/> | ||||
<xref target="RFC8174"/> when, and only when, they | ||||
appear in all capitals, as shown here. | ||||
</t> | ||||
</section> | </section> | |||
<section anchor="sec.proposal.trusthierarchy" numbered="true" toc="default"> | ||||
<section title="Trust Model" anchor="sec.proposal.trusthierarchy"> | <name>Trust Model</name> | |||
<t> | <t> | |||
The basic assumption of this architecture is that network resources | The basic assumption of this architecture is that network resources | |||
exist in a hierarchy of trust, rooted in the browser, which serves as | exist in a hierarchy of trust, rooted in the browser, which serves as | |||
the user's Trusted Computing Base (TCB). Any security property which the | the user's Trusted Computing Base (TCB). Any security property which the | |||
user wishes to have enforced must be ultimately guaranteed by the | user wishes to have enforced must be ultimately guaranteed by the | |||
browser (or transitively by some property the browser | browser (or transitively by some property the browser | |||
verifies). Conversely, if the browser is compromised, then no security | verifies). Conversely, if the browser is compromised, then no security | |||
guarantees are possible. Note that there are cases (e.g., Internet | guarantees are possible. Note that there are cases (e.g., Internet | |||
kiosks) where the user can't really trust the browser that much. In | kiosks) where the user can't really trust the browser that much. In | |||
these cases, the level of security provided is limited by how much they | these cases, the level of security provided is limited by how much they | |||
trust the browser. | trust the browser. | |||
</t> | </t> | |||
<t> | <t> | |||
Optimally, we would not rely on trust in any entities other than the | Optimally, we would not rely on trust in any entities other than the | |||
browser. However, this is unfortunately not possible if we wish to have | browser. However, this is unfortunately not possible if we wish to have | |||
a functional system. Other network elements fall into two categories: | a functional system. Other network elements fall into two categories: | |||
those which can be authenticated by the browser and thus can be granted | those which can be authenticated by the browser and thus can be granted | |||
permissions to access sensitive resources, and those which cannot be | permissions to access sensitive resources, and those which cannot be | |||
authenticated and thus are untrusted. | authenticated and thus are untrusted. | |||
</t> | </t> | |||
<section anchor="sec.proposal.authenticated" numbered="true" toc="default" | ||||
<section title="Authenticated Entities" anchor="sec.proposal.authenticated | > | |||
"> | <name>Authenticated Entities</name> | |||
<t> | <t> | |||
There are two major classes of authenticated entities in the system: | There are two major classes of authenticated entities in the system: | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal"> | |||
<list style="symbols"> | <dt>Calling services:</dt> | |||
<t> | <dd>Web sites whose origin we can verify (optimally | |||
Calling services: Web sites whose origin we can verify (optimally | ||||
via HTTPS, but in some cases because we are on a topologically | via HTTPS, but in some cases because we are on a topologically | |||
restricted network, such as behind a firewall, and can infer | restricted network, such as behind a firewall, and can infer | |||
authentication from firewall behavior). | authentication from firewall behavior).</dd> | |||
</t> | <dt>Other users:</dt> | |||
<t> | <dd>WebRTC peers whose origin we can verify | |||
Other users: WebRTC peers whose origin we can verify | cryptographically (optimally via DTLS-SRTP).</dd> | |||
cryptographically (optimally via DTLS-SRTP). | </dl> | |||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | <t> | |||
Note that merely being authenticated does not make these entities | Note that merely being authenticated does not make these entities | |||
trusted. For instance, just because we can verify that | trusted. For instance, just because we can verify that | |||
https://www.example.org/ is owned by Dr. Evil does not mean that we ca n | <https://www.example.org/> is owned by Dr. Evil does not mean th at we can | |||
trust Dr. Evil to access our camera and microphone. However, it gives | trust Dr. Evil to access our camera and microphone. However, it gives | |||
the user an opportunity to determine whether he wishes to trust | the user an opportunity to determine whether he wishes to trust | |||
Dr. Evil or not; after all, if he desires to contact Dr. Evil (perhaps | Dr. Evil or not; after all, if he desires to contact Dr. Evil (perhaps | |||
to arrange for ransom payment), it's safe to temporarily give him | to arrange for ransom payment), it's safe to temporarily give him | |||
access to the camera and microphone for the purpose of the call, but | access to the camera and microphone for the purpose of the call, but | |||
he doesn't want Dr. Evil to be able to access his camera and | he doesn't want Dr. Evil to be able to access his camera and | |||
microphone other than during the call. The point here is that we must | microphone other than during the call. The point here is that we must | |||
first identify other elements before we can determine whether and how | first identify other elements before we can determine whether and how | |||
much to trust them. Additionally, sometimes we need to identify the | much to trust them. Additionally, sometimes we need to identify the | |||
communicating peer before we know what policies to apply. | communicating peer before we know what policies to apply. | |||
</t> | ||||
</section> | <!-- [rfced] Sections 3.1 and subsequent: Per the "Gender-Specific | |||
Language" section of <https://www.rfc-editor.org/styleguide/part2/>, | ||||
please let us know if we may change these instances of "he," "him," | ||||
and "his" to "they," "them," and "their." | ||||
<section title="Unauthenticated Entities" anchor="sec.proposal.unauthentic | Original: | |||
ated"> | However, it | |||
gives the user an opportunity to determine whether he wishes to trust | ||||
Dr. Evil or not; after all, if he desires to contact Dr. Evil | ||||
(perhaps to arrange for ransom payment), it's safe to temporarily | ||||
give him access to the camera and microphone for the purpose of the | ||||
call, but he doesn't want Dr. Evil to be able to access his camera | ||||
and microphone other than during the call. | ||||
... | ||||
The | ||||
idea behind this type of permissions is that a user might have a | ||||
fairly narrow list of peers he is willing to communicate with, e.g., | ||||
"my mother" rather than "anyone on Facebook". | ||||
... | ||||
Note that this | ||||
does not mean that the IdP might not lie, but that is a | ||||
trustworthiness judgement that the user can make at the time he looks | ||||
at the identity. | ||||
... | ||||
Note that | ||||
this requires user consent in many cases but because the data channel | ||||
does not need consent, he can use that directly. | ||||
... | ||||
Fundamentally, the IdP proxy is just a piece of HTML and JS loaded by | ||||
the browser, so nothing stops a Web attacker from creating their own | ||||
IFRAME, loading the IdP proxy HTML/JS, and requesting a signature | ||||
over his own keys rather than those generated in the browser. --> | ||||
</t> | ||||
</section> | ||||
<section anchor="sec.proposal.unauthenticated" numbered="true" toc="defaul | ||||
t"> | ||||
<name>Unauthenticated Entities</name> | ||||
<t> | <t> | |||
Other than the above entities, we are not generally able to identify | Other than the above entities, we are not generally able to identify | |||
other network elements, thus we cannot trust them. This does not mean | other network elements; thus, we cannot trust them. This does not mea n | |||
that it is not possible to have any interaction with them, but it | that it is not possible to have any interaction with them, but it | |||
means that we must assume that they will behave maliciously and design | means that we must assume that they will behave maliciously and design | |||
a system which is secure even if they do so. | a system which is secure even if they do so. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- Not layered ? --> | <section anchor="sec.proposal.overview" numbered="true" toc="default"> | |||
<name>Overview</name> | ||||
<!-- [rfced] Section 4: We found these comments in the original | ||||
approved XML file. Were these items resolved? | ||||
Original: | ||||
</section> | ||||
<!- - Not layered ? - -> | ||||
<section title="Overview" anchor="sec.proposal.overview"> | <section title="Overview" anchor="sec.proposal.overview"> | |||
<!-- TODO: Federated --> | <!- - TODO: Federated - -> --> | |||
<t> | <t> | |||
This section describes a typical WebRTC session and shows how the | This section describes a typical WebRTC session and shows how the | |||
various security elements interact and what guarantees are provided to | various security elements interact and what guarantees are provided to | |||
the user. The example in this section is a "best case" scenario in which | the user. The example in this section is a "best case" scenario in which | |||
we provide the maximal amount of user authentication and media privacy | we provide the maximal amount of user authentication and media privacy | |||
with the minimal level of trust in the calling service. Simpler versions | with the minimal level of trust in the calling service. Simpler versions | |||
with lower levels of security are also possible and are noted in the | with lower levels of security are also possible and are noted in the | |||
text where applicable. It's also important to recognize the tension | text where applicable. It's also important to recognize the tension | |||
between security (or performance) and privacy. The example shown here is | between security (or performance) and privacy. The example shown here is | |||
aimed towards settings where we are more concerned about secure calling | aimed towards settings where we are more concerned about secure calling | |||
than about privacy, but as we shall see, there are settings where one | than about privacy, but as we shall see, there are settings where one | |||
might wish to make different tradeoffs--this architecture is still | might wish to make different trade&nbhy;offs -- this architecture is sti ll | |||
compatible with those settings. | compatible with those settings. | |||
</t> | </t> | |||
<t> | <t> | |||
For the purposes of this example, we assume the topology shown in the | For the purposes of this example, we assume the topology shown in the | |||
figures below. This topology is derived from the topology shown in <xref | figures below. This topology is derived from the topology shown in <xref | |||
target="fig.simple"/>, but separates Alice and Bob's identities from the | target="fig.simple" format="default"/>, but separates Alice's and Bob's identit | |||
ies from the | ||||
process of signaling. Specifically, Alice and Bob have relationships | process of signaling. Specifically, Alice and Bob have relationships | |||
with some Identity Provider (IdP) that supports a protocol (such as | with some Identity Provider (IdP) that supports a protocol (such as | |||
OpenID Connect) that can be used to demonstrate their identity to | OpenID Connect) that can be used to demonstrate their identity to | |||
other parties. For instance, Alice might have an account with a social | other parties. For instance, Alice might have an account with a social | |||
network which she can then use to authenticate to other web sites | network which she can then use to authenticate to other Web sites | |||
without explicitly having an account with those sites; this is a fairly | without explicitly having an account with those sites; this is a fairly | |||
conventional pattern on the Web. <xref | conventional pattern on the Web. <xref target="sec.trust-relations | |||
target="sec.trust-relationships"/> provides an overview of Identity | hips" format="default"/> provides an overview of Identity | |||
Providers and the relevant terminology. Alice and Bob might have | Providers and the relevant terminology. Alice and Bob might have | |||
relationships with different IdPs as well. | relationships with different IdPs as well. | |||
</t> | </t> | |||
<t> | <t> | |||
This separation of identity provision and signaling isn't particularly | This separation of identity provision and signaling isn't particularly | |||
important in "closed world" cases where Alice and Bob are users on the | important in "closed world" cases where Alice and Bob are users on the | |||
same social network and have identities based on that domain (<xref | same social network and have identities based on that domain (<xref targ | |||
target="fig.proposal.idp"/>). However, there are important settings wher | et="fig.proposal.idp" format="default"/>). However, there are important settings | |||
e | where | |||
that is not the case, such as federation (calls from one domain to | that is not the case, such as federation (calls from one domain to | |||
another; <xref target="fig.proposal-federated.idp"/>) and calling on | another; see <xref target="fig.proposal-federated.idp" format="default"/ >) and calling on | |||
untrusted sites, such as where two users who have a relationship via a | untrusted sites, such as where two users who have a relationship via a | |||
given social network want to call each other on another, untrusted, | given social network want to call each other on another, untrusted, | |||
site, such as a poker site. | site, such as a poker site. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that the servers themselves are also authenticated by an external | Note that the servers themselves are also authenticated by an external | |||
identity service, the SSL/TLS certificate infrastructure (not shown). | identity service, the SSL/TLS certificate infrastructure (not shown). | |||
As is conventional in the Web, all identities are ultimately rooted in | As is conventional in the Web, all identities are ultimately rooted in | |||
that system. For instance, when an IdP makes an identity assertion, the | that system. For instance, when an IdP makes an identity assertion, the | |||
Relying Party consuming that assertion is able to verify because it is | Relying Party consuming that assertion is able to verify because it is | |||
able to connect to the IdP via HTTPS. | able to connect to the IdP via HTTPS. | |||
</t> | </t> | |||
<figure title="A call with IdP-based identity" anchor="fig.proposal.idp"> | <figure anchor="fig.proposal.idp"> | |||
<artwork><![CDATA[ | <name>A Call with IdP-Based Identity</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
+----------------+ | +----------------+ | |||
| | | | | | |||
| Signaling | | | Signaling | | |||
| Server | | | Server | | |||
| | | | | | |||
+----------------+ | +----------------+ | |||
^ ^ | ^ ^ | |||
/ \ | / \ | |||
HTTPS / \ HTTPS | HTTPS / \ HTTPS | |||
/ \ | / \ | |||
skipping to change at line 325 ¶ | skipping to change at line 317 ¶ | |||
Alice | Browser |<---------->| Browser | Bob | Alice | Browser |<---------->| Browser | Bob | |||
| | (DTLS+SRTP)| | | | | (DTLS+SRTP)| | | |||
+-----------+ +-----------+ | +-----------+ +-----------+ | |||
^ ^--+ +--^ ^ | ^ ^--+ +--^ ^ | |||
| | | | | | | | | | |||
v | | v | v | | v | |||
+-----------+ | | +-----------+ | +-----------+ | | +-----------+ | |||
| |<--------+ | | | | |<--------+ | | | |||
| IdP1 | | | IdP2 | | | IdP1 | | | IdP2 | | |||
| | +------->| | | | | +------->| | | |||
+-----------+ +-----------+ | +-----------+ +-----------+ ]]></artwork> | |||
]]></artwork> | ||||
</figure> | </figure> | |||
<t> | <t> | |||
<xref target="fig.proposal-federated.idp"/> shows essentially the same | <xref target="fig.proposal-federated.idp" format="default"/> shows essen tially the same | |||
calling scenario but with a call between two separate domains (i.e., a | calling scenario but with a call between two separate domains (i.e., a | |||
federated case), as in <xref target="fig.multidomain"/>. As mentioned | federated case), as in <xref target="fig.multidomain" format="default"/> | |||
above, the domains communicate by some unspecified protocol and | . As mentioned | |||
above, the domains communicate by some unspecified protocol, and | ||||
providing separate signaling and identity allows for calls to be | providing separate signaling and identity allows for calls to be | |||
authenticated regardless of the details of the inter-domain protocol. | authenticated regardless of the details of the inter-domain protocol. | |||
</t> | </t> | |||
<figure title="A federated call with IdP-based identity" anchor="fig.propo | <figure anchor="fig.proposal-federated.idp"> | |||
sal-federated.idp"> | <name>A Federated Call with IdP-Based Identity</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
+----------------+ Unspecified +----------------+ | +----------------+ Unspecified +----------------+ | |||
| | protocol | | | | | protocol | | | |||
| Signaling |<----------------->| Signaling | | | Signaling |<----------------->| Signaling | | |||
| Server | (SIP, XMPP, ...) | Server | | | Server | (SIP, XMPP, ...) | Server | | |||
| | | | | | | | | | |||
+----------------+ +----------------+ | +----------------+ +----------------+ | |||
^ ^ | ^ ^ | |||
| | | | | | |||
HTTPS | | HTTPS | HTTPS | | HTTPS | |||
| | | | | | |||
skipping to change at line 363 ¶ | skipping to change at line 355 ¶ | |||
Alice | Browser |<--------------------------->| Browser | Bob | Alice | Browser |<--------------------------->| Browser | Bob | |||
| | DTLS+SRTP | | | | | DTLS+SRTP | | | |||
+-----------+ +-----------+ | +-----------+ +-----------+ | |||
^ ^--+ +--^ ^ | ^ ^--+ +--^ ^ | |||
| | | | | | | | | | |||
v | | v | v | | v | |||
+-----------+ | | +-----------+ | +-----------+ | | +-----------+ | |||
| |<-------------------------+ | | | | |<-------------------------+ | | | |||
| IdP1 | | | IdP2 | | | IdP1 | | | IdP2 | | |||
| | +------------------------>| | | | | +------------------------>| | | |||
+-----------+ +-----------+ | +-----------+ +-----------+ ]]></artwork> | |||
]]></artwork> | ||||
</figure> | </figure> | |||
<section numbered="true" toc="default"> | ||||
<section title="Initial Signaling"> | <name>Initial Signaling</name> | |||
<t> | <t> | |||
For simplicity, assume the topology in <xref | For simplicity, assume the topology in <xref target="fig.proposal.idp" | |||
target="fig.proposal.idp"/>. Alice and Bob are both users of a common | format="default"/>. Alice and Bob are both users of a common | |||
calling service; they both have approved the calling service to make | calling service; they both have approved the calling service to make | |||
calls (we defer the discussion of device access permissions until | calls (we defer the discussion of device access permissions until | |||
later). They are both connected to the calling service via HTTPS and | later). They are both connected to the calling service via HTTPS and | |||
so know the origin with some level of confidence. They also have | so know the origin with some level of confidence. They also have | |||
accounts with some identity provider. This sort of identity service | accounts with some identity provider. This sort of identity service | |||
is becoming increasingly common in the Web environment (with technolog ies | is becoming increasingly common in the Web environment (with technolog ies | |||
such as Federated Google Login, Facebook Connect, OAuth, | such as Federated Google Login, Facebook Connect, OAuth, | |||
OpenID, WebFinger), and is often provided as a side effect service of | OpenID, WebFinger), and is often provided as a side effect service of | |||
a user's ordinary accounts with some service. In this example, we show | a user's ordinary accounts with some service. In this example, we show | |||
Alice and Bob using a separate identity service, though the identity | Alice and Bob using a separate identity service, though the identity | |||
service may be the same entity as the calling service or there may be | service may be the same entity as the calling service or there may be | |||
no identity service at all. | no identity service at all. | |||
</t> | </t> | |||
<t> | <t> | |||
Alice is logged onto the calling service and decides to call Bob. She | Alice is logged onto the calling service and decides to call Bob. &nbs p;She | |||
can see from the calling service that he is online and the calling | can see from the calling service that he is online and the calling | |||
service presents a JS UI in the form of a button next to Bob's name | service presents a JS UI in the form of a button next to Bob's name | |||
which says "Call". Alice clicks the button, which initiates a JS | which says "Call". Alice clicks the button, which initiates a JS | |||
callback that instantiates a PeerConnection object. This does not | callback that instantiates a PeerConnection object. This does not | |||
require a security check: JS from any origin is allowed to get this | require a security check: JS from any origin is allowed to get this | |||
far. | far. | |||
</t> | </t> | |||
<t> | <t> | |||
Once the PeerConnection is created, the calling service JS needs to | Once the PeerConnection is created, the calling service JS needs to | |||
set up some media. Because this is an audio/video call, it creates a | set up some media. Because this is an audio/video call, it creates a | |||
MediaStream with two MediaStreamTracks, one connected to an audio | MediaStream with two MediaStreamTracks, one connected to an audio | |||
input and one connected to a video input. At this point the first | input and one connected to a video input. At this point, the first | |||
security check is required: untrusted origins are not allowed to | security check is required: untrusted origins are not allowed to | |||
access the camera and microphone, so the browser prompts Alice for | access the camera and microphone, so the browser prompts Alice for | |||
permission. | permission. | |||
</t> | </t> | |||
<t> | <t> | |||
In the current W3C API, once some streams have been added, Alice's | In the current W3C API, once some streams have been added, Alice's | |||
browser + JS generates a signaling message <xref | browser + JS generates a signaling message <xref target="RFC8829" form | |||
target="I-D.ietf-rtcweb-jsep"/> containing: | at="default"/> containing: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li> | |||
<t> | ||||
Media channel information | Media channel information | |||
</t> | </li> | |||
<t> | <li> | |||
Interactive Connectivity Establishment (ICE) <xref | Interactive Connectivity Establishment (ICE) <xref target="RFC8445 | |||
target="RFC8445"/> candidates | " format="default"/> candidates | |||
</t> | </li> | |||
<t> | <li> | |||
A fingerprint attribute binding the communication to a key pair | A "fingerprint" attribute binding the communication to a key pair | |||
<xref target="RFC5763"/>. Note that this key may simply be | <xref target="RFC5763" format="default"/>. Note that this key may | |||
simply be | ||||
ephemerally generated for this call or specific to this domain, | ephemerally generated for this call or specific to this domain, | |||
and Alice may have a large number of such keys. | and Alice may have a large number of such keys. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
<t> | <t> | |||
Prior to sending out the signaling message, the PeerConnection code | Prior to sending out the signaling message, the PeerConnection code | |||
contacts the identity service and obtains an assertion binding Alice's | contacts the identity service and obtains an assertion binding Alice's | |||
identity to her fingerprint. The exact details depend on the identity | identity to her fingerprint. The exact details depend on the identity | |||
service (though as discussed in <xref target="sec.generic.idp"/> | service (though as discussed in <xref target="sec.generic.idp" format= "default"/> | |||
PeerConnection can be agnostic to them), but for now it's easiest to | PeerConnection can be agnostic to them), but for now it's easiest to | |||
think of as an OAuth token. The assertion may bind other | think of as an OAuth token. The assertion may bind other | |||
information to the identity besides the fingerprint, but at minimum it | information to the identity besides the fingerprint, but at minimum it | |||
needs to bind the fingerprint. | needs to bind the fingerprint. | |||
</t> | </t> | |||
<t> | <t> | |||
This message is sent to the signaling server, e.g., by XMLHttpRequest | This message is sent to the signaling server, e.g., by XMLHttpRequest | |||
<xref target="XmlHttpRequest"/> or by WebSockets <xref | <xref target="XmlHttpRequest" format="default"/> or by WebSockets | |||
target="RFC6455"/>, over TLS <xref target="RFC5246"/>. | <xref target="RFC6455" format="default"/>, over TLS <xref | |||
target="RFC5246" format="default"/>. | ||||
<!-- [rfced] Section 4.1: Because RFC 5246 has been obsoleted by | ||||
RFC 8446, would you like to (1) cite and list RFC 8446 instead, | ||||
(2) list both documents, or (3) leave the obsolete citation in place | ||||
(i.e., no changes)? | ||||
Original: | ||||
This message is sent to the signaling server, e.g., by XMLHttpRequest | ||||
[XmlHttpRequest] or by WebSockets [RFC6455], over TLS [RFC5246]. --> | ||||
The signaling server processes the message from Alice's browser, | The signaling server processes the message from Alice's browser, | |||
determines that this is a call to Bob and sends a signaling message to | determines that this is a call to Bob, and sends a signaling message t o | |||
Bob's browser (again, the format is currently undefined). The JS on | Bob's browser (again, the format is currently undefined). The JS on | |||
Bob's browser processes it, and alerts Bob to the incoming call and to | Bob's browser processes it, and alerts Bob to the incoming call and to | |||
Alice's identity. In this case, Alice has provided an identity | Alice's identity. In this case, Alice has provided an identity | |||
assertion and so Bob's browser contacts Alice's identity provider | assertion and so Bob's browser contacts Alice's identity provider | |||
(again, this is done in a generic way so the browser has no specific | (again, this is done in a generic way so the browser has no specific | |||
knowledge of the IdP) to verify the assertion. It is also possible | knowledge of the IdP) to verify the assertion. It is also possible | |||
to have IdPs with which the browser has a specific trustrelationship, | to have IdPs with which the browser has a specific trust relationship, | |||
as described in <xref target="sec.trust-relationships"/>. | as described in <xref target="sec.trust-relationships" format="default | |||
"/>. | ||||
This allows the browser | This allows the browser | |||
to display a trusted element in the browser chrome indicating that a | to display a trusted element in the browser chrome indicating that a | |||
call is coming in from Alice. If Alice is in Bob's address book, then | call is coming in from Alice. If Alice is in Bob's address book, then | |||
this interface might also include her real name, a picture, etc. The | this interface might also include her real name, a picture, etc. The | |||
calling site will also provide some user interface element (e.g., a | calling site will also provide some user interface element (e.g., a | |||
button) to allow Bob to answer the call, though this is most likely | button) to allow Bob to answer the call, though this is most likely | |||
not part of the trusted UI. | not part of the trusted UI. | |||
</t> | </t> | |||
<t> | <t> | |||
If Bob agrees a PeerConnection is instantiated with the message from | If Bob agrees, a PeerConnection is instantiated with the message from | |||
Alice's side. Then, a similar process occurs as on Alice's browser: | Alice's side. Then, a similar process occurs as on Alice's browser: | |||
Bob's browser prompts him for device permission, the media streams are | Bob's browser prompts him for device permission, the media streams are | |||
created, and a return signaling message containing media information, | created, and a return signaling message containing media information, | |||
ICE candidates, and a fingerprint is sent back to Alice via the | ICE candidates, and a fingerprint is sent back to Alice via the | |||
signaling service. If Bob has a relationship with an IdP, the message | signaling service. If Bob has a relationship with an IdP, the message | |||
will also come with an identity assertion. | will also come with an identity assertion. | |||
</t> | </t> | |||
<t> | <t> | |||
At this point, Alice and Bob each know that the other party wants to | At this point, Alice and Bob each know that the other party wants to | |||
have a secure call with them. Based purely on the interface provided | have a secure call with them. Based purely on the interface provided | |||
by the signaling server, they know that the signaling server claims | by the signaling server, they know that the signaling server claims | |||
that the call is from Alice to Bob. This level of security is provided | that the call is from Alice to Bob. This level of security is pr ovided | |||
merely by having the fingerprint in the message and having that | merely by having the fingerprint in the message and having that | |||
message received securely from the signaling server. Because the far | message received securely from the signaling server. Because the far | |||
end sent an identity assertion along with their message, they know | end sent an identity assertion along with their message, they know | |||
that this is verifiable from the IdP as well. Note that if the call is | that this is verifiable from the IdP as well. Note that if the call is | |||
federated, as shown in <xref target="fig.proposal-federated.idp"/> | federated, as shown in <xref target="fig.proposal-federated.idp" forma t="default"/>, | |||
then Alice is able to verify Bob's identity in a way that is not | then Alice is able to verify Bob's identity in a way that is not | |||
mediated by either her signaling server or Bob's. Rather, she verifies | mediated by either her signaling server or Bob's. Rather, she verifies | |||
it directly with Bob's IdP. | it directly with Bob's IdP. | |||
</t> | </t> | |||
<t> | <t> | |||
Of course, the call works perfectly well if either Alice or Bob | Of course, the call works perfectly well if either Alice or Bob | |||
doesn't have a relationship with an IdP; they just get a lower level | doesn't have a relationship with an IdP; they just get a lower level | |||
of assurance. I.e., they simply have whatever information their | of assurance. That is, they simply have whatever information their | |||
calling site claims about the caller/callee's identity. Moreover, | calling site claims about the caller/callee's identity. Moreover, | |||
Alice might wish to make an anonymous call through an anonymous | Alice might wish to make an anonymous call through an anonymous | |||
calling site, in which case she would of course just not provide any | calling site, in which case she would of course just not provide any | |||
identity assertion and the calling site would mask her identity from | identity assertion and the calling site would mask her identity from | |||
Bob. | Bob. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Media Consent Verification"> | <name>Media Consent Verification</name> | |||
<t> | <t> | |||
As described in (<xref target="I-D.ietf-rtcweb-security"/>; Section | As described in <xref target="RFC8826" sectionFormat="comma" | |||
4.2) media consent verification is provided via ICE. Thus, Alice and | section="4.2"/>, media consent verification is provided via ICE. | |||
Thus, Alice and | ||||
Bob perform ICE checks with each other. At the completion of these | Bob perform ICE checks with each other. At the completion of these | |||
checks, they are ready to send non-ICE data. | checks, they are ready to send non-ICE data. | |||
</t> | </t> | |||
<t> | <t> | |||
At this point, Alice knows that (a) Bob (assuming he is verified via | At this point, Alice knows that (a) Bob (assuming he is verified via | |||
his IdP) or someone else who the signaling service is claiming is Bob | his IdP) or someone else who the signaling service is claiming is Bob | |||
is willing to exchange traffic with her and (b) that either Bob is at | is willing to exchange traffic with her and (b) either Bob is at | |||
the IP address which she has verified via ICE or there is an attacker | the IP address which she has verified via ICE or there is an attacker | |||
who is on-path to that IP address detouring the traffic. Note that it | who is on-path to that IP address detouring the traffic. Note that it | |||
is not possible for an attacker who is on-path between Alice and Bob | is not possible for an attacker who is on-path between Alice and Bob | |||
but not attached to the signaling service to spoof these checks | but not attached to the signaling service to spoof these checks | |||
because they do not have the ICE credentials. Bob has the same | because they do not have the ICE credentials. Bob has the same | |||
security guarantees with respect to Alice. | security guarantees with respect to Alice. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="DTLS Handshake"> | <name>DTLS Handshake</name> | |||
<t> | <t> | |||
Once the requisite ICE checks have completed, Alice and Bob can set | Once the requisite ICE checks have completed, Alice and Bob can set | |||
up a secure channel or channels. This is performed via DTLS <xref targ | up a secure channel or channels. This is performed via DTLS <xref targ | |||
et="RFC6347"/> | et="RFC6347" format="default"/> | |||
and DTLS-SRTP <xref target="RFC5763"/> keying for SRTP | and DTLS-SRTP <xref target="RFC5763" format="default"/> keying for SRT | |||
<xref target="RFC3711"/> for the media channel and SCTP over DTLS | P | |||
<xref target="RFC8261"/> for data | <xref target="RFC3711" format="default"/> for the media channel and | |||
the Stream Control Transmission Protocol (SCTP) over DTLS | ||||
<xref target="RFC8261" format="default"/> for data | ||||
channels. Specifically, Alice and Bob perform a DTLS handshake on | channels. Specifically, Alice and Bob perform a DTLS handshake on | |||
every component which has been established by ICE. The total number of | every component which has been established by ICE. The total number of | |||
channels depends on the amount of muxing; in the most likely case we | channels depends on the amount of muxing; in the most likely case, we | |||
are using both RTP/RTCP mux and muxing multiple media streams on the | are using both RTP/RTCP mux and muxing multiple media streams on the | |||
same channel, in which case there is only one DTLS handshake. Once the | same channel, in which case there is only one DTLS handshake. Once the | |||
DTLS handshake has completed, the keys are exported <xref | DTLS handshake has completed, the keys are exported <xref target="RFC5 | |||
target="RFC5705"/> and used to key SRTP for the media channels. | 705" format="default"/> and used to key SRTP for the media channels. | |||
</t> | </t> | |||
<t> | <t> | |||
At this point, Alice and Bob know that they share a set of secure data | At this point, Alice and Bob know that they share a set of secure data | |||
and/or media channels with keys which are not known to any third-party | and/or media channels with keys which are not known to any third-party | |||
attacker. If Alice and Bob authenticated via their IdPs, then they | attacker. If Alice and Bob authenticated via their IdPs, then they | |||
also know that the signaling service is not mounting a | also know that the signaling service is not mounting a | |||
man-in-the-middle attack on their traffic. Even if they do not use an | man-in-the-middle attack on their traffic. Even if they do not use an | |||
IdP, as long as they have minimal trust in the signaling service not | IdP, as long as they have minimal trust in the signaling service not | |||
to perform a man-in-the-middle attack, they know that their | to perform a man-in-the-middle attack, they know that their | |||
communications are secure against the signaling service as well (i.e., | communications are secure against the signaling service as well (i.e., | |||
skipping to change at line 539 ¶ | skipping to change at line 536 ¶ | |||
and/or media channels with keys which are not known to any third-party | and/or media channels with keys which are not known to any third-party | |||
attacker. If Alice and Bob authenticated via their IdPs, then they | attacker. If Alice and Bob authenticated via their IdPs, then they | |||
also know that the signaling service is not mounting a | also know that the signaling service is not mounting a | |||
man-in-the-middle attack on their traffic. Even if they do not use an | man-in-the-middle attack on their traffic. Even if they do not use an | |||
IdP, as long as they have minimal trust in the signaling service not | IdP, as long as they have minimal trust in the signaling service not | |||
to perform a man-in-the-middle attack, they know that their | to perform a man-in-the-middle attack, they know that their | |||
communications are secure against the signaling service as well (i.e., | communications are secure against the signaling service as well (i.e., | |||
that the signaling service cannot mount a passive attack on the | that the signaling service cannot mount a passive attack on the | |||
communications). | communications). | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Communications and Consent Freshness"> | <name>Communications and Consent Freshness</name> | |||
<t> | <t> | |||
From a security perspective, everything from here on in is a little | From a security perspective, everything from here on in is a little | |||
anticlimactic: Alice and Bob exchange data protected by the keys | anticlimactic: Alice and Bob exchange data protected by the keys | |||
negotiated by DTLS. Because of the security guarantees discussed in | negotiated by DTLS. Because of the security guarantees discussed in | |||
the previous sections, they know that the communications are encrypted | the previous sections, they know that the communications are encrypted | |||
and authenticated. | and authenticated. | |||
</t> | </t> | |||
<t> | <t> | |||
The one remaining security property we need to establish is "consent | The one remaining security property we need to establish is "consent | |||
freshness", i.e., allowing Alice to verify that Bob is still prepared | freshness", i.e., allowing Alice to verify that Bob is still prepared | |||
to receive her communications so that Alice does not continue to send | to receive her communications so that Alice does not continue to send | |||
large traffic volumes to entities which went abruptly offline. ICE | large traffic volumes to entities which went abruptly offline. ICE | |||
specifies periodic STUN keepalives but only if media is not flowing. | specifies periodic Session Traversal Utilities for NAT (STUN) keepaliv es but only if media is not flowing. | |||
Because the consent issue is more difficult here, we require WebRTC | Because the consent issue is more difficult here, we require WebRTC | |||
implementations to periodically send keepalives. As described in | implementations to periodically send keepalives. As described in | |||
Section 5.3, these keepalives MUST be based on the consent freshness | Section 5.3, these keepalives <bcp14>MUST</bcp14> be based on the cons | |||
mechanism specified in <xref target="RFC7675"/>. If a | ent freshness | |||
mechanism specified in <xref target="RFC7675" format="default"/>. | ||||
<!-- [rfced] Section 4.4: This document does not have a Section 5.3. | ||||
Please let us know which section should be cited here. | ||||
Original: | ||||
As described in | ||||
Section 5.3, these keepalives MUST be based on the consent freshness | ||||
mechanism specified in [RFC7675]. --> | ||||
If a | ||||
keepalive fails and no new ICE channels can be established, then the | keepalive fails and no new ICE channels can be established, then the | |||
session is terminated. | session is terminated. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.sdp-id-attr" numbered="true" toc="default"> | ||||
<section title="SDP Identity Attribute" anchor="sec.sdp-id-attr"> | <name>SDP Identity Attribute</name> | |||
<t> | <t> | |||
The SDP 'identity' attribute is a session-level attribute that | The SDP "identity" attribute is a session-level attribute that | |||
is used by an endpoint to convey its identity assertion to its | is used by an endpoint to convey its identity assertion to its | |||
peer. The identity assertion value is encoded as Base-64, as described | peer. The identity-assertion value is encoded as base64, as described | |||
in Section 4 of <xref target="RFC4648"/>. | in <xref target="RFC4648" sectionFormat="of" section="4"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
The procedures in this section are based on the assumption | The procedures in this section are based on the assumption | |||
that the identity assertion of an endpoint is bound to the | that the identity assertion of an endpoint is bound to the | |||
fingerprints of the endpoint. This does not preclude the definition of | fingerprints of the endpoint. This does not preclude the definition of | |||
alternative means of binding an assertion to the endpoint, but such | alternative means of binding an assertion to the endpoint, but such | |||
means are outside the scope of this specification. | means are outside the scope of this specification. | |||
</t> | </t> | |||
<t> | <t> | |||
The semantics of multiple 'identity' attributes within an | The semantics of multiple "identity" attributes within an | |||
offer or answer are undefined. Implementations SHOULD only include a | offer or answer are undefined. Implementations <bcp14>SHOULD</bcp14> on | |||
single 'identity' attribute in an offer or answer and relying parties | ly include a | |||
MAY elect to ignore all but the first 'identity' attribute. | single "identity" attribute in an offer or answer, and relying parties | |||
</t> | <bcp14>MAY</bcp14> elect to ignore all but the first "identity" attribut | |||
<t> | e. | |||
<list style="hanging"> | ||||
<t hangText="Name:">identity</t> | ||||
<t hangText="Value:">identity-assertion</t> | ||||
<t hangText="Usage Level:">session</t> | ||||
<t hangText="Charset Dependent:">no</t> | ||||
<t hangText="Default Value:">N/A</t> | ||||
<t hangText="Name:">identity</t> | ||||
</list> | ||||
</t> | </t> | |||
<figure> | <dl newline="false" spacing="normal"> | |||
<dt>Name:</dt> | ||||
<dd>identity</dd> | ||||
<dt>Value:</dt> | ||||
<dd>identity-assertion</dd> | ||||
<dt>Usage Level:</dt> | ||||
<dd>session</dd> | ||||
<dt>Charset Dependent:</dt> | ||||
<dd>no</dd> | ||||
<dt>Default Value:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Name:</dt> | ||||
<dd>identity</dd> | ||||
</dl> | ||||
<!-- [rfced] Section 5: Are both "Name: identity" entries needed in | ||||
this list? | ||||
Original: | ||||
Name: identity | ||||
Value: identity-assertion | ||||
Usage Level: session | ||||
Charset Dependent: no | ||||
Default Value: N/A | ||||
Name: identity --> | ||||
<t>Syntax:</t> | ||||
<sourcecode name="abnf-1" type="abnf" ><![CDATA[ | ||||
identity-assertion = identity-assertion-value | ||||
*(SP identity-extension) | ||||
identity-assertion-value = base64 | ||||
identity-extension = extension-name [ "=" extension-value ] | ||||
extension-name = token | ||||
extension-value = 1*(%x01-09 / %x0b-0c / %x0e-3a / %x3c-ff) | ||||
; byte-string from [RFC4566] | ||||
<ALPHA and DIGIT as defined in [RFC4566]> | ||||
<base64 as defined in [RFC4566]> | ||||
]]></sourcecode> | ||||
<t>Example:</t> | ||||
<!-- [rfced] Section 5: We have split the <artwork> into 2 pieces: the | ||||
first has been tagged as <sourcecode type="abnf"> and the second as | ||||
<sourcecode type="sdp" >. See | ||||
<https://www.rfc-editor.org/materials/sourcecode-types.txt> for the preferred | ||||
list of "type" attributes. Please review and let us know if ay updates are | ||||
needed. | ||||
For the definitions of ALPHA and DIGIT, RFC 4566 refers to RFC 4234, which has | ||||
been obsoleted by RFC 5234. Should this document reference RFC 5234 for ALPHA | ||||
and DIGIT? Also, RFC 4566 will soon be obsoleted by RFC-to-be 8866 | ||||
<draft-ietf-mmusic-rfc4566bis-37>; should this document be updated to point to | ||||
RFC 8866? | ||||
Original: | ||||
<artwork type="inline"><![CDATA[ | <artwork type="inline"><![CDATA[ | |||
Syntax: | Syntax: | |||
identity-assertion = identity-assertion-value | identity-assertion = identity-assertion-value | |||
*(SP identity-extension) | *(SP identity-extension) | |||
identity-assertion-value = base64 | identity-assertion-value = base64 | |||
identity-extension = extension-name [ "=" extension-value ] | identity-extension = extension-name [ "=" extension-value ] | |||
extension-name = token | extension-name = token | |||
extension-value = 1*(%x01-09 / %x0b-0c / %x0e-3a / %x3c-ff) | extension-value = 1*(%x01-09 / %x0b-0c / %x0e-3a / %x3c-ff) | |||
; byte-string from [RFC4566] | ; byte-string from [RFC4566] | |||
skipping to change at line 618 ¶ | skipping to change at line 674 ¶ | |||
<ALPHA and DIGIT as defined in [RFC4566]> | <ALPHA and DIGIT as defined in [RFC4566]> | |||
<base64 as defined in [RFC4566]> | <base64 as defined in [RFC4566]> | |||
Example: | Example: | |||
a=identity:\ | a=identity:\ | |||
eyJpZHAiOnsiZG9tYWluIjoiZXhhbXBsZS5vcmciLCJwcm90b2NvbCI6ImJvZ3Vz\ | eyJpZHAiOnsiZG9tYWluIjoiZXhhbXBsZS5vcmciLCJwcm90b2NvbCI6ImJvZ3Vz\ | |||
In0sImFzc2VydGlvbiI6IntcImlkZW50aXR5XCI6XCJib2JAZXhhbXBsZS5vcmdc\ | In0sImFzc2VydGlvbiI6IntcImlkZW50aXR5XCI6XCJib2JAZXhhbXBsZS5vcmdc\ | |||
IixcImNvbnRlbnRzXCI6XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6XCIsXCJz\ | IixcImNvbnRlbnRzXCI6XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6XCIsXCJz\ | |||
aWduYXR1cmVcIjpcIjAxMDIwMzA0MDUwNlwifSJ9 | aWduYXR1cmVcIjpcIjAxMDIwMzA0MDUwNlwifSJ9 | |||
--> | ||||
Note that long lines in the example are folded to meet the column | <sourcecode name="sdp-1" type="sdp" ><![CDATA[ | |||
width constraints of this document; the backslash ("\") at the end of | a=identity:\ | |||
a line, the carriage return that follows, and whitespace shall be ignored. | eyJpZHAiOnsiZG9tYWluIjoiZXhhbXBsZS5vcmciLCJwcm90b2NvbCI6ImJvZ3Vz\ | |||
In0sImFzc2VydGlvbiI6IntcImlkZW50aXR5XCI6XCJib2JAZXhhbXBsZS5vcmdc\ | ||||
IixcImNvbnRlbnRzXCI6XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6XCIsXCJz\ | ||||
aWduYXR1cmVcIjpcIjAxMDIwMzA0MDUwNlwifSJ9 ]]></sourcecode> | ||||
]]></artwork> | <aside><t>Note that long lines in the example are folded to meet the column | |||
</figure> | width constraints of this document; the backslash ("\") at the end of | |||
<t> | a line, the carriage return that follows, and whitespace shall be ignored.</t> | |||
</aside> | ||||
<t> | ||||
This specification does not define any extensions for the attribute. | This specification does not define any extensions for the attribute. | |||
</t> | </t> | |||
<t> | <t> | |||
The identity-assertion value is a JSON <xref target="RFC8259"/> encoded | The identity-assertion value is a JSON encoded string | |||
string. The JSON object | <xref target="RFC8259" format="default"/>. The JSON object | |||
contains two keys: "assertion" and "idp". The <spanx style="verb">asser | contains two keys: "assertion" and "idp". The "assertion" key value con | |||
tion</spanx> key value contains | tains | |||
an opaque string that is consumed by the IdP. The <spanx style="verb">i | an opaque string that is consumed by the IdP. The "idp" key value conta | |||
dp</spanx> key value contains a | ins a | |||
dictionary with one or two further values that identify the IdP. See | dictionary with one or two further values that identify the IdP. See | |||
<xref target="sec.request-assert"/> for more details. | <xref target="sec.request-assert" format="default"/> for more details. | |||
</t> | </t> | |||
<section title="Offer/Answer Considerations" anchor="sec.sdp-id-attr-oa"> | <section anchor="sec.sdp-id-attr-oa" numbered="true" toc="default"> | |||
<t> | <name>Offer/Answer Considerations</name> | |||
This section defines the SDP Offer/Answer <xref target="RFC3264"/> co | ||||
nsiderations for the SDP | <t> | |||
'identity' attribute. | This section defines the SDP offer/answer <xref target="RFC3264" form | |||
</t> | at="default"/> considerations for the SDP | |||
<t> | "identity" attribute. | |||
</t> | ||||
<t> | ||||
Within this section, 'initial offer' refers to the first offer in the | Within this section, 'initial offer' refers to the first offer in the | |||
SDP session that contains an SDP <spanx style="verb">identity</spanx> | SDP session that contains an SDP "identity" attribute. | |||
attribute. | </t> | |||
</t> | <section anchor="sec.sdp-id-attr-oa-inio" numbered="true" toc="default"> | |||
<section title="Generating the Initial SDP Offer" anchor="sec.sdp-id-at | <name>Generating the Initial SDP Offer</name> | |||
tr-oa-inio"> | <t> | |||
<t> | ||||
When an offerer sends an offer, in order to provide its | When an offerer sends an offer, in order to provide its | |||
identity assertion to the peer, it includes an 'identity' attribute i n | identity assertion to the peer, it includes an "identity" attribute i n | |||
the offer. In addition, the offerer includes one or more SDP | the offer. In addition, the offerer includes one or more SDP | |||
'fingerprint' attributes. The 'identity' attribute MUST be bound to | "fingerprint" attributes. The "identity" attribute <bcp14>MUST</bcp1 | |||
all the 'fingerprint' attributes in the session | 4> be bound to | |||
all the "fingerprint" attributes in the session | ||||
description. | description. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Generating of SDP Answer" anchor="sec.sdp-id-attr-oa-an | <section anchor="sec.sdp-id-attr-oa-ansa" numbered="true" toc="default"> | |||
sa"> | <name>Generating an SDP Answer</name> | |||
<t> | <t> | |||
If the answerer elects to include an 'identity' attribute, it follo | If the answerer elects to include an "identity" attribute, it follo | |||
ws | ws | |||
the same steps as those in <xref target="sec.sdp-id-attr-oa-inio"/> | the same steps as those in <xref target="sec.sdp-id-attr-oa-inio" f | |||
. | ormat="default"/>. | |||
The answerer can choose to include or omit an 'identity' attribute | The answerer can choose to include or omit an "identity" attribute | |||
independently, | independently, | |||
regardless of whether the offerer did so. | regardless of whether the offerer did so. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Processing an SDP Offer or Answer" anchor="sec.sdp-id-a | <section anchor="sec.sdp-id-attr-oa-offa" numbered="true" toc="default"> | |||
ttr-oa-offa"> | <name>Processing an SDP Offer or Answer</name> | |||
<t> | <t> | |||
When an endpoint receives an offer or answer that contains an 'iden | When an endpoint receives an offer or answer that contains an "iden | |||
tity' | tity" | |||
attribute, the answerer can use the the attribute information to | attribute, the answerer can use the attribute information to | |||
contact the IdP and verify the identity of the peer. If the identit y | contact the IdP and verify the identity of the peer. If the identit y | |||
requires a third-party IdP as described in <xref target="sec.trust- relationships"/> | requires a third-party IdP as described in <xref target="sec.trust- relationships" format="default"/>, | |||
then that IdP will need to have been specifically configured. | then that IdP will need to have been specifically configured. | |||
If the identity verification fails, the answerer MUST discard the | If the identity verification fails, the answerer <bcp14>MUST</bcp14 > discard the | |||
offer or answer as malformed. | offer or answer as malformed. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Modifying the Session" anchor="sec.sdp-id-attr-oa-modi" | <section anchor="sec.sdp-id-attr-oa-modi" numbered="true" toc="default"> | |||
> | <name>Modifying the Session</name> | |||
<t> | <t> | |||
When modifying a session, if the set of fingerprints is | When modifying a session, if the set of fingerprints is | |||
unchanged, then the sender MAY send the same 'identity' attribute. | unchanged, then the sender <bcp14>MAY</bcp14> send the same "identi | |||
In | ty" attribute. In | |||
this case, the established identity MUST be applied to existing DTL | this case, the established identity <bcp14>MUST</bcp14> be applied | |||
S | to existing DTLS | |||
connections as well as new connections established using one of tho se | connections as well as new connections established using one of tho se | |||
fingerprints. Note that <xref target="I-D.ietf-rtcweb-jsep"/>, Sect | fingerprints. Note that <xref target="RFC8829" sectionFormat="comma | |||
ion | " section="5.2.1"/> requires that each media section use the same set of | |||
5.2.1 requires that each media section use the same set of | ||||
fingerprints for every media section. | fingerprints for every media section. | |||
If a new identity attribute is received, then the receiver MUST | If a new "identity" attribute is received, then the receiver <bcp14 >MUST</bcp14> | |||
apply that identity to all existing connections. | apply that identity to all existing connections. | |||
</t> | </t> | |||
<t> | <t> | |||
If the set of fingerprints changes, then the sender MUST | If the set of fingerprints changes, then the sender <bcp14>MUST</bc | |||
either send a new 'identity' attribute or none at all. | p14> | |||
either send a new "identity" attribute or none at all. | ||||
Because a change in fingerprints also causes a new DTLS | Because a change in fingerprints also causes a new DTLS | |||
connection to be established, the receiver MUST discard | connection to be established, the receiver <bcp14>MUST</bcp14> disc ard | |||
all previously established identities. | all previously established identities. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
</section> | </section> | |||
<section anchor="sec.proposal.detailed" numbered="true" toc="default"> | ||||
<section title="Detailed Technical Description" anchor="sec.proposal.detaile | <name>Detailed Technical Description</name> | |||
d"> | <section anchor="sec.proposal.origin" numbered="true" toc="default"> | |||
<name>Origin and Web Security Issues</name> | ||||
<section title="Origin and Web Security Issues" anchor="sec.proposal.origi | ||||
n"> | ||||
<t> | <t> | |||
The basic unit of permissions for WebRTC is the origin <xref | The basic unit of permissions for WebRTC is the origin <xref target="R | |||
target="RFC6454"/>. Because the security of the origin depends on | FC6454" format="default"/>. Because the security of the origin depends on | |||
being able to authenticate content from that origin, the origin can | being able to authenticate content from that origin, the origin can | |||
only be securely established if data is transferred over HTTPS <xref | only be securely established if data is transferred over HTTPS <xref t | |||
target="RFC2818"/>. Thus, clients MUST treat HTTP and HTTPS origins as | arget="RFC2818" format="default"/>. Thus, clients <bcp14>MUST</bcp14> treat HTTP | |||
different permissions domains. Note: this follows directly from the | and HTTPS origins as | |||
different permissions domains. Note: This follows directly from the | ||||
origin security model and is stated here merely for clarity. | origin security model and is stated here merely for clarity. | |||
</t> | </t> | |||
<t> | <t> | |||
Many web browsers currently forbid by default any active mixed content | Many Web browsers currently forbid by default any active mixed content | |||
on HTTPS pages. That is, when JavaScript is loaded from an HTTP origin | on HTTPS pages. That is, when JavaScript is loaded from an HTTP origin | |||
onto an HTTPS page, an error is displayed and the HTTP content is not | onto an HTTPS page, an error is displayed and the HTTP content is not | |||
executed unless the user overrides the error. Any browser which | executed unless the user overrides the error. Any browser which | |||
enforces such a policy will also not permit access to WebRTC | enforces such a policy will also not permit access to WebRTC | |||
functionality from mixed content pages (because they never display | functionality from mixed content pages (because they never display | |||
mixed content). Browsers which allow active mixed content MUST | mixed content). Browsers which allow active mixed content <bcp14>MUST </bcp14> | |||
nevertheless disable WebRTC functionality in mixed content settings. | nevertheless disable WebRTC functionality in mixed content settings. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that it is possible for a page which was not mixed content to | Note that it is possible for a page that was not mixed content to | |||
become mixed content during the duration of the call. The major risk | become mixed content during the duration of the call. The major risk | |||
here is that the newly arrived insecure JS might redirect media to a | here is that the newly arrived insecure JS might redirect media to a | |||
location controlled by the attacker. Implementations MUST either | location controlled by the attacker. Implementations <bcp14>MUST</bcp 14> either | |||
choose to terminate the call or display a warning at that point. | choose to terminate the call or display a warning at that point. | |||
</t> | </t> | |||
<t> | <t> | |||
Also note that the security architecture depends on the keying materia l | Also note that the security architecture depends on the keying materia l | |||
not being available to move between origins. But, it is assumed that | not being available to move between origins. But it is assumed that | |||
the identity assertion can be passed to anyone that the page cares to. | the identity assertion can be passed to anyone that the page cares to. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.proposal.device.permissions" numbered="true" toc="def | ||||
<section title="Device Permissions Model" anchor="sec.proposal.device.perm | ault"> | |||
issions"> | <name>Device Permissions Model</name> | |||
<t> | <t> | |||
Implementations MUST obtain explicit user consent prior to providing | Implementations <bcp14>MUST</bcp14> obtain explicit user consent prior | |||
access to the camera and/or microphone. Implementations MUST at | to providing | |||
access to the camera and/or microphone. Implementations <bcp14>MUST</b | ||||
cp14> at | ||||
minimum support the following two permissions models for HTTPS | minimum support the following two permissions models for HTTPS | |||
origins. | origins. | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li> | |||
<t> | ||||
Requests for one-time camera/microphone access. | Requests for one-time camera/microphone access. | |||
</t> | </li> | |||
<t> | <li> | |||
Requests for permanent access. | Requests for permanent access. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
<t> | <t> | |||
Because HTTP origins cannot be securely established against network | Because HTTP origins cannot be securely established against network | |||
attackers, implementations MUST refuse all permissions grants for | attackers, implementations <bcp14>MUST</bcp14> refuse all permissions grants for | |||
HTTP origins. | HTTP origins. | |||
</t> | </t> | |||
<t> | <t> | |||
In addition, they SHOULD support requests for access that promise that | In addition, they <bcp14>SHOULD</bcp14> support requests for access th at promise that | |||
media from this grant will be sent to a single communicating peer | media from this grant will be sent to a single communicating peer | |||
(obviously there could be other requests for other peers), eE.g., | (obviously there could be other requests for other peers), e.g., | |||
"Call customerservice@example.org". The semantics of this request are | "Call customerservice@example.org". The semantics of this request are | |||
that the media stream from the camera and microphone will only be | that the media stream from the camera and microphone will only be | |||
routed through a connection which has been cryptographically verified | routed through a connection which has been cryptographically verified | |||
(through the IdP mechanism or an X.509 certificate in the DTLS-SRTP | (through the IdP mechanism or an X.509 certificate in the DTLS-SRTP | |||
handshake) as being associated with the stated identity. Note that it | handshake) as being associated with the stated identity. Note that it | |||
is unlikely that browsers would have X.509 certificates, but servers | is unlikely that browsers would have X.509 certificates, but servers | |||
might. Browsers servicing such requests SHOULD clearly indicate that | might. Browsers servicing such requests <bcp14>SHOULD</bcp14> clearly indicate that | |||
identity to the user when asking for permission. The idea behind this | identity to the user when asking for permission. The idea behind this | |||
type of permissions is that a user might have a fairly narrow list of | type of permissions is that a user might have a fairly narrow list of | |||
peers he is willing to communicate with, e.g., "my mother" rather than | peers he is willing to communicate with, e.g., "my mother" rather than | |||
"anyone on Facebook". Narrow permissions grants allow the browser to | "anyone on Facebook". Narrow permissions grants allow the browser to | |||
do that enforcement. | do that enforcement. | |||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | ||||
<t> | <dt>API Requirement:</dt> | |||
<list style="hanging"> | <dd> | |||
<t hangText="API Requirement:"> | The API <bcp14>MUST</bcp14> provide a mechanism for the requesting | |||
The API MUST provide a mechanism for the requesting JS to | JS to | |||
relinquish the ability to see or modify the media (e.g., via | relinquish the ability to see or modify the media (e.g., via | |||
MediaStream.record()). Combined with secure authentication of the | MediaStream.record()). Combined with secure authentication of the | |||
communicating peer, this allows a user to be sure that the calling | communicating peer, this allows a user to be sure that the calling | |||
site is not accessing or modifying their conversion. | site is not accessing or modifying their conversion. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <dl newline="false" spacing="normal"> | |||
<dt>UI Requirement:</dt> | ||||
<t> | <dd> | |||
<list style="hanging"> | The UI <bcp14>MUST</bcp14> clearly indicate when the user's camera | |||
<t hangText="UI Requirement:"> | and microphone | |||
The UI MUST clearly indicate when the user's camera and microphone | are in use. This indication <bcp14>MUST NOT</bcp14> be suppressib | |||
are in use. This indication MUST NOT be suppressable by the JS | le by the JS | |||
and MUST clearly indicate how to terminate device access, and | and <bcp14>MUST</bcp14> clearly indicate how to terminate device a | |||
ccess, and | ||||
provide a UI means to immediately stop camera/microphone input | provide a UI means to immediately stop camera/microphone input | |||
without the JS being able to prevent it. | without the JS being able to prevent it. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <dl newline="false" spacing="normal"> | |||
<dt>UI Requirement:</dt> | ||||
<t> | <dd> | |||
<list style="hanging"> | If the UI indication of camera/microphone use is displayed in the | |||
<t hangText="UI Requirement:"> | ||||
If the UI indication of camera/microphone use are displayed in the | ||||
browser such that minimizing the browser window would hide the | browser such that minimizing the browser window would hide the | |||
indication, or the JS creating an overlapping window would hide | indication, or the JS creating an overlapping window would hide | |||
the indication, then the browser SHOULD stop camera and microphone | the indication, then the browser <bcp14>SHOULD</bcp14> stop camera | |||
input when the indication is hidden. [Note: this may not be | and microphone | |||
input when the indication is hidden. (Note: This may not be | ||||
necessary in systems that are non-windows-based but that have good | necessary in systems that are non-windows-based but that have good | |||
notifications support, such as phones.] | notifications support, such as phones.) | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | ||||
<t> | <!-- [rfced] Section 6.2: Is the bullet list after this "UI | |||
<list style="symbols"> | Requirement:" list item supposed to be a "sub-list" (as was done, | |||
<t> | for example, after the "UI Requirements:" list item in Section 6.5), | |||
Browsers MUST NOT permit permanent screen or application sharing | or should it remain as a separate list? | |||
Original: | ||||
UI Requirement: If the UI indication of camera/microphone use are | ||||
displayed in the browser such that minimizing the browser window | ||||
would hide the indication, or the JS creating an overlapping | ||||
window would hide the indication, then the browser SHOULD stop | ||||
camera and microphone input when the indication is hidden. [Note: | ||||
this may not be necessary in systems that are non-windows-based | ||||
but that have good notifications support, such as phones.] | ||||
o Browsers MUST NOT permit permanent screen or application sharing | ||||
permissions to be installed as a response to a JS request for | ||||
permissions. Instead, they must require some other user action | ||||
such as a permissions setting or an application install experience | ||||
to grant permission to a site. | ||||
... --> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
Browsers <bcp14>MUST NOT</bcp14> permit permanent screen or applic | ||||
ation sharing | ||||
permissions to be installed as a response to a JS request for | permissions to be installed as a response to a JS request for | |||
permissions. Instead, they must require some other user action | permissions. Instead, they must require some other user action | |||
such as a permissions setting or an application install experience | such as a permissions setting or an application install experience | |||
to grant permission to a site. | to grant permission to a site. | |||
</t> | </li> | |||
<t> | <li> | |||
Browsers MUST provide a separate dialog request for | Browsers <bcp14>MUST</bcp14> provide a separate dialog request for | |||
screen/application sharing permissions even if the media request | screen/application sharing permissions even if the media request | |||
is made at the same time as camera and microphone. | is made at the same time as camera and microphone. | |||
</t> | ||||
<t> | <!-- [rfced] Section 6.2: Please clarify the meaning of "as camera | |||
The browser MUST indicate any windows which are currently being | and microphone." | |||
shared in some unambiguous way. Windows which are not visible MUST | ||||
NOT be shared even if the application is being shared. If the | ||||
screen is being shared, then that MUST be indicated. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
Original: | ||||
o Browsers MUST provide a separate dialog request for screen/ | ||||
application sharing permissions even if the media request is made | ||||
at the same time as camera and microphone. --> | ||||
</li> | ||||
<li> | ||||
The browser <bcp14>MUST</bcp14> indicate any windows which are cur | ||||
rently being | ||||
shared in some unambiguous way. Windows which are not visible <bcp | ||||
14>MUST | ||||
NOT</bcp14> be shared even if the application is being shared. If | ||||
the | ||||
screen is being shared, then that <bcp14>MUST</bcp14> be indicated | ||||
. | ||||
</li> | ||||
</ul> | ||||
<t> | <t> | |||
Browsers MAY permit the formation of data channels without any direct | Browsers <bcp14>MAY</bcp14> permit the formation of data channels with out any direct | |||
user approval. Because sites can always tunnel data through the | user approval. Because sites can always tunnel data through the | |||
server, further restrictions on the data channel do not provide any | server, further restrictions on the data channel do not provide any | |||
additional security. (See <xref | additional security. (See <xref target="sec.proposal.communications.c | |||
target="sec.proposal.communications.consent"/> for a related issue). | onsent" format="default"/> for a related issue.) | |||
</t> | </t> | |||
<t> | <t> | |||
Implementations which support some form of direct user authentication | Implementations which support some form of direct user authentication | |||
SHOULD also provide a policy by which a user can authorize calls only | <bcp14>SHOULD</bcp14> also provide a policy by which a user can author ize calls only | |||
to specific communicating peers. Specifically, the implementation | to specific communicating peers. Specifically, the implementation | |||
SHOULD provide the following interfaces/controls: | <bcp14>SHOULD</bcp14> provide the following interfaces/controls: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li> | |||
<t> | ||||
Allow future calls to this verified user. | Allow future calls to this verified user. | |||
</t> | </li> | |||
<t> | <li> | |||
Allow future calls to any verified user who is in my system | Allow future calls to any verified user who is in my system | |||
address book (this only works with address book integration, of | address book (this only works with address book integration, of | |||
course). | course). | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
<t> | <t> | |||
Implementations SHOULD also provide a different user interface | Implementations <bcp14>SHOULD</bcp14> also provide a different user in terface | |||
indication when calls are in progress to users whose identities are | indication when calls are in progress to users whose identities are | |||
directly verifiable. <xref target="sec.proposal.comsec"/> provides | directly verifiable. <xref target="sec.proposal.comsec" format="defau lt"/> provides | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.proposal.communications.consent" numbered="true" toc= | ||||
<section title="Communications Consent" anchor="sec.proposal.communication | "default"> | |||
s.consent"> | <name>Communications Consent</name> | |||
<t> | <t> | |||
Browser client implementations of WebRTC MUST implement ICE. Server | Browser client implementations of WebRTC <bcp14>MUST</bcp14> implement | |||
gateway implementations which operate only at public IP addresses MUST | ICE. Server | |||
implement either full ICE or ICE-Lite <xref target="RFC8445"/>. | gateway implementations which operate only at public IP addresses <bcp | |||
14>MUST</bcp14> | ||||
implement either full ICE or ICE-Lite <xref target="RFC8445" format="d | ||||
efault"/>. | ||||
</t> | </t> | |||
<t> | <t> | |||
Browser implementations MUST verify reachability via ICE prior to | Browser implementations <bcp14>MUST</bcp14> verify reachability via IC E prior to | |||
sending any non-ICE packets to a given destination. Implementations | sending any non-ICE packets to a given destination. Implementations | |||
MUST NOT provide the ICE transaction ID to JavaScript during the | <bcp14>MUST NOT</bcp14> provide the ICE transaction ID to JavaScript d uring the | |||
lifetime of the transaction (i.e., during the period when the ICE | lifetime of the transaction (i.e., during the period when the ICE | |||
stack would accept a new response for that transaction). The JS MUST | stack would accept a new response for that transaction). The JS <bcp1 | |||
NOT be permitted to control the local ufrag and password, though it of | 4>MUST | |||
NOT</bcp14> be permitted to control the local ufrag and password, thou | ||||
gh it of | ||||
course knows it. | course knows it. | |||
</t> | </t> | |||
<t> <!-- FIXME: phrasing of first sentence still awkward --> | <t> | |||
While continuing consent is required, the ICE <xref | While continuing consent is required, the ICE <xref target="RFC8445" s | |||
target="RFC8445"/>; Section 10 keepalives use STUN Binding Indications | ectionFormat="comma" section="10"/> keepalives use STUN Binding Indications whic | |||
which are | h are | |||
one-way and therefore not sufficient. The current WG consensus is to | one-way and therefore not sufficient. | |||
<!-- [rfced] Section 6.3: Please advise regarding the following: | ||||
1. We do not see the word "keepalive" in Section 10 of RFC 8445, but | ||||
we do see it in 8445's Section 11. Please confirm that "Section 10" | ||||
is correct here and will be clear to readers. | ||||
2. We found the use of "which" confusing here. Are all STUN Binding | ||||
Indications one-way and therefore not sufficient (in which case "STUN | ||||
Binding Indications, which are" would be correct), or only some (in | ||||
which case "STUN Binding Indications that are" would be correct)? | ||||
3. We found this comment, in the XML file, just prior to this | ||||
sentence: "FIXME: phrasing of first sentence still awkward." | ||||
Please let us know how/if you want to fix the phrasing. | ||||
Original: | ||||
While continuing consent is required, the ICE [RFC8445]; Section 10 | ||||
keepalives use STUN Binding Indications which are one-way and | ||||
therefore not sufficient. --> | ||||
The current WG consensus is to | ||||
use ICE Binding Requests for continuing consent freshness. ICE already | use ICE Binding Requests for continuing consent freshness. ICE already | |||
requires that implementations respond to such requests, so this | requires that implementations respond to such requests, so this | |||
approach is maximally compatible. A separate document will profile the | approach is maximally compatible. A separate document will profile the | |||
ICE timers to be used; see <xref target="RFC7675"/>. | ICE timers to be used; see <xref target="RFC7675" format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.proposal.ip.location.privacy" numbered="true" toc="de | ||||
<section title="IP Location Privacy" anchor="sec.proposal.ip.location.priv | fault"> | |||
acy"> | <name>IP Location Privacy</name> | |||
<t> | <t> | |||
A side effect of the default ICE behavior is that the peer learns | A side effect of the default ICE behavior is that the peer learns | |||
one's IP address, which leaks large amounts of location | one's IP address, which leaks large amounts of location | |||
information. This has negative privacy consequences in some | information. This has negative privacy consequences in some | |||
circumstances. The API requirements in this section are intended to | circumstances. The API requirements in this section are intended to | |||
mitigate this issue. Note that these requirements are not intended to | mitigate this issue. Note that these requirements are not intended to | |||
protect the user's IP address from a malicious site. In general, the | protect the user's IP address from a malicious site. In general, the | |||
site will learn at least a user's server reflexive address from any | site will learn at least a user's server-reflexive address from any | |||
HTTP transaction. Rather, these requirements are intended to allow a | HTTP transaction. | |||
<!-- [rfced] Section 6.4: Per author feedback for RFC 8839 and per | ||||
other documents in this cluster, we hyphenated the term "server | ||||
reflexive". Please let us know any objections. | ||||
Original: | ||||
In general, the site will learn at | ||||
least a user's server reflexive address from any HTTP transaction. | ||||
Currently: | ||||
In general, the site will learn at | ||||
least a user's server-reflexive address from any HTTP transaction. --> | ||||
Rather, these requirements are intended to allow a | ||||
site to cooperate with the user to hide the user's IP address from the | site to cooperate with the user to hide the user's IP address from the | |||
other side of the call. Hiding the user's IP address from the server | other side of the call. Hiding the user's IP address from the server | |||
requires some sort of explicit privacy preserving mechanism on the | requires some sort of explicit privacy-preserving mechanism on the | |||
client (e.g., Tor Browser [https://www.torproject.org/projects/torbrow | client (e.g., Tor Browser <eref brackets="angle" target="https://www.t | |||
ser.html.en]) and | orproject.org/projects/torbrowser.html.en"/>) and | |||
is out of scope for this specification. | is out of scope for this specification. | |||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | ||||
<t> | <dt>API Requirement:</dt> | |||
<list style="hanging"> | <dd> | |||
<t hangText="API Requirement:"> | The API <bcp14>MUST</bcp14> provide a mechanism to allow the JS to | |||
The API MUST provide a mechanism to allow the JS to suppress ICE | suppress ICE | |||
negotiation (though perhaps to allow candidate gathering) until | negotiation (though perhaps to allow candidate gathering) until | |||
the user has decided to answer the call [note: determining when | the user has decided to answer the call. (Note: Determining when | |||
the call has been answered is a question for the JS.] This | the call has been answered is a question for the JS.) This | |||
enables a user to prevent a peer from learning their IP address if | enables a user to prevent a peer from learning their IP address if | |||
they elect not to answer a call and also from learning whether the | they elect not to answer a call and also from learning whether the | |||
user is online. | user is online. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <dl newline="false" spacing="normal"> | |||
<dt>API Requirement:</dt> | ||||
<t> | <dd> | |||
<list style="hanging"> | The API <bcp14>MUST</bcp14> provide a mechanism for the calling ap | |||
<t hangText="API Requirement:"> | plication JS to | |||
The API MUST provide a mechanism for the calling application JS to | ||||
indicate that only TURN candidates are to be used. This prevents | indicate that only TURN candidates are to be used. This prevents | |||
the peer from learning one's IP address at all. This mechanism | the peer from learning one's IP address at all. This mechanism | |||
MUST also permit suppression of the related address field, since | <bcp14>MUST</bcp14> also permit suppression of the related address field, since | |||
that leaks local addresses. | that leaks local addresses. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <dl newline="false" spacing="normal"> | |||
<dt>API Requirement:</dt> | ||||
<t> | <dd> | |||
<list style="hanging"> | The API <bcp14>MUST</bcp14> provide a mechanism for the calling ap | |||
<t hangText="API Requirement:"> | plication to | |||
The API MUST provide a mechanism for the calling application to | ||||
reconfigure an existing call to add non-TURN candidates. Taken | reconfigure an existing call to add non-TURN candidates. Taken | |||
together, this and the previous requirement allow ICE negotiation | together, this and the previous requirement allow ICE negotiation | |||
to start immediately on incoming call notification, thus reducing | to start immediately on incoming call notification, thus reducing | |||
post-dial delay, but also to avoid disclosing the user's IP | post-dial delay, but also to avoid disclosing the user's IP | |||
address until they have decided to answer. They also allow users | address until they have decided to answer. They also allow users | |||
to completely hide their IP address for the duration of the | to completely hide their IP address for the duration of the | |||
call. Finally, they allow a mechanism for the user to optimize | call. Finally, they allow a mechanism for the user to optimize | |||
performance by reconfiguring to allow non-TURN candidates during | performance by reconfiguring to allow non-TURN candidates during | |||
an active call if the user decides they no longer need to hide | an active call if the user decides they no longer need to hide | |||
their IP address | their IP address. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | ||||
<t> | <t> | |||
Note that some enterprises may operate proxies and/or NATs designed to | Note that some enterprises may operate proxies and/or NATs designed to | |||
hide internal IP addresses from the outside world. WebRTC provides no | hide internal IP addresses from the outside world. WebRTC provides no | |||
explicit mechanism to allow this function. Either such enterprises | explicit mechanism to allow this function. Either such enterprises | |||
need to proxy the HTTP/HTTPS and modify the SDP and/or the JS, or | need to proxy the HTTP/HTTPS and modify the SDP and/or the JS, or | |||
there needs to be browser support to set the "TURN-only" policy | there needs to be browser support to set the "TURN-only" policy | |||
regardless of the site's preferences. | regardless of the site's preferences. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.proposal.comsec" numbered="true" toc="default"> | ||||
<section title="Communications Security" anchor="sec.proposal.comsec"> | <name>Communications Security</name> | |||
<t> | <t> | |||
Implementations MUST support SRTP <xref target="RFC3711"/>. | Implementations <bcp14>MUST</bcp14> support SRTP <xref target="RFC3711 | |||
Implementations MUST support DTLS <xref target="RFC6347"/> and | " format="default"/>. | |||
DTLS-SRTP <xref target="RFC5763"/><xref target="RFC5764"/> for SRTP | Implementations <bcp14>MUST</bcp14> support DTLS <xref target="RFC6347 | |||
keying. Implementations MUST support SCTP over DTLS <xref | " format="default"/> and | |||
target="RFC8261"/>. | DTLS-SRTP <xref target="RFC5763" format="default"/> <xref target="RFC5 | |||
764" format="default"/> for SRTP | ||||
keying. Implementations <bcp14>MUST</bcp14> support SCTP over DTLS <xr | ||||
ef target="RFC8261" format="default"/>. | ||||
</t> | </t> | |||
<t> | <t> | |||
All media channels MUST be secured via SRTP and SRTCP. Media traffic | All media channels <bcp14>MUST</bcp14> be secured via SRTP and the | |||
MUST NOT | Secure Real-time Transport Control Protocol (SRTCP). Media traffic <bc | |||
be sent over plain (unencrypted) RTP or RTCP; that is, implementations | p14>MUST NOT</bcp14> | |||
MUST | be sent over plain (unencrypted) RTP or RTCP; that is, implementations | |||
NOT negotiate cipher suites with NULL encryption modes. DTLS-SRTP | <bcp14>MUST | |||
MUST be offered for every media channel. WebRTC implementations MUST | NOT</bcp14> negotiate cipher suites with NULL encryption modes. DTLS- | |||
NOT | SRTP | |||
offer SDP Security Descriptions <xref target="RFC4568"/> or select it | <bcp14>MUST</bcp14> be offered for every media channel. WebRTC implem | |||
if offered. | entations <bcp14>MUST NOT</bcp14> | |||
A SRTP MKI MUST NOT be used. | offer SDP security descriptions <xref target="RFC4568" format="default | |||
"/> or select it if offered. | ||||
An SRTP Master Key Identifier (MKI) <bcp14>MUST NOT</bcp14> be used. | ||||
</t> | </t> | |||
<t> | <t> | |||
All data channels MUST be secured via DTLS. | All data channels <bcp14>MUST</bcp14> be secured via DTLS. | |||
</t> | </t> | |||
<t> | <t> | |||
All Implementations MUST support DTLS 1.2 with the | All implementations <bcp14>MUST</bcp14> support DTLS 1.2 with the | |||
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 cipher suite and the | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 cipher suite and the | |||
<xref target="FIPS186">P-256 curve</xref>. | <xref target="FIPS186" format="default">P-256 curve</xref>. | |||
Earlier drafts of this specification required | Earlier drafts of this specification required | |||
DTLS 1.0 with the cipher suite | DTLS 1.0 with the cipher suite | |||
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, and at the time of this | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, and at the time of this | |||
writing some implementations do not support DTLS 1.2; | writing some implementations do not support DTLS 1.2; | |||
endpoints which support only DTLS 1.2 might encounter | endpoints that support only DTLS 1.2 might encounter | |||
interoperability issues. | interoperability issues. | |||
The DTLS-SRTP protection profile | The DTLS-SRTP protection profile | |||
SRTP_AES128_CM_HMAC_SHA1_80 MUST be supported for | SRTP_AES128_CM_HMAC_SHA1_80 <bcp14>MUST</bcp14> be supported for | |||
SRTP. | SRTP. | |||
Implementations | Implementations | |||
MUST favor cipher suites which support (Perfect Forward Secrecy) PFS | <bcp14>MUST</bcp14> favor cipher suites which support Perfect Forward | |||
over non-PFS cipher suites and SHOULD favor AEAD over non-AEAD cipher | Secrecy (PFS) | |||
suites. | over non-PFS cipher suites and <bcp14>SHOULD</bcp14> favor | |||
Authenticated Encryption with Associated Data (AEAD) over non-AEAD ciph | ||||
er suites. | ||||
</t> | </t> | |||
<t> | <t> | |||
Implementations MUST NOT implement DTLS renegotiation and MUST reject | Implementations <bcp14>MUST NOT</bcp14> implement DTLS renegotiation a nd <bcp14>MUST</bcp14> reject | |||
it with a "no_renegotiation" alert if offered.</t> | it with a "no_renegotiation" alert if offered.</t> | |||
<t> | <t> | |||
Endpoints MUST NOT implement TLS False Start <xref target="RFC7918"/>. | Endpoints <bcp14>MUST NOT</bcp14> implement TLS False Start <xref targ | |||
</t> | et="RFC7918" format="default"/>.</t> | |||
<dl newline="false" spacing="normal"> | ||||
<t> | <dt>API Requirement:</dt> | |||
<list style="hanging"> | <dd> | |||
<t hangText="API Requirement:"> | The API <bcp14>MUST</bcp14> generate a new authentication key pair | |||
The API MUST generate a new authentication key pair for every new | for every new | |||
call by default. This is intended to allow for unlinkability. | call by default. This is intended to allow for unlinkability. | |||
</t> | </dd> | |||
<t hangText="API Requirement:"> | <dt>API Requirement:</dt> | |||
The API MUST provide a means to reuse a key pair for calls. This | <dd> | |||
The API <bcp14>MUST</bcp14> provide a means to reuse a key pair fo | ||||
r calls. This | ||||
can be used to enable key continuity-based authentication, and | can be used to enable key continuity-based authentication, and | |||
could be used to amortize key generation costs. | could be used to amortize key generation costs. | |||
</t> | </dd> | |||
<t hangText="API Requirement:"> | <dt>API Requirement:</dt> | |||
<dd> | ||||
Unless | Unless | |||
the user specifically configures an external key pair, different | the user specifically configures an external key pair, different | |||
key pairs MUST be used for each origin. (This avoids creating a | key pairs <bcp14>MUST</bcp14> be used for each origin. (This avoid s creating a | |||
super-cookie.) | super-cookie.) | |||
</t> | </dd> | |||
<t hangText="API Requirement:"> | <dt>API Requirement:</dt> | |||
When DTLS-SRTP is used, the API MUST NOT permit the JS to obtain | <dd> | |||
When DTLS-SRTP is used, the API <bcp14>MUST NOT</bcp14> permit the | ||||
JS to obtain | ||||
the negotiated keying material. This requirement preserves the | the negotiated keying material. This requirement preserves the | |||
end-to-end security of the media. | end-to-end security of the media. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <dl newline="false" spacing="normal"> | |||
<dt>UI Requirements:</dt> | ||||
<t> | <dd> | |||
<list style="hanging"> | A user-oriented client <bcp14>MUST</bcp14> provide an "inspector" | |||
<t hangText="UI Requirements: "> | interface which | |||
A user-oriented client MUST provide an "inspector" interface which | ||||
allows the user to determine the security characteristics of the | allows the user to determine the security characteristics of the | |||
media. | media. | |||
</t> | </dd> | |||
<t> | <dt/> | |||
The following properties SHOULD be displayed "up-front" in the | <dd> | |||
The following properties <bcp14>SHOULD</bcp14> be displayed "up-fr | ||||
ont" in the | ||||
browser chrome, i.e., without requiring the user to ask for them: | browser chrome, i.e., without requiring the user to ask for them: | |||
</t> | </dd> | |||
<t> | <dt/> | |||
<list style="symbols"> | <dd> | |||
<t> | <ul spacing="normal"> | |||
A client MUST provide a user interface through which a user | <li> | |||
A client <bcp14>MUST</bcp14> provide a user interface through | ||||
which a user | ||||
may determine the security characteristics for | may determine the security characteristics for | |||
currently-displayed audio and video stream(s) | currently displayed audio and video stream(s). | |||
</t> | </li> | |||
<li> | ||||
<t> | A client <bcp14>MUST</bcp14> provide a user interface through | |||
A client MUST provide a user interface through which a user | which a user | |||
may determine the security characteristics for transmissions | may determine the security characteristics for transmissions | |||
of their microphone audio and camera video. | of their microphone audio and camera video. | |||
</t> | </li> | |||
<li> | ||||
<t> | ||||
If the far endpoint was directly verified, either via a | If the far endpoint was directly verified, either via a | |||
third-party verifiable X.509 certificate or via a Web IdP | third-party verifiable X.509 certificate or via a Web IdP | |||
mechanism (see <xref target="sec.generic.idp"/>) the "security | mechanism (see <xref target="sec.generic.idp" format="default" | |||
characteristics" MUST include the verified information. X.509 | />), the "security | |||
characteristics" <bcp14>MUST</bcp14> include the verified info | ||||
rmation. X.509 | ||||
identities and Web IdP identities have similar semantics and | identities and Web IdP identities have similar semantics and | |||
should be displayed in a similar way. | should be displayed in a similar way. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | </dd> | |||
<t> | <dt/> | |||
</t> | <dd> | |||
<t> | ||||
The following properties are more likely to require some | The following properties are more likely to require some | |||
"drill-down" from the user: | "drill-down" from the user: | |||
</t> | </dd> | |||
<t> | <dt/> | |||
<list style="symbols"> | <dd> | |||
<t> | <ul spacing="normal"> | |||
The "security characteristics" MUST indicate the cryptographic | <li> | |||
algorithms in use (For example: "AES-CBC".) | The "security characteristics" <bcp14>MUST</bcp14> indicate th | |||
</t> | e cryptographic | |||
algorithms in use (for example, "AES-CBC"). | ||||
<t> | </li> | |||
The "security characteristics" MUST indicate whether PFS is | <li> | |||
The "security characteristics" <bcp14>MUST</bcp14> indicate wh | ||||
ether PFS is | ||||
provided. | provided. | |||
</t> | </li> | |||
<li> | ||||
<t> | The "security characteristics" <bcp14>MUST</bcp14> include som | |||
The "security characteristics" MUST include some mechanism to | e mechanism to | |||
allow an out-of-band verification of the peer, such as a | allow an out-of-band verification of the peer, such as a | |||
certificate fingerprint or a Short Authentication String (SAS) . | certificate fingerprint or a Short Authentication String (SAS) . | |||
These are compared by the peers to authenticate one another. | These are compared by the peers to authenticate one another. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.generic.idp" numbered="true" toc="default"> | ||||
<section title="Web-Based Peer Authentication" anchor="sec.generic.idp"> | <name>Web-Based Peer Authentication</name> | |||
<t> | <t> | |||
In a number of cases, it is desirable for the endpoint (i.e., the | In a number of cases, it is desirable for the endpoint (i.e., the | |||
browser) to be able to directly identify the endpoint on the other | browser) to be able to directly identify the endpoint on the other | |||
side without trusting the signaling service to which they are | side without trusting the signaling service to which they are | |||
connected. For instance, users may be making a call via a federated | connected. For instance, users may be making a call via a federated | |||
system where they wish to get direct authentication of the other | system where they wish to get direct authentication of the other | |||
side. Alternately, they may be making a call on a site which they | side. Alternately, they may be making a call on a site which they | |||
minimally trust (such as a poker site) but to someone who has an | minimally trust (such as a poker site) but to someone who has an | |||
identity on a site they do trust (such as a social network.) | identity on a site they do trust (such as a social network). | |||
</t> | </t> | |||
<t> | <t> | |||
Recently, a number of Web-based identity technologies (OAuth, | Recently, a number of Web-based identity technologies (OAuth, | |||
Facebook Connect etc.) have been developed. While the | Facebook Connect, etc.) have been developed. While the | |||
details vary, what these technologies share is that they have a | details vary, what these technologies share is that they have a | |||
Web-based (i.e., HTTP/HTTPS) identity provider which attests to Alice' s | Web-based (i.e., HTTP/HTTPS) identity provider that attests to Alice's | |||
identity. For instance, if Alice has an account at example.org, Alice could | identity. For instance, if Alice has an account at example.org, Alice could | |||
use the example.org identity provider to prove to others that Alice is | use the example.org identity provider to prove to others that Alice is | |||
alice@example.org. The development of these technologies allows us to | alice@example.org. The development of these technologies allows us to | |||
separate calling from identity provision: Alice could call you on a | separate calling from identity provision: Alice could call you on a | |||
poker site but identify herself as alice@example.org. | poker site but identify herself as alice@example.org. | |||
</t> | </t> | |||
<t> | <t> | |||
Whatever the underlying technology, the general principle is that the | Whatever the underlying technology, the general principle is that the | |||
party which is being authenticated is NOT the signaling site but | party which is being authenticated is NOT the signaling site but | |||
rather the user (and their browser). Similarly, the relying party is | rather the user (and their browser). Similarly, the relying party is | |||
the browser and not the signaling site. Thus, the browser MUST | the browser and not the signaling site. Thus, the browser <bcp14>MUST </bcp14> | |||
generate the input to the IdP assertion process and | generate the input to the IdP assertion process and | |||
display the results of the verification process to the user | display the results of the verification process to the user | |||
in a way which cannot be imitated by the calling site. | in a way which cannot be imitated by the calling site. | |||
</t> | </t> | |||
<t> | <t> | |||
The mechanisms defined in this document do not require the browser to | The mechanisms defined in this document do not require the browser to | |||
implement any particular identity protocol or to support any | implement any particular identity protocol or to support any | |||
particular IdP. Instead, this document provides a generic interface | particular IdP. Instead, this document provides a generic interface | |||
which any IdP can implement. Thus, new IdPs and protocols can be | which any IdP can implement. Thus, new IdPs and protocols can be | |||
introduced without change to either the browser or the calling | introduced without change to either the browser or the calling | |||
service. This avoids the need to make a commitment to any particular | service. This avoids the need to make a commitment to any particular | |||
identity protocol, although browsers may opt to directly implement | identity protocol, although browsers may opt to directly implement | |||
some identity protocols in order to provide superior performance or UI | some identity protocols in order to provide superior performance or UI | |||
properties. | properties. | |||
</t> | </t> | |||
<section anchor="sec.trust-relationships" numbered="true" toc="default"> | ||||
<section title="Trust Relationships: IdPs, APs, and RPs" anchor="sec.tru | <name>Trust Relationships: IdPs, APs, and RPs</name> | |||
st-relationships"> | <t> | |||
<t> | ||||
Any federated identity protocol has three major participants: | Any federated identity protocol has three major participants: | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal"> | |||
<list style="hanging"> | <dt>Authenticating Party (AP):</dt> | |||
<t hangText="Authenticating Party (AP):"> | <dd> | |||
The entity which is trying to establish its identity. | The entity which is trying to establish its identity. | |||
</t> | </dd> | |||
<t> | <dt>Identity Provider (IdP):</dt> | |||
</t> | <dd> | |||
<t hangText="Identity Provider (IdP):"> | ||||
The entity which is vouching for the AP's identity. | The entity which is vouching for the AP's identity. | |||
</t> | </dd> | |||
<dt>Relying Party (RP):</dt> | ||||
<t> | <dd> | |||
</t> | ||||
<t hangText="Relying Party (RP):"> | ||||
The entity which is trying to verify the AP's identity. | The entity which is trying to verify the AP's identity. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <t> | |||
<t> | ||||
The AP and the IdP have an account relationship of some kind: the AP | The AP and the IdP have an account relationship of some kind: the AP | |||
registers with the IdP and is able to subsequently authenticate | registers with the IdP and is able to subsequently authenticate | |||
directly to the IdP (e.g., with a password). This means that the | directly to the IdP (e.g., with a password). This means that the | |||
browser must somehow know which IdP(s) the user has an account | browser must somehow know which IdP(s) the user has an account | |||
relationship with. This can either be something that the user | relationship with. This can either be something that the user | |||
configures into the browser or that is configured at the calling | configures into the browser or that is configured at the calling | |||
site and then provided to the PeerConnection by the Web application | site and then provided to the PeerConnection by the Web application | |||
at the calling site. The use case for having this information | at the calling site. The use case for having this information | |||
configured into the browser is that the user may "log into" the | configured into the browser is that the user may "log into" the | |||
browser to bind it to some identity. This is becoming common in new | browser to bind it to some identity. This is becoming common in new | |||
browsers. However, it should also be possible for the IdP | browsers. However, it should also be possible for the IdP | |||
information to simply be provided by the calling application. | information to simply be provided by the calling application. | |||
</t> | </t> | |||
<t> | <t> | |||
At a high level there are two kinds of IdPs: | At a high level, there are two kinds of IdPs: | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal"> | |||
<list style="hanging"> | <dt>Authoritative:</dt> | |||
<t hangText="Authoritative: "> | <dd> | |||
IdPs which have verifiable control of some section of the | IdPs which have verifiable control of some section of the | |||
identity space. For instance, in the realm of e-mail, the | identity space. For instance, in the realm of email, the | |||
operator of "example.com" has complete control of the namespace | operator of "example.com" has complete control of the namespace | |||
ending in "@example.com". Thus, "alice@example.com" is whoever | ending in "@example.com". Thus, "alice@example.com" is whoever | |||
the operator says it is. Examples of systems with authoritative | the operator says it is. Examples of systems with authoritative | |||
identity providers include DNSSEC, RFC 4474, and Facebook | identity providers include DNSSEC, RFC 4474, and Facebook | |||
Connect (Facebook identities only make sense within the context | Connect (Facebook identities only make sense within the context | |||
of the Facebook system). | of the Facebook system). | |||
</t> | ||||
<t> | <!-- [rfced] Section 7.1: May we cite RFC 8224 (which obsoletes | |||
</t> | RFC 4474) here instead (with brackets, so that a hyperlink will be | |||
<t hangText="Third-Party: "> | available for the reader) and list it under Informative References? | |||
Original: | ||||
Examples of systems with authoritative | ||||
identity providers include DNSSEC, RFC 4474, and Facebook Connect | ||||
(Facebook identities only make sense within the context of the | ||||
Facebook system). | ||||
Possibly: | ||||
Examples of systems with authoritative | ||||
identity providers include DNSSEC, an identity system for SIP | ||||
(see [RFC8224]), and Facebook Connect (Facebook identities only make | ||||
sense within the context of the Facebook system). | ||||
... | ||||
[RFC8224] Peterson, J., Jennings, C., Rescorla, E., and C. Wendt, | ||||
"Authenticated Identity Management in the Session | ||||
Initiation Protocol (SIP)", RFC 8224, DOI 10.17487/RFC8224, | ||||
February 2018, <https://www.rfc-editor.org/info/rfc8224>. --> | ||||
</dd> | ||||
<dt>Third-Party:</dt> | ||||
<dd> | ||||
IdPs which don't have control of their section of the identity | IdPs which don't have control of their section of the identity | |||
space but instead verify user's identities via some unspecified | space but instead verify a user's identity via some unspecified | |||
mechanism and then attest to it. Because the IdP doesn't | mechanism and then attest to it. Because the IdP doesn't | |||
actually control the namespace, RPs need to trust that the IdP | actually control the namespace, RPs need to trust that the IdP | |||
is correctly verifying AP identities, and there can potentially | is correctly verifying AP identities, and there can potentially | |||
be multiple IdPs attesting to the same section of the identity | be multiple IdPs attesting to the same section of the identity | |||
space. Probably the best-known example of a third-party identity | space. Probably the best-known example of a third-party identity | |||
provider is SSL/TLS certificates, where there are a large number of | provider is SSL/TLS certificates, where there are a large number of | |||
CAs all of whom can attest to any domain name. | certification authorities (CAs) all of whom can attest to any do | |||
</t> | main name. | |||
</list> | </dd> | |||
</t> | </dl> | |||
<t> | ||||
<t> | ||||
If an AP is authenticating via an authoritative IdP, then the RP | If an AP is authenticating via an authoritative IdP, then the RP | |||
does not need to explicitly configure trust in the IdP at all. The | does not need to explicitly configure trust in the IdP at all. The | |||
identity mechanism can directly verify that the IdP indeed made the | identity mechanism can directly verify that the IdP indeed made the | |||
relevant identity assertion (a function provided by the mechanisms | relevant identity assertion (a function provided by the mechanisms | |||
in this document), and any assertion it makes about an identity for | in this document), and any assertion it makes about an identity for | |||
which it is authoritative is directly verifiable. Note that this | which it is authoritative is directly verifiable. Note that this | |||
does not mean that the IdP might not lie, but that is a | does not mean that the IdP might not lie, but that is a | |||
trustworthiness judgement that the user can make at the time he | trustworthiness judgement that the user can make at the time he | |||
looks at the identity. | looks at the identity. | |||
</t> | </t> | |||
<t> | <t> | |||
By contrast, if an AP is authenticating via a third-party IdP, the | By contrast, if an AP is authenticating via a third-party IdP, the | |||
RP needs to explicitly trust that IdP (hence the need for an | RP needs to explicitly trust that IdP (hence the need for an | |||
explicit trust anchor list in PKI-based SSL/TLS clients). The list | explicit trust anchor list in PKI-based SSL/TLS clients). The list | |||
of trustable IdPs needs to be configured directly into the browser, | of trustable IdPs needs to be configured directly into the browser, | |||
either by the user or potentially by the browser manufacturer. This | either by the user or potentially by the browser manufacturer. This | |||
is a significant advantage of authoritative IdPs and implies that if | is a significant advantage of authoritative IdPs and implies that if | |||
third-party IdPs are to be supported, the potential number needs to | third-party IdPs are to be supported, the potential number needs to | |||
be fairly small. | be fairly small. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.overview" numbered="true" toc="default"> | ||||
<section title="Overview of Operation" anchor="sec.overview"> | <name>Overview of Operation</name> | |||
<t> | <t> | |||
In order to provide security without trusting the calling site, the | In order to provide security without trusting the calling site, the | |||
PeerConnection component of the browser must interact directly with | PeerConnection component of the browser must interact directly with | |||
the IdP. The details of the mechanism are described in the W3C API | the IdP. The details of the mechanism are described in the W3C API | |||
specification, but the general idea is that the PeerConnection | specification, but the general idea is that the PeerConnection | |||
component downloads JS from a specific location on the IdP dictated | component downloads JS from a specific location on the IdP dictated | |||
by the IdP domain name. That JS (the "IdP proxy") runs in an | by the IdP domain name. That JS (the "IdP proxy") runs in an | |||
isolated security context within the browser and the PeerConnection | isolated security context within the browser, and the PeerConnection | |||
talks to it via a secure message passing channel. | talks to it via a secure message passing channel. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that there are two logically separate functions here: | Note that there are two logically separate functions here: | |||
<list style="symbols"> | </t> | |||
<t> | <ul spacing="normal"> | |||
<li> | ||||
Identity assertion generation. | Identity assertion generation. | |||
</t> | </li> | |||
<t> | <li> | |||
Identity assertion verification. | Identity assertion verification. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | The same IdP JS "endpoint" is used for both functions, but of course | |||
The same IdP JS "endpoint" is used for both functions but of course | ||||
a given IdP might behave differently and load new JS to perform one | a given IdP might behave differently and load new JS to perform one | |||
function or the other. | function or the other. | |||
</t> | </t> | |||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
+--------------------------------------+ | +--------------------------------------+ | |||
| Browser | | | Browser | | |||
| | | | | | |||
| +----------------------------------+ | | | +----------------------------------+ | | |||
| | https://calling-site.example.com | | | | | https://calling-site.example.com | | | |||
| | | | | | | | | | |||
| | Calling JS Code | | | | | Calling JS Code | | | |||
| | ^ | | | | | ^ | | | |||
| +---------------|------------------+ | | | +---------------|------------------+ | | |||
| | API Calls | | | | API Calls | | |||
skipping to change at line 1286 ¶ | skipping to change at line 1401 ¶ | |||
| PeerConnection | | | PeerConnection | | |||
| ^ | | | ^ | | |||
| | API Calls | | | | API Calls | | |||
| +-----------|-------------+ | +---------------+ | | +-----------|-------------+ | +---------------+ | |||
| | v | | | | | | | v | | | | | |||
| | IdP Proxy |<-------->| Identity | | | | IdP Proxy |<-------->| Identity | | |||
| | | | | Provider | | | | | | | Provider | | |||
| | https://idp.example.org | | | | | | | https://idp.example.org | | | | | |||
| +-------------------------+ | +---------------+ | | +-------------------------+ | +---------------+ | |||
| | | | | | |||
+--------------------------------------+ | +--------------------------------------+ ]]></artwork> | |||
]]></artwork> | <t> | |||
</figure> | ||||
<t> | ||||
When the PeerConnection object wants to interact with the IdP, the | When the PeerConnection object wants to interact with the IdP, the | |||
sequence of events is as follows: | sequence of events is as follows: | |||
<list style="numbers"> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<li> | ||||
The browser (the PeerConnection component) instantiates an IdP | The browser (the PeerConnection component) instantiates an IdP | |||
proxy. This allows the IdP to load whatever JS is necessary into | proxy. This allows the IdP to load whatever JS is necessary into | |||
the proxy. The resulting code runs in the IdP's security | the proxy. The resulting code runs in the IdP's security | |||
context. | context. | |||
</t> | </li> | |||
<t> | <li> | |||
The IdP registers an object with the browser that conforms to | The IdP registers an object with the browser that conforms to | |||
the API defined in <xref target="webrtc-api"/>. | the API defined in <xref target="webrtc-api" format="default"/>. | |||
</t> | </li> | |||
<t> | <li> | |||
The browser invokes methods on the object registered by the IdP | The browser invokes methods on the object registered by the IdP | |||
proxy to create or verify identity assertions. | proxy to create or verify identity assertions. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | <t> | |||
<t> | ||||
This approach allows us to decouple the browser from any particular | This approach allows us to decouple the browser from any particular | |||
identity provider; the browser need only know how to load the IdP's | identity provider; the browser need only know how to load the IdP's | |||
JavaScript--the location of which is determined based on the IdP's | JavaScript -- the location of which is determined based on the IdP's | |||
identity--and to call the generic API for requesting and verifying | identity -- and to call the generic API for requesting and verifying | |||
identity assertions. The IdP provides whatever logic is necessary to | identity assertions. The IdP provides whatever logic is necessary to | |||
bridge the generic protocol to the IdP's specific | bridge the generic protocol to the IdP's specific | |||
requirements. Thus, a single browser can support any number of | requirements. Thus, a single browser can support any number of | |||
identity protocols, including being forward compatible with IdPs | identity protocols, including being forward compatible with IdPs | |||
which did not exist at the time the browser was written. | which did not exist at the time the browser was written. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.standardized" numbered="true" toc="default"> | ||||
<section title="Items for Standardization" anchor="sec.standardized"> | <name>Items for Standardization</name> | |||
<t> | <t> | |||
There are two parts to this work: | There are two parts to this work: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li> | |||
<t> | ||||
The precise information from the signaling message that must be | The precise information from the signaling message that must be | |||
cryptographically bound to the user's identity and a mechanism | cryptographically bound to the user's identity and a mechanism | |||
for carrying assertions in JSEP messages. This is specified in | for carrying assertions in JavaScript Session Establishment | |||
<xref target="sec.jsep-binding"/>. | Protocol (JSEP) messages. This is specified in | |||
</t> | <xref target="sec.jsep-binding" format="default"/>. | |||
</li> | ||||
<t> | <li> | |||
The interface to the IdP, which is defined in the companion W3C | The interface to the IdP, which is defined in the companion W3C | |||
WebRTC API specification <xref target="webrtc-api"/>. | WebRTC API specification <xref target="webrtc-api" format="defau | |||
</t> | lt"/>. | |||
</list> | </li> | |||
</t> | </ul> | |||
<t> | <t> | |||
The WebRTC API specification also defines JavaScript interfaces that | The WebRTC API specification also defines JavaScript interfaces that | |||
the calling application can use to specify which IdP to use. That | the calling application can use to specify which IdP to use. That | |||
API also provides access to the assertion-generation capability and | API also provides access to the assertion-generation capability and | |||
the status of the validation process. | the status of the validation process. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.jsep-binding" numbered="true" toc="default"> | ||||
<section title="Binding Identity Assertions to JSEP Offer/Answer Transac | <name>Binding Identity Assertions to JSEP Offer/Answer Transactions</nam | |||
tions" anchor="sec.jsep-binding"> | e> | |||
<t> | ||||
<t> | ||||
An identity assertion binds the user's identity (as asserted by the | An identity assertion binds the user's identity (as asserted by the | |||
IdP) to the SDP offer/answer exchange and specifically to the | IdP) to the SDP offer/answer exchange and specifically to the | |||
media. In order to achieve this, the PeerConnection must provide the | media. In order to achieve this, the PeerConnection must provide the | |||
DTLS-SRTP fingerprint to be bound to the identity. This is provided | DTLS-SRTP fingerprint to be bound to the identity. This is provided | |||
as a JavaScript object (also known as a dictionary or hash) with a | as a JavaScript object (also known as a dictionary or hash) with a | |||
single <spanx style="verb">fingerprint</spanx> key, as shown below: | single "fingerprint" key, as shown below: | |||
</t> | </t> | |||
<figure> | <!-- [rfced] Please review the type attribute set for each <sourcecode> and let | |||
<artwork><![CDATA[ | us know if any updates are needed. | |||
{ | --> | |||
"fingerprint": | <sourcecode name="json-1" type="json"><![CDATA[ | |||
[ | { | |||
{ "algorithm": "sha-256", | "fingerprint": | |||
"digest": "4A:AD:B9:B1:3F:...:E5:7C:AB" }, | [ | |||
{ "algorithm": "sha-1", | { "algorithm": "sha-256", | |||
"digest": "74:E9:76:C8:19:...:F4:45:6B" } | "digest": "4A:AD:B9:B1:3F:...:E5:7C:AB" }, | |||
] | { "algorithm": "sha-1", | |||
} | "digest": "74:E9:76:C8:19:...:F4:45:6B" } | |||
]]></artwork> | ] | |||
</figure> | } ]]></sourcecode> | |||
<t> | <t> | |||
The <spanx style="verb">fingerprint</spanx> value is an array of | The "fingerprint" value is an array of | |||
objects. Each object in the array contains <spanx | objects. Each object in the array contains "algorithm" and "digest" | |||
style="verb">algorithm</spanx> and <spanx | values, which correspond directly to | |||
style="verb">digest</spanx> values, which correspond directly to | the algorithm and digest values in the "fingerprint" attribute of th | |||
the algorithm and digest values in the <spanx | e SDP <xref target="RFC8122" format="default"/>. | |||
style="verb">fingerprint</spanx> attribute of the SDP <xref | </t> | |||
target="RFC8122"/>. | <t> | |||
</t> | This object is encoded in a <xref target="RFC8259" format="default"> | |||
<t> | JSON</xref> | |||
This object is encoded in a <xref target="RFC8259">JSON</xref> | ||||
string for passing to the IdP. The identity assertion returned by | string for passing to the IdP. The identity assertion returned by | |||
the IdP, which is encoded in the <spanx | the IdP, which is encoded in the "identity" attribute, is a JSON obj | |||
style="verb">identity</spanx> attribute, is a JSON object that is | ect that is | |||
encoded as described in <xref target="sec.carry-assertion"/>. | encoded as described in <xref target="sec.carry-assertion" format="d | |||
</t> | efault"/>. | |||
<t> | </t> | |||
<t> | ||||
This structure does not need to be interpreted by the IdP or the | This structure does not need to be interpreted by the IdP or the | |||
IdP proxy. It is consumed solely by the RP's browser. The IdP | IdP proxy. It is consumed solely by the RP's browser. The IdP | |||
merely treats it as an opaque value to be attested to. Thus, new | merely treats it as an opaque value to be attested to. Thus, new | |||
parameters can be added to the assertion without modifying the | parameters can be added to the assertion without modifying the | |||
IdP. | IdP. | |||
</t> | </t> | |||
<section anchor="sec.carry-assertion" numbered="true" toc="default"> | ||||
<section title="Carrying Identity Assertions" anchor="sec.carry-assert | <name>Carrying Identity Assertions</name> | |||
ion"> | <t> | |||
<t> | Once an IdP has generated an assertion (see <xref target="sec.requ | |||
Once an IdP has generated an assertion (see <xref | est-assert" format="default"/>), it is attached to the SDP | |||
target="sec.request-assert"/>), it is attached to the SDP | offer/answer message. This is done by adding a new "identity" | |||
offer/answer message. This is done by adding a new 'identity' | ||||
attribute to the SDP. The sole contents of this value is the | attribute to the SDP. The sole contents of this value is the | |||
identity assertion. The identity assertion produced by the IdP is | identity assertion. The identity assertion produced by the IdP is | |||
encoded into a UTF-8 JSON text, then <xref | encoded into a UTF-8 JSON text, then <xref target="RFC4648" format | |||
target="RFC4648">Base64-encoded</xref> to produce this string. | ="default">base64-encoded</xref> to produce this string. | |||
For example: | For example: | |||
</t> | </t> | |||
<figure> | ||||
<artwork><![CDATA[ | <sourcecode name="sdp-1" type="sdp" ><![CDATA[ | |||
v=0 | v=0 | |||
o=- 1181923068 1181923196 IN IP4 ua1.example.com | o=- 1181923068 1181923196 IN IP4 ua1.example.com | |||
s=example1 | s=example1 | |||
c=IN IP4 ua1.example.com | c=IN IP4 ua1.example.com | |||
a=fingerprint:sha-1 \ | a=fingerprint:sha-1 \ | |||
4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB | 4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB | |||
a=identity:\ | a=identity:\ | |||
eyJpZHAiOnsiZG9tYWluIjoiZXhhbXBsZS5vcmciLCJwcm90b2NvbCI6ImJvZ3Vz\ | eyJpZHAiOnsiZG9tYWluIjoiZXhhbXBsZS5vcmciLCJwcm90b2NvbCI6ImJvZ3Vz\ | |||
In0sImFzc2VydGlvbiI6IntcImlkZW50aXR5XCI6XCJib2JAZXhhbXBsZS5vcmdc\ | In0sImFzc2VydGlvbiI6IntcImlkZW50aXR5XCI6XCJib2JAZXhhbXBsZS5vcmdc\ | |||
IixcImNvbnRlbnRzXCI6XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6XCIsXCJz\ | IixcImNvbnRlbnRzXCI6XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6XCIsXCJz\ | |||
aWduYXR1cmVcIjpcIjAxMDIwMzA0MDUwNlwifSJ9 | aWduYXR1cmVcIjpcIjAxMDIwMzA0MDUwNlwifSJ9 | |||
a=... | a=... | |||
t=0 0 | t=0 0 | |||
m=audio 6056 RTP/SAVP 0 | m=audio 6056 RTP/SAVP 0 | |||
a=sendrecv | a=sendrecv | |||
... | ... ]]></sourcecode> | |||
Note that long lines in the example are folded to meet the column | <aside><t>Note that long lines in the example are folded to meet the column | |||
width constraints of this document; the backslash ("\") at the end of | width constraints of this document; the backslash ("\") at the end of | |||
a line, the carriage return that follows, and whitespace shall be ignored. | a line, the carriage return that follows, and whitespace shall be ignored.</t> </aside> | |||
]]></artwork> | <t> | |||
</figure> | The "identity" attribute attests to all "fingerprint" attributes i | |||
<t> | n the session | |||
The 'identity' attribute attests to all <spanx | ||||
style="verb">fingerprint</spanx> attributes in the session | ||||
description. It is therefore a session-level attribute. | description. It is therefore a session-level attribute. | |||
</t> | </t> | |||
<t> | <t> | |||
Multiple <spanx style="verb">fingerprint</spanx> values can be | Multiple "fingerprint" values can be | |||
used to offer alternative certificates for a peer. The <spanx | used to offer alternative certificates for a peer. The "identity" | |||
style="verb">identity</spanx> attribute MUST include all | attribute <bcp14>MUST</bcp14> include all | |||
fingerprint values that are included in <spanx | "fingerprint" values that are included in "fingerprint" attributes | |||
style="verb">fingerprint</spanx> attributes of the session | of the session | |||
description. | description. | |||
</t> | </t> | |||
<t> | <t> | |||
The RP browser MUST verify that the in-use certificate for a DTLS | The RP browser <bcp14>MUST</bcp14> verify that the in-use certific | |||
ate for a DTLS | ||||
connection is in the set of fingerprints returned from the IdP | connection is in the set of fingerprints returned from the IdP | |||
when verifying an assertion. | when verifying an assertion. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
<section title="Determining the IdP URI" anchor="sec.idp-uri"> | <section anchor="sec.idp-uri" numbered="true" toc="default"> | |||
<t> | <name>Determining the IdP URI</name> | |||
<t> | ||||
In order to ensure that the IdP is under control of the domain | In order to ensure that the IdP is under control of the domain | |||
owner rather than someone who merely has an account on the | owner rather than someone who merely has an account on the | |||
domain owner's server (e.g., in shared hosting scenarios), the | domain owner's server (e.g., in shared hosting scenarios), the | |||
IdP JavaScript is hosted at a deterministic location based on | IdP JavaScript is hosted at a deterministic location based on | |||
the IdP's domain name. Each IdP proxy instance is associated | the IdP's domain name. Each IdP proxy instance is associated | |||
with two values: | with two values: | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal"> | |||
<list style="hanging"> | <dt>authority:</dt> | |||
<t hangText="Authority:"> | <dd> | |||
The <xref target="RFC3986"> authority</xref> at which the | The <xref target="RFC3986" format="default"> authority</x | |||
ref> at which the | ||||
IdP's service is hosted. | IdP's service is hosted. | |||
</t> | </dd> | |||
<t hangText="protocol:"> | <dt>protocol:</dt> | |||
<dd> | ||||
The specific IdP protocol which the IdP is using. This is a | The specific IdP protocol which the IdP is using. This is a | |||
completely opaque IdP-specific string, but allows an IdP to | completely opaque IdP-specific string, but allows an IdP to | |||
implement two protocols in parallel. This value may be the | implement two protocols in parallel. This value may be the | |||
empty string. If no value for protocol is provided, a value | empty string. If no value for protocol is provided, a value | |||
of "default" is used. | of "default" is used. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <t> | |||
<t> | Each IdP <bcp14>MUST</bcp14> serve its initial entry page (i.e., | |||
Each IdP MUST serve its initial entry page (i.e., the one loaded | the one loaded | |||
by the IdP proxy) from a <xref target="RFC5785">well-known | by the IdP proxy) from a <xref target="RFC5785" format="default" | |||
URI</xref>. The well-known URI for an IdP proxy is formed from | >well-known | |||
URI</xref>. | ||||
<!-- [rfced] Section 7.5: RFC 5785 has been obsoleted by RFC 8615. | ||||
May we change both citations as well as the reference listing for | ||||
RFC 5785? | ||||
(It looks like <https://www.iana.org/assignments/well-known-uris/> | ||||
and <https://www.iana.org/assignments/uri-schemes/> might be related | ||||
to this text, and we see that both have been updated to refer to | ||||
RFC 8615.) | ||||
Original: | ||||
Each IdP MUST serve its initial entry page (i.e., the one loaded by | ||||
the IdP proxy) from a well-known URI [RFC5785]. | ||||
... | ||||
This section reqisters the "idp-proxy" well-known URI from [RFC5785]. | ||||
... | ||||
[RFC5785] Nottingham, M. and E. Hammer-Lahav, "Defining Well-Known | ||||
Uniform Resource Identifiers (URIs)", RFC 5785, | ||||
DOI 10.17487/RFC5785, April 2010, | ||||
<https://www.rfc-editor.org/info/rfc5785>. | ||||
Suggested ("reqisters" has been fixed): | ||||
Each IdP MUST serve its initial entry page (i.e., the one loaded by | ||||
the IdP proxy) from a well-known URI [RFC8615]. | ||||
... | ||||
This section registers the "idp-proxy" well-known URI from [RFC8615]. | ||||
... | ||||
[RFC8615] Nottingham, M., "Well-Known Uniform Resource Identifiers | ||||
(URIs)", RFC 8615, DOI 10.17487/RFC8615, May 2019, | ||||
<https://www.rfc-editor.org/info/rfc8615>. --> | ||||
The well-known URI for an IdP proxy is formed from | ||||
the following URI components: | the following URI components: | |||
<list style="numbers"> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
The scheme, "https:". An IdP MUST be loaded using <xref | <li> | |||
target="RFC2818">HTTPS</xref>. | The scheme, "https:". An IdP <bcp14>MUST</bcp14> be loaded | |||
</t> | using <xref target="RFC2818" format="default">HTTPS</xref>. | |||
<t> | </li> | |||
The <xref target="RFC3986">authority</xref>. As noted above | <li> | |||
, | The <xref target="RFC3986" format="default">authority</xref> | |||
the authority MAY contain a non-default port number or | . As noted above, | |||
the authority <bcp14>MAY</bcp14> contain a non-default port | ||||
number or | ||||
userinfo sub-component. Both are removed when determining | userinfo sub-component. Both are removed when determining | |||
if an asserted identity matches the name of the IdP. | if an asserted identity matches the name of the IdP. | |||
</t> | </li> | |||
<t> | <li> | |||
The path, starting with "/.well-known/idp-proxy/" and | The path, starting with "/.well-known/idp-proxy/" and | |||
appended with the IdP protocol. Note that the separator | appended with the IdP protocol. Note that the separator | |||
characters '/' (%2F) and '\' (%5C) MUST NOT be permitted in | characters '/' (%2F) and '\' (%5C) <bcp14>MUST NOT</bcp14> b e permitted in | |||
the protocol field, lest an attacker be able to direct | the protocol field, lest an attacker be able to direct | |||
requests outside of the controlled "/.well-known/" prefix. | requests outside of the controlled "/.well-known/" prefix. | |||
Query and fragment values MAY be used by including '?' or | Query and fragment values <bcp14>MAY</bcp14> be used by incl uding '?' or | |||
'#' characters. | '#' characters. | |||
</t> | </li> | |||
</list> | </ol> | |||
<t> | ||||
For example, for the IdP "identity.example.com" and the protocol | For example, for the IdP "identity.example.com" and the protocol | |||
"example", the URL would be: | "example", the URL would be: | |||
</t> | </t> | |||
<figure> | ||||
<artwork><![CDATA[ | <ul empty="true"><li><https://identity.example.com/.well-known/idp-proxy/ex | |||
https://identity.example.com/.well-known/idp-proxy/example | ample></li></ul> | |||
]]></artwork> | ||||
</figure> | <t> | |||
<t> | The IdP <bcp14>MAY</bcp14> redirect requests to this URL, but th | |||
The IdP MAY redirect requests to this URL, but they MUST retain | ey <bcp14>MUST</bcp14> retain | |||
the "https" scheme. This changes the effective origin of the | the "https" scheme. This changes the effective origin of the | |||
IdP, but not the domain of the identities that the IdP is | IdP, but not the domain of the identities that the IdP is | |||
permitted to assert and validate. I.e., the IdP is still | permitted to assert and validate. That is, the IdP is still | |||
regarded as authoritative for the original domain. | regarded as authoritative for the original domain. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Authenticating Party"> | <name>Authenticating Party</name> | |||
<t> | <t> | |||
How an AP determines the appropriate IdP domain is out of | How an AP determines the appropriate IdP domain is out of | |||
scope of this specification. In general, however, the AP has | scope of this specification. In general, however, the AP has | |||
some actual account relationship with the IdP, as this | some actual account relationship with the IdP, as this | |||
identity is what the IdP is attesting to. Thus, the AP somehow | identity is what the IdP is attesting to. Thus, the AP somehow | |||
supplies the IdP information to the browser. Some potential | supplies the IdP information to the browser. Some potential | |||
mechanisms include: | mechanisms include: | |||
<list style="symbols"> | </t> | |||
<t> | <ul spacing="normal"> | |||
<li> | ||||
Provided by the user directly. | Provided by the user directly. | |||
</t> | </li> | |||
<t> | <li> | |||
Selected from some set of IdPs known to the calling site. | Selected from some set of IdPs known to the calling site | |||
E.g., a button that shows "Authenticate via Facebook | (e.g., a button that shows "Authenticate via Facebook | |||
Connect" | Connect"). | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | </section> | |||
</section> | <section numbered="true" toc="default"> | |||
<name>Relying Party</name> | ||||
<section title="Relying Party"> | <t> | |||
<t> | ||||
Unlike the AP, the RP need not have any particular | Unlike the AP, the RP need not have any particular | |||
relationship with the IdP. Rather, it needs to be able to | relationship with the IdP. Rather, it needs to be able to | |||
process whatever assertion is provided by the AP. As the | process whatever assertion is provided by the AP. As the | |||
assertion contains the IdP's identity in the <spanx | assertion contains the IdP's identity in the "idp" field of th | |||
style="verb">idp</spanx> field of the JSON-encoded object (see | e JSON-encoded object (see | |||
<xref target="sec.request-assert"/>), the URI can be | <xref target="sec.request-assert" format="default"/>), the URI | |||
can be | ||||
constructed directly from the assertion, and thus the RP can | constructed directly from the assertion, and thus the RP can | |||
directly verify the technical validity of the assertion with | directly verify the technical validity of the assertion with | |||
no user interaction. Authoritative assertions need only be | no user interaction. Authoritative assertions need only be | |||
verifiable. Third-party assertions also MUST be verified | verifiable. Third-party assertions also <bcp14>MUST</bcp14> be | |||
against local policy, as described in <xref | verified | |||
target="sec.id-format"/>. | against local policy, as described in <xref target="sec.id-for | |||
</t> | mat" format="default"/>. | |||
</section> | </t> | |||
</section> | </section> | |||
</section> | ||||
<section title="Requesting Assertions" anchor="sec.request-assert"> | <section anchor="sec.request-assert" numbered="true" toc="default"> | |||
<t> | <name>Requesting Assertions</name> | |||
<t> | ||||
The input to identity assertion is the JSON-encoded object | The input to identity assertion is the JSON-encoded object | |||
described in <xref target="sec.jsep-binding"/> that contains the | described in <xref target="sec.jsep-binding" format="default"/> that contains the | |||
set of certificate fingerprints the browser intends to use. | set of certificate fingerprints the browser intends to use. | |||
<!-- [rfced] Section 7.6: Should "input to identity assertion" be | ||||
"input to the IdP assertion process" (per Section 7) or possibly | ||||
"input to the assertion generation process" (per Section 8)? | ||||
Original: | ||||
The input to identity assertion is the JSON-encoded object described | ||||
in Section 7.4 that contains the set of certificate fingerprints the | ||||
browser intends to use. --> | ||||
This string is treated as opaque from the perspective of the | This string is treated as opaque from the perspective of the | |||
IdP. | IdP. | |||
</t> | </t> | |||
<t> | <t> | |||
The browser also identifies the origin that the PeerConnection | The browser also identifies the origin that the PeerConnection | |||
is run in, which allows the IdP to make decisions based on who | is run in, which allows the IdP to make decisions based on who | |||
is requesting the assertion. | is requesting the assertion. | |||
</t> | </t> | |||
<t> | <t> | |||
An application can optionally provide a user identifier hint | An application can optionally provide a user identifier hint | |||
when specifying an IdP. This value is a hint that the IdP can | when specifying an IdP. This value is a hint that the IdP can | |||
use to select amongst multiple identities, or to avoid providing | use to select amongst multiple identities, or to avoid providing | |||
assertions for unwanted identities. The <spanx | assertions for unwanted identities. The "username" is a string | |||
style="verb">username</spanx> is a string that has no meaning to | that has no meaning to | |||
any entity other than the IdP, it can contain any data the IdP | any entity other than the IdP; it can contain any data the IdP | |||
needs in order to correctly generate an assertion. | needs in order to correctly generate an assertion. | |||
</t> | </t> | |||
<t> | <t> | |||
An identity assertion that is successfully provided by the IdP | An identity assertion that is successfully provided by the IdP | |||
consists of the following information: | consists of the following information: | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal"> | |||
<list style="hanging"> | <dt>idp:</dt> | |||
<t hangText="idp:"> | <dd> | |||
The domain name of an IdP and the protocol string. This MAY | The domain name of an IdP and the protocol string. This <bc | |||
p14>MAY</bcp14> | ||||
identify a different IdP or protocol from the one that | identify a different IdP or protocol from the one that | |||
generated the assertion. | generated the assertion. | |||
</t> | </dd> | |||
<t hangText="assertion:"> | <dt>assertion:</dt> | |||
<dd> | ||||
An opaque value containing the assertion itself. This is | An opaque value containing the assertion itself. This is | |||
only interpretable by the identified IdP or the IdP code | only interpretable by the identified IdP or the IdP code | |||
running in the client. | running in the client. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <t> | |||
<t> | <xref target="fig.assert-ex" format="default"/> shows an example | |||
<xref target="fig.assert-ex"/> shows an example assertion | assertion | |||
formatted as JSON. In this case, the message has presumably | formatted as JSON. In this case, the message has presumably | |||
been digitally signed/MACed in some way that the IdP can later | been digitally signed/MACed in some way that the IdP can later | |||
verify it, but this is an implementation detail and out of scope | verify it, but this is an implementation detail and out of scope | |||
of this document. </t> | of this document. </t> | |||
<figure anchor="fig.assert-ex"> | ||||
<figure title="Example assertion" anchor="fig.assert-ex"> | <name>Example Assertion</name> | |||
<artwork><![CDATA[ | <sourcecode name="json-2" type="json"><![CDATA[ | |||
{ | { | |||
"idp":{ | "idp":{ | |||
"domain": "example.org", | "domain": "example.org", | |||
"protocol": "bogus" | "protocol": "bogus" | |||
}, | }, | |||
"assertion": "{\"identity\":\"bob@example.org\", | "assertion": "{\"identity\":\"bob@example.org\", | |||
\"contents\":\"abcdefghijklmnopqrstuvwyz\", | \"contents\":\"abcdefghijklmnopqrstuvwyz\", | |||
\"signature\":\"010203040506\"}" | \"signature\":\"010203040506\"}" | |||
} | } ]]></sourcecode> | |||
]]></artwork> | </figure> | |||
</figure> | <t> | |||
<t> | ||||
For use in signaling, the assertion is serialized into JSON, | For use in signaling, the assertion is serialized into JSON, | |||
<xref target="RFC4648">Base64-encoded</xref>, and used as the | <xref target="RFC4648" format="default">base64-encoded</xref>, a | |||
value of the <spanx style="verb">identity</spanx> attribute. | nd used as the | |||
IdPs SHOULD ensure that any assertions they | value of the "identity" attribute. | |||
generate cannot be interpreted in a different context. E.g., | IdPs <bcp14>SHOULD</bcp14> ensure that any assertions they | |||
generate cannot be interpreted in a different context. For examp | ||||
le, | ||||
they should use a distinct format or have separate cryptographic | they should use a distinct format or have separate cryptographic | |||
keys for assertion generation and other purposes. | keys for assertion generation and other purposes. | |||
Line breaks are inserted solely for | Line breaks are inserted solely for | |||
readability. | readability. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.user-login" numbered="true" toc="default"> | ||||
<section title="Managing User Login" anchor="sec.user-login"> | <name>Managing User Login</name> | |||
<t> | <t> | |||
In order to generate an identity assertion, the IdP needs proof of | In order to generate an identity assertion, the IdP needs proof of | |||
the user's identity. It is common practice to authenticate user s | the user's identity. It is common practice to authenticate user s | |||
(using passwords or multi-factor authentication), then use <xref | (using passwords or multi-factor authentication), then use <xref | |||
target="RFC6265">Cookies</xref> or <xref target="RFC7617">HTTP | target="RFC6265" format="default">cookies</xref> or <xref target="RFC7617" form | |||
at="default">HTTP | ||||
authentication</xref> for subsequent exchanges. | authentication</xref> for subsequent exchanges. | |||
</t> | </t> | |||
<t> | <t> | |||
The IdP proxy is able to access cookies, HTTP authentication or | The IdP proxy is able to access cookies, HTTP authentication dat | |||
a, or | ||||
other persistent session data because it operates in the securit y | other persistent session data because it operates in the securit y | |||
context of the IdP origin. Therefore, if a user is logged in, t he | context of the IdP origin. Therefore, if a user is logged in, t he | |||
IdP could have all the information needed to generate an | IdP could have all the information needed to generate an | |||
assertion. | assertion. | |||
</t> | </t> | |||
<t> | <t> | |||
An IdP proxy is unable to generate an assertion if the user is | An IdP proxy is unable to generate an assertion if the user is | |||
not logged in, or the IdP wants to interact with the user to | not logged in, or the IdP wants to interact with the user to | |||
acquire more information before generating the assertion. If | acquire more information before generating the assertion. If | |||
the IdP wants to interact with the user before generating an | the IdP wants to interact with the user before generating an | |||
assertion, the IdP proxy can fail to generate an assertion and | assertion, the IdP proxy can fail to generate an assertion and | |||
instead indicate a URL where login should proceed. | instead indicate a URL where login should proceed. | |||
</t> | </t> | |||
<t> | <t> | |||
The application can then load the provided URL to enable the | The application can then load the provided URL to enable the | |||
user to enter credentials. The communication between the | user to enter credentials. The communication between the | |||
application and the IdP is described in <xref | application and the IdP is described in <xref target="webrtc-api | |||
target="webrtc-api"/>. | " format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="sec.verify-assert" numbered="true" toc="default"> | ||||
<section title="Verifying Assertions" anchor="sec.verify-assert"> | <name>Verifying Assertions</name> | |||
<t> | <t> | |||
The input to identity validation is the assertion string taken | The input to identity validation is the assertion string taken | |||
from a decoded 'identity' attribute. | from a decoded "identity" attribute. | |||
</t> | </t> | |||
<t> | <t> | |||
The IdP proxy verifies the assertion. Depending on the identity | The IdP proxy verifies the assertion. Depending on the identity | |||
protocol, the proxy might contact the IdP server or other | protocol, the proxy might contact the IdP server or other | |||
servers. For instance, an OAuth-based protocol will likely | servers. For instance, an OAuth-based protocol will likely | |||
require using the IdP as an oracle, whereas with a | require using the IdP as an oracle, whereas with a | |||
signature-based scheme might be able to verify the assertion | signature-based scheme it might be able to verify the assertion | |||
without contacting the IdP, provided that it has cached the | without contacting the IdP, provided that it has cached the | |||
relevant public key. | relevant public key. | |||
</t> | </t> | |||
<t> | <t> | |||
Regardless of the mechanism, if verification succeeds, a | Regardless of the mechanism, if verification succeeds, a | |||
successful response from the IdP proxy consists of the following | successful response from the IdP proxy consists of the following | |||
information: | information: | |||
<list style="hanging"> | </t> | |||
<t hangText="identity:"> | <dl newline="false" spacing="normal"> | |||
<dt>identity:</dt> | ||||
<dd> | ||||
The identity of the AP from the IdP's perspective. Details | The identity of the AP from the IdP's perspective. Details | |||
of this are provided in <xref target="sec.id-format"/>. | of this are provided in <xref target="sec.id-format" format= | |||
</t> | "default"/>. | |||
<t hangText="contents:"> | </dd> | |||
<dt>contents:</dt> | ||||
<dd> | ||||
The original unmodified string provided by the AP as input | The original unmodified string provided by the AP as input | |||
to the assertion generation process. | to the assertion generation process. | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | <t> | |||
<t> | <xref target="fig.verify-ex" format="default"/> shows an example | |||
<xref target="fig.verify-ex"/> shows an example response, | response, | |||
which is JSON-formatted. | which is JSON-formatted. | |||
</t> | </t> | |||
<figure anchor="fig.verify-ex"> | ||||
<figure title="Example verification result" anchor="fig.verify-ex" | <name>Example Verification Result</name> | |||
> | <sourcecode name="json-3" type="json"><![CDATA[ | |||
<artwork> | ||||
<![CDATA[ | ||||
{ | { | |||
"identity": "bob@example.org", | "identity": "bob@example.org", | |||
"contents": "{\"fingerprint\":[ ... ]}" | "contents": "{\"fingerprint\":[ ... ]}" | |||
} | } ]]></sourcecode> | |||
]]></artwork> | </figure> | |||
</figure> | <section anchor="sec.id-format" numbered="true" toc="default"> | |||
<name>Identity Formats</name> | ||||
<section title="Identity Formats" anchor="sec.id-format"> | <t> | |||
<t> | The identity provided from the IdP to the RP browser <bcp14>MU | |||
The identity provided from the IdP to the RP browser MUST | ST</bcp14> | |||
consist of a string representing the user's identity. This | consist of a string representing the user's identity. This | |||
string is in the form "<user>@<domain>", where <spanx | string is in the form "<user>@<domain>", where "us | |||
style="verb">user</spanx> consists of any character, | er" consists of any character, | |||
and domain is aninternationalized | and domain is an internationalized | |||
domain name <xref target="RFC5890"></xref> encoded as a sequen | domain name <xref target="RFC5890" format="default"/> encoded | |||
ce of U-labels. | as a sequence of U-labels. | |||
</t> | </t> | |||
<t> | <t> | |||
The PeerConnection API MUST check this string as follows: | The PeerConnection API <bcp14>MUST</bcp14> check this string a | |||
<list style="numbers"> | s follows: | |||
<t> | </t> | |||
<ol spacing="normal" type="1"> | ||||
<li> | ||||
If the "domain" portion of the string is equal to the doma in | If the "domain" portion of the string is equal to the doma in | |||
name of the IdP proxy, then the assertion is valid, as the | name of the IdP proxy, then the assertion is valid, as the | |||
IdP is authoritative for this domain. Comparison of | IdP is authoritative for this domain. Comparison of | |||
domain names is done using the label equivalence rule | domain names is done using the label equivalence rule | |||
defined in Section 2.3.2.4 of <xref target="RFC5890"/>. | defined in <xref target="RFC5890" sectionFormat="of" secti | |||
</t> | on="2.3.2.4"/>. | |||
<t> | </li> | |||
<li> | ||||
<t> | ||||
If the "domain" portion of the string is not equal to the | If the "domain" portion of the string is not equal to the | |||
domain name of the IdP proxy, then the PeerConnection | domain name of the IdP proxy, then the PeerConnection | |||
object MUST reject the assertion unless both: | object <bcp14>MUST</bcp14> reject the assertion unless bot | |||
<list style="numbers"> | h: | |||
<t> | </t> | |||
<ol spacing="normal" type="1"> | ||||
<li> | ||||
the IdP domain is trusted as an acceptable third-party | the IdP domain is trusted as an acceptable third-party | |||
IdP; and | IdP; and | |||
</t> | </li> | |||
<t> | <li> | |||
local policy is configured to trust this IdP domain | local policy is configured to trust this IdP domain | |||
for the domain portion of the identity string. | for the domain portion of the identity string. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | <t> | |||
<t> | Any '@' or '%' characters in the "user" portion of the | |||
Any "@" or "%" characters in the "user" portion of the | identity <bcp14>MUST</bcp14> be escaped according to the "perc | |||
identity MUST be escaped according to the "Percent-Encoding" | ent-encoding" | |||
rules defined in Section 2.1 of <xref | rules defined in <xref target="RFC3986" sectionFormat="of" sec | |||
target="RFC3986"/>. Characters other than "@" and "%" MUST NOT | tion="2.1"/>. Characters other than '@' and '%' <bcp14>MUST NOT</bcp14> | |||
be percent-encoded. For example, with a "user" of "user@133" a nd | be percent-encoded. For example, with a "user" of "user@133" a nd | |||
a "domain" of "identity.example.com", the resulting string wil l | a "domain" of "identity.example.com", the resulting string wil l | |||
be encoded as "user%40133@identity.example.com". | be encoded as "user%40133@identity.example.com". | |||
</t> | </t> | |||
<t> | <t> | |||
Implementations are cautioned to take care when displaying | Implementations are cautioned to take care when displaying | |||
user identities containing escaped "@" characters. If such | user identities containing escaped '@' characters. If such | |||
characters are unescaped prior to display, implementations | characters are unescaped prior to display, implementations | |||
MUST distinguish between the domain of the IdP proxy and any | <bcp14>MUST</bcp14> distinguish between the domain of the IdP proxy and any | |||
domain that might be implied by the portion of the | domain that might be implied by the portion of the | |||
"<user>" portion that appears after the escaped "@" | "<user>" portion that appears after the escaped "@" | |||
sign. | sign. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | ||||
<section anchor="sec.sec-cons" numbered="true" toc="default"> | ||||
<name>Security Considerations</name> | ||||
<t> | ||||
Much of the security analysis of this problem is contained in <xref ta | ||||
rget="RFC8826" format="default"/> or in the discussion of the | ||||
particular issues above. | ||||
</section> | <!-- [rfced] Section 9: What does "this problem" refer to here? | |||
<section title="Security Considerations" anchor="sec.sec-cons"> | Original: | |||
<t> | Much of the security analysis of this problem is contained in | |||
Much of the security analysis of this problem is contained in <xref | [I-D.ietf-rtcweb-security] or in the discussion of the particular | |||
target="I-D.ietf-rtcweb-security"/> or in the discussion of the | issues above. --> | |||
particular issues above. In order to avoid repetition, this section | ||||
In order to avoid repetition, this section | ||||
focuses on (a) residual threats that are not addressed by this | focuses on (a) residual threats that are not addressed by this | |||
document and (b) threats produced by failure/misbehavior of one of the | document and (b) threats produced by failure/misbehavior of one of the | |||
components in the system. | components in the system. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Communications Security"> | <name>Communications Security</name> | |||
<t> | <t> | |||
IF HTTPS is not used to secure communications to the signaling | If HTTPS is not used to secure communications to the signaling | |||
server, and the identity mechanism used in | server, and the identity mechanism used in | |||
<xref target="sec.generic.idp"/> is not used, | <xref target="sec.generic.idp" format="default"/> is not used, | |||
then any on-path attacker can replace the DTLS-SRTP fingerprints | then any on-path attacker can replace the DTLS-SRTP fingerprints | |||
in the handshake and thus substitute its own identity for that | in the handshake and thus substitute its own identity for that | |||
of either endpoint. | of either endpoint. | |||
</t> | ||||
<t> | <!-- [rfced] Section 9.1: Should "the identity mechanism used in | |||
Section 7" be "the identity mechanism used in Section 7.1" or | ||||
"the identity mechanisms used in Section 7"? We ask because we see | ||||
"identity service mechanisms in Section 7" in the next paragraph. | ||||
Also, we changed "IF" to "If"; please let us know if the | ||||
capitalization was intentional. | ||||
Original: | ||||
IF HTTPS is not used to secure communications to the signaling | ||||
server, and the identity mechanism used in Section 7 is not used, | ||||
then any on-path attacker can replace the DTLS-SRTP fingerprints in | ||||
the handshake and thus substitute its own identity for that of either | ||||
endpoint. --> | ||||
</t> | ||||
<t> | ||||
Even if HTTPS is used, the signaling server can | Even if HTTPS is used, the signaling server can | |||
potentially mount a man-in-the-middle attack unless implementations | potentially mount a man-in-the-middle attack unless implementations | |||
have some mechanism for independently verifying keys. The UI | have some mechanism for independently verifying keys. The UI | |||
requirements in <xref target="sec.proposal.comsec"/> are designed to | requirements in <xref target="sec.proposal.comsec" format="default"/ > are designed to | |||
provide such a mechanism for motivated/security conscious users, but | provide such a mechanism for motivated/security conscious users, but | |||
are not suitable for general use. The identity service mechanisms | are not suitable for general use. The identity service mechanisms | |||
in <xref target="sec.generic.idp"/> are more suitable for general | in <xref target="sec.generic.idp" format="default"/> are more suitab le for general | |||
use. Note, however, that a malicious signaling service can strip off | use. Note, however, that a malicious signaling service can strip off | |||
any such identity assertions, though it cannot forge new ones. Note | any such identity assertions, though it cannot forge new ones. Note | |||
that all of the third-party security mechanisms available (whether | that all of the third-party security mechanisms available (whether | |||
X.509 certificates or a third-party IdP) rely on the security of the | X.509 certificates or a third-party IdP) rely on the security of the | |||
third party--this is of course also true of the user's connection to the | third party -- this is of course also true of the user's connection to the | |||
Web site itself. Users who wish to assure themselves of security | Web site itself. Users who wish to assure themselves of security | |||
against a malicious identity provider can only do so by verifying | against a malicious identity provider can only do so by verifying | |||
peer credentials directly, e.g., by checking the peer's fingerprint | peer credentials directly, e.g., by checking the peer's fingerprint | |||
against a value delivered out of band. | against a value delivered out of band. | |||
</t> | </t> | |||
<t> | ||||
<t> | ||||
In order to protect against malicious content JavaScript, that | In order to protect against malicious content JavaScript, that | |||
JavaScript MUST NOT be allowed to have direct access to---or perform | JavaScript <bcp14>MUST NOT</bcp14> be allowed to have direct | |||
computations with---DTLS keys. For instance, if content JS were able | access to -- or perform | |||
computations with -- DTLS keys. For instance, if content JS were abl | ||||
e | ||||
to compute digital signatures, then it would be possible for content | to compute digital signatures, then it would be possible for content | |||
JS to get an identity assertion for a browser's generated key and | JS to get an identity assertion for a browser's generated key and | |||
then use that assertion plus a signature by the key to authenticate | then use that assertion plus a signature by the key to authenticate | |||
a call protected under an ephemeral Diffie-Hellman (DH) key controll ed by the content | a call protected under an ephemeral Diffie-Hellman (DH) key controll ed by the content | |||
JS, thus violating the security guarantees otherwise provided by the | JS, thus violating the security guarantees otherwise provided by the | |||
IdP mechanism. Note that it is not sufficient merely to deny the | IdP mechanism. Note that it is not sufficient merely to deny the | |||
content JS direct access to the keys, as some have suggested doing | content JS direct access to the keys, as some have suggested doing | |||
with the WebCrypto API <xref target="webcrypto"/>. The JS must | with the WebCrypto API <xref target="webcrypto" format="default"/>. The JS must | |||
also not be allowed to perform operations that would be valid for a | also not be allowed to perform operations that would be valid for a | |||
DTLS endpoint. By far the safest approach is simply to deny the | DTLS endpoint. By far the safest approach is simply to deny the | |||
ability to perform any operations that depend on secret information | ability to perform any operations that depend on secret information | |||
associated with the key. Operations that depend on public | associated with the key. Operations that depend on public | |||
information, such as exporting the public key are of course safe. | information, such as exporting the public key, are of course safe. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Privacy"> | <name>Privacy</name> | |||
<t> | <t> | |||
The requirements in this document are intended to allow: | The requirements in this document are intended to allow: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li> | |||
<t> | ||||
Users to participate in calls without revealing their location. | Users to participate in calls without revealing their location. | |||
</t> | </li> | |||
<t> | <li> | |||
Potential callees to avoid revealing their location and even | Potential callees to avoid revealing their location and even | |||
presence status prior to agreeing to answer a call. | presence status prior to agreeing to answer a call. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | ||||
However, these privacy protections come at a performance cost in | However, these privacy protections come at a performance cost in | |||
terms of using TURN relays and, in the latter case, delaying | terms of using TURN relays and, in the latter case, delaying | |||
ICE. Sites SHOULD make users aware of these tradeoffs. | ICE. Sites <bcp14>SHOULD</bcp14> make users aware of these trade&nbh | |||
</t> | y;offs. | |||
<t> | </t> | |||
<t> | ||||
Note that the protections provided here assume a non-malicious | Note that the protections provided here assume a non-malicious | |||
calling service. As the calling service always knows the users | calling service. As the calling service always knows the user's | |||
status and (absent the use of a technology like Tor) their IP | status and (absent the use of a technology like Tor) their IP | |||
address, they can violate the users privacy at will. Users who wish | address, they can violate the user's privacy at will. Users who wis h | |||
privacy against the calling sites they are using must use separate | privacy against the calling sites they are using must use separate | |||
privacy enhancing technologies such as Tor. Combined WebRTC/Tor | privacy-enhancing technologies such as Tor. Combined WebRTC/To | |||
implementations SHOULD arrange to route the media as well as the | r | |||
signaling through Tor. Currently this will produce very suboptimal | implementations <bcp14>SHOULD</bcp14> arrange to route the media as | |||
well as the | ||||
signaling through Tor. Currently this will produce very subopt | ||||
imal | ||||
performance. | performance. | |||
</t> | </t> | |||
<t> | <t> | |||
Additionally, any identifier which persists across multiple calls is | Additionally, any identifier that persists across multiple calls is | |||
potentially a problem for privacy, especially for anonymous calling | potentially a problem for privacy, especially for anonymous calling | |||
services. Such services SHOULD instruct the browser to use separate | services. Such services <bcp14>SHOULD</bcp14> instruct the browser t o use separate | |||
DTLS keys for each call and also to use TURN throughout the | DTLS keys for each call and also to use TURN throughout the | |||
call. Otherwise, the other side will learn linkable information that | call. Otherwise, the other side will learn linkable information that | |||
would allow them to correlate the browser across multiple calls. | would allow them to correlate the browser across multiple calls. | |||
Additionally, browsers SHOULD implement the privacy-preserving CNAME | Additionally, browsers <bcp14>SHOULD</bcp14> implement the privacy-p | |||
generation mode of <xref target="RFC7022"/>. | reserving CNAME | |||
</t> | generation mode of <xref target="RFC7022" format="default"/>. | |||
</section> | </t> | |||
</section> | ||||
<section title="Denial of Service"> | <section numbered="true" toc="default"> | |||
<t> | <name>Denial of Service</name> | |||
<t> | ||||
The consent mechanisms described in this document are intended to | The consent mechanisms described in this document are intended to | |||
mitigate denial of service attacks in which an attacker uses clients | mitigate DoS attacks in which an attacker uses clients | |||
to send large amounts of traffic to a victim without the consent of | to send large amounts of traffic to a victim without the consent of | |||
the victim. While these mechanisms are sufficient to protect victims | the victim. While these mechanisms are sufficient to protect victims | |||
who have not implemented WebRTC at all, WebRTC implementations need | who have not implemented WebRTC at all, WebRTC implementations need | |||
to be more careful. | to be more careful. | |||
</t> | </t> | |||
<t> | <t> | |||
Consider the case of a call center which accepts calls via | Consider the case of a call center which accepts calls via | |||
WebRTC. An attacker proxies the call center's front-end and arranges | WebRTC. An attacker proxies the call center's front-end and arranges | |||
for multiple clients to initiate calls to the call center. Note that | for multiple clients to initiate calls to the call center. Note that | |||
this requires user consent in many cases but because the data | this requires user consent in many cases, but because the data | |||
channel does not need consent, he can use that directly. Since ICE | channel does not need consent, he can use that directly. Since ICE | |||
will complete, browsers can then be induced to send large amounts of | will complete, browsers can then be induced to send large amounts of | |||
data to the victim call center if it supports the data channel at | data to the victim call center if it supports the data channel at | |||
all. Preventing this attack requires that automated WebRTC | all. Preventing this attack requires that automated WebRTC | |||
implementations implement sensible flow control and have the ability | implementations implement sensible flow control and have the ability | |||
to triage out (i.e., stop responding to ICE probes on) calls which | to triage out (i.e., stop responding to ICE probes on) calls which | |||
are behaving badly, and especially to be prepared to remotely | are behaving badly, and especially to be prepared to remotely | |||
throttle the data channel in the absence of plausible audio and | throttle the data channel in the absence of plausible audio and | |||
video (which the attacker cannot control). | video (which the attacker cannot control). | |||
</t> | </t> | |||
<t> | <t> | |||
Another related attack is for the signaling service to swap the ICE | Another related attack is for the signaling service to swap the ICE | |||
candidates for the audio and video streams, thus forcing a browser | candidates for the audio and video streams, thus forcing a browser | |||
to send video to the sink that the other victim expects will contain | to send video to the sink that the other victim expects will contain | |||
audio (perhaps it is only expecting audio!) potentially causing | audio (perhaps it is only expecting audio!), potentially causing | |||
overload. Muxing multiple media flows over a single transport makes | overload. Muxing multiple media flows over a single transport makes | |||
it harder to individually suppress a single flow by denying ICE | it harder to individually suppress a single flow by denying ICE | |||
keepalives. Either media-level (RTCP) mechanisms must be used or the | keepalives. Either media-level (RTCP) mechanisms must be used or the | |||
implementation must deny responses entirely, thus terminating the | implementation must deny responses entirely, thus terminating the | |||
call. | call. | |||
</t> | </t> | |||
<t> | <t> | |||
Yet another attack, suggested by Magnus Westerlund, is for the | Yet another attack, suggested by Magnus Westerlund, is for the | |||
attacker to cross-connect offers and answers as follows. It induces | attacker to cross-connect offers and answers as follows. It induces | |||
the victim to make a call and then uses its control of other users | the victim to make a call and then uses its control of other users' | |||
browsers to get them to attempt a call to someone. It then | browsers to get them to attempt a call to someone. It then | |||
translates their offers into apparent answers to the victim, which | translates their offers into apparent answers to the victim, which | |||
looks like large-scale parallel forking. The victim still responds | looks like large-scale parallel forking. The victim still responds | |||
to ICE responses and now the browsers all try to send media to the | to ICE responses, and now the browsers all try to send media to the | |||
victim. Implementations can defend themselves from this attack by | victim. Implementations can defend themselves from this attack by | |||
only responding to ICE Binding Requests for a limited number of | only responding to ICE Binding Requests for a limited number of | |||
remote ufrags (this is the reason for the requirement that the JS | remote ufrags (this is the reason for the requirement that the JS | |||
not be able to control the ufrag and password). | not be able to control the ufrag and password). | |||
</t> | </t> | |||
<t> | <t> | |||
<xref target="I-D.ietf-rtcweb-rtp-usage"/> Section 13 documents a nu | <xref target="RFC8834" sectionFormat="comma" section="13"/> document | |||
mber | s a number | |||
of potential RTCP-based DoS attacks and countermeasures. | of potential RTCP-based DoS attacks and countermeasures. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that attacks based on confusing one end or the other about | Note that attacks based on confusing one end or the other about | |||
consent are possible even in the face of the third-party identity | consent are possible even in the face of the third-party identity | |||
mechanism as long as major parts of the signaling messages are not | mechanism as long as major parts of the signaling messages are not | |||
signed. On the other hand, signing the entire message severely | signed. On the other hand, signing the entire message severely | |||
restricts the capabilities of the calling application, so there are | restricts the capabilities of the calling application, so there are | |||
difficult tradeoffs here. | difficult trade&nbhy;offs here. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IdP Authentication Mechanism"> | <name>IdP Authentication Mechanism</name> | |||
<t> | <t> | |||
This mechanism relies for its security on the IdP and on the | This mechanism relies for its security on the IdP and on the | |||
PeerConnection correctly enforcing the security invariants described | PeerConnection correctly enforcing the security invariants described | |||
above. At a high level, the IdP is attesting that the user | above. At a high level, the IdP is attesting that the user | |||
identified in the assertion wishes to be associated with the | identified in the assertion wishes to be associated with the | |||
assertion. Thus, it must not be possible for arbitrary third parties | assertion. Thus, it must not be possible for arbitrary third parties | |||
to get assertions tied to a user or to produce assertions that RPs | to get assertions tied to a user or to produce assertions that RPs | |||
will accept. | will accept. | |||
</t> | </t> | |||
<section anchor="sec.pc-origin" numbered="true" toc="default"> | ||||
<section title="PeerConnection Origin Check" anchor="sec.pc-origin"> | <name>PeerConnection Origin Check</name> | |||
<t> | <t> | |||
Fundamentally, the IdP proxy is just a piece of HTML and JS loaded | Fundamentally, the IdP proxy is just a piece of HTML and JS loaded | |||
by the browser, so nothing stops a Web attacker from creating | by the browser, so nothing stops a Web attacker from creating | |||
their own IFRAME, loading the IdP proxy HTML/JS, and requesting a | their own IFRAME, loading the IdP proxy HTML/JS, and requesting a | |||
signature over his own keys rather than those generated in | signature over his own keys rather than those generated in | |||
the browser. However, that proxy would be in the | the browser. However, that proxy would be in the | |||
attacker's origin, not the IdP's origin. Only the | attacker's origin, not the IdP's origin. Only the | |||
browser itself can instantiate a context that (a) is in the IdP's | browser itself can instantiate a context that (a) is in the I | |||
origin and | dP's origin and | |||
(b) exposes the correct API surface. Thus, the IdP proxy on | (b) exposes the correct API surface. Thus, the IdP proxy on | |||
the sender's side MUST ensure that it is running in the IdP's orig | the sender's side <bcp14>MUST</bcp14> ensure that it is running in | |||
in | the IdP's origin | |||
prior to issuing assertions. | prior to issuing assertions. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that this check only asserts that the browser (or some other | Note that this check only asserts that the browser (or some other | |||
entity with access to the user's authentication data) attests to | entity with access to the user's authentication data) attests to | |||
the request and hence to the fingerprint. It does not demonstrate | the request and hence to the fingerprint. It does not demonstrate | |||
that the browser has access to the associated private | that the browser has access to the associated private | |||
key, and therefore an attacker can attach their own identity | key, and therefore an attacker can attach their own identity | |||
to another party's keying material, thus making a call which | to another party's keying material, thus making a call which | |||
comes from Alice appear to come from the attacker. | comes from Alice appear to come from the attacker. | |||
See <xref target="I-D.ietf-mmusic-sdp-uks"/> for defenses against this | See <xref target="RFC8844" format="default"/> for defenses against this | |||
form of attack. | form of attack. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.sec-idp-uri" numbered="true" toc="default"> | ||||
<section title="IdP Well-known URI" anchor="sec.sec-idp-uri"> | <name>IdP Well-Known URI</name> | |||
<t> | <t> | |||
As described in <xref target="sec.idp-uri"/> the IdP proxy HTML/JS | As described in <xref target="sec.idp-uri" format="default"/>, the | |||
IdP proxy HTML/JS | ||||
landing page is located at a well-known URI based on the IdP's | landing page is located at a well-known URI based on the IdP's | |||
domain name. This requirement prevents an attacker who can write | domain name. This requirement prevents an attacker who can write | |||
some resources at the IdP (e.g., on one's Facebook wall) from | some resources at the IdP (e.g., on one's Facebook wall) from | |||
being able to impersonate the IdP. | being able to impersonate the IdP. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Privacy of IdP-generated identities and the hosting si | <name>Privacy of IdP-Generated Identities and the Hosting Site</name> | |||
te"> | <t> | |||
<t> | ||||
Depending on the structure of the IdP's assertions, the calling | Depending on the structure of the IdP's assertions, the calling | |||
site may learn the user's identity from the perspective of the | site may learn the user's identity from the perspective of the | |||
IdP. In many cases this is not an issue because the user is | IdP. In many cases, this is not an issue because the user is | |||
authenticating to the site via the IdP in any case, for instance | authenticating to the site via the IdP in any case -- for instance | |||
, | ||||
when the user has logged in with Facebook Connect and is then | when the user has logged in with Facebook Connect and is then | |||
authenticating their call with a Facebook identity. However, in | authenticating their call with a Facebook identity. However, in | |||
other case, the user may not have already revealed their identity | other cases, the user may not have already revealed their identity | |||
to the site. In general, IdPs SHOULD either verify that the user | to the site. In general, IdPs <bcp14>SHOULD</bcp14> either verify | |||
that the user | ||||
is willing to have their identity revealed to the site (e.g., | is willing to have their identity revealed to the site (e.g., | |||
through the usual IdP permissions dialog) or arrange that the | through the usual IdP permissions dialog) or arrange that the | |||
identity information is only available to known RPs (e.g., social | identity information is only available to known RPs (e.g., social | |||
graph adjacencies) but not to the calling site. The "domain" field | graph adjacencies) but not to the calling site. The "domain" field | |||
of the assertion request can be used to check that the user has | of the assertion request can be used to check that the user has | |||
agreed to disclose their identity to the calling site; because it | agreed to disclose their identity to the calling site; because it | |||
is supplied by the PeerConnection it can be trusted to be correct. | is supplied by the PeerConnection it can be trusted to be correct. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.sec-third-party" numbered="true" toc="default"> | ||||
<section title="Security of Third-Party IdPs" anchor="sec.sec-third-pa | <name>Security of Third-Party IdPs</name> | |||
rty"> | <t> | |||
<t> | ||||
As discussed above, each third-party IdP represents a new | As discussed above, each third-party IdP represents a new | |||
universal trust point and therefore the number of these IdPs needs | universal trust point and therefore the number of these IdPs needs | |||
to be quite limited. Most IdPs, even those which issue unqualified | to be quite limited. Most IdPs, even those which issue unqualified | |||
identities such as Facebook, can be recast as authoritative IdPs | identities such as Facebook, can be recast as authoritative IdPs | |||
(e.g., 123456@facebook.com). However, in such cases, the user | (e.g., 123456@facebook.com). However, in such cases, the user | |||
interface implications are not entirely desirable. One | interface implications are not entirely desirable. One | |||
intermediate approach is to have special (potentially user | intermediate approach is to have a special (potentially user | |||
configurable) UI for large authoritative IdPs, thus allowing the | configurable) UI for large authoritative IdPs, thus allowing the | |||
user to instantly grasp that the call is being authenticated by | user to instantly grasp that the call is being authenticated by | |||
Facebook, Google, etc. | Facebook, Google, etc. | |||
</t> | </t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Confusable Characters"> | <name>Confusable Characters</name> | |||
<t> | <t> | |||
Because a broad range of characters are permitted in identity | Because a broad range of characters are permitted in identity | |||
strings, it may be possible for attackers to craft identities | strings, it may be possible for attackers to craft identities | |||
which are confusable with other identities (see | which are confusable with other identities (see | |||
<xref target="RFC6943"/> for more on this topic). This is | <xref target="RFC6943" format="default"/> for more on this topic ). This is | |||
a problem with any identifier space of this type | a problem with any identifier space of this type | |||
(e.g., e-mail addresses). | (e.g., email addresses). | |||
Those minting identifers should avoid mixed scripts and similar | Those minting identifiers should avoid mixed scripts and similar | |||
confusable characters. Those presenting these identifiers to a | confusable characters. Those presenting these identifiers to a | |||
user should consider highlighting cases of mixed script usage | user should consider highlighting cases of mixed script usage | |||
(see <xref target="RFC5890"/>, section 4.4). Other best practice | (see <xref target="RFC5890" sectionFormat="comma" section="4.4"/ | |||
s are still in development. | >). Other best practices are still in development. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
<section title="Web Security Feature Interactions"> | <section numbered="true" toc="default"> | |||
<t> | <name>Web Security Feature Interactions</name> | |||
<t> | ||||
A number of optional Web security features have the potential to | A number of optional Web security features have the potential to | |||
cause issues for this mechanism, as discussed below. | cause issues for this mechanism, as discussed below. | |||
</t> | </t> | |||
<section anchor="sec.popup-blocking" numbered="true" toc="default"> | ||||
<section title="Popup Blocking" anchor="sec.popup-blocking"> | <name>Popup Blocking</name> | |||
<t> | <t> | |||
When popup blocking is in use, the IdP proxy is unable to genera | When popup blocking is in use, the IdP proxy is unable to genera | |||
te popup windows, dialogs or | te popup windows, dialogs, or | |||
any other form of user interactions. This prevents the IdP | any other form of user interactions. This prevents the IdP | |||
proxy from being used to circumvent user interaction. The | proxy from being used to circumvent user interaction. The | |||
"LOGINNEEDED" message allows the IdP proxy to inform the calling | "LOGINNEEDED" message allows the IdP proxy to inform the calling | |||
site of a need for user login, providing the information | site of a need for user login, providing the information | |||
necessary to satisfy this requirement without resorting to | necessary to satisfy this requirement without resorting to | |||
direct user interaction from the IdP proxy itself. | direct user interaction from the IdP proxy itself. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec.3rd-party-cookies" numbered="true" toc="default"> | ||||
<section title="Third Party Cookies" anchor="sec.3rd-party-cookies"> | <name>Third Party Cookies</name> | |||
<t> | <t> | |||
Some browsers allow users to block third party cookies (cookies | Some browsers allow users to block third party cookies (cookies | |||
associated with origins other than the top level page) for | associated with origins other than the top-level page) for | |||
privacy reasons. Any IdP which uses cookies to persist logins | privacy reasons. Any IdP which uses cookies to persist logins | |||
will be broken by third-party cookie blocking. One option is to | will be broken by third-party cookie blocking. One option is to | |||
accept this as a limitation; another is to have the | accept this as a limitation; another is to have the | |||
PeerConnection object disable third-party cookie blocking for | PeerConnection object disable third-party cookie blocking for | |||
the IdP proxy. | the IdP proxy. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | ||||
<section title="IANA Considerations" anchor="sec.iana-cons"> | <section anchor="sec.iana-cons" numbered="true" toc="default"> | |||
<t> | <name>IANA Considerations</name> | |||
This specification defines the <spanx style="verb">identity</spanx> | <t> | |||
SDP attribute per the procedures of Section 8.2.4 of <xref | This specification defines the "identity" | |||
target="RFC4566"/>. The required information for the registration is | SDP attribute per the procedures of <xref target="RFC4566" sectionForm | |||
at="of" section="8.2.4"/>. The required information for the registration is | ||||
included here: | included here: | |||
<list style="hanging"> | </t> | |||
<t hangText="Contact Name:">IESG (iesg@ietf.org)</t> | <dl newline="false" spacing="normal"> | |||
<t hangText="Attribute Name:">identity</t> | <dt>Contact Name:</dt> | |||
<t hangText="Long Form:">identity</t> | <dd>IESG (iesg@ietf.org)</dd> | |||
<t hangText="Type of Attribute:">session-level</t> | <dt>Attribute Name:</dt> | |||
<t hangText="Charset Considerations:">This attribute is not subject | <dd>identity</dd> | |||
to the charset attribute.</t> | <dt>Long Form:</dt> | |||
<t hangText="Purpose:">This attribute carries an identity assertion, | <dd>identity</dd> | |||
binding an identity to the transport-level security session.</t> | <dt>Type of Attribute:</dt> | |||
<t hangText="Appropriate Values:">See <xref | <dd>session</dd> | |||
target="sec.sdp-id-attr"/> of RFCXXXX [[Editor Note: This | <dt>Charset Considerations:</dt> | |||
document.]]</t> | <dd>This attribute is not subject | |||
<t hangText="Mux Category:">NORMAL.</t> | to the charset attribute.</dd> | |||
</list> | <dt>Purpose:</dt> | |||
</t> | <dd>This attribute carries an identity assertion, | |||
<t> | binding an identity to the transport-level security session.</dd> | |||
This section reqisters the <spanx style="verb">idp-proxy</spanx> well- | <dt>Appropriate Values:</dt> | |||
known | <dd>See <xref target="sec.sdp-id-attr" format="default"/> of RFC 8827.</ | |||
URI from <xref target="RFC5785"/>. | dd> | |||
<list style="hanging"> | <dt>Mux Category:</dt> | |||
<t hangText="URI suffix:">idp-proxy</t> | <dd>NORMAL</dd> | |||
<t hangText="Change controller:">IETF</t> | </dl> | |||
</list> | ||||
</t> | ||||
</section> | ||||
<section title="Acknowledgements"> | ||||
<t> | <t> | |||
Bernard Aboba, Harald Alvestrand, Richard Barnes, Dan Druta, Cullen | This section registers the "idp-proxy" well-known | |||
Jennings, Hadriel Kaplan, Matthew Kaufman, Jim McEachern, Martin | URI from <xref target="RFC5785" format="default"/>. | |||
Thomson, Magnus Westerland. Matthew Kaufman provided the UI material in | ||||
<xref target="sec.proposal.comsec"/>. Christer Holmberg provided | ||||
the initial version of <xref target="sec.sdp-id-attr-oa"/>. | ||||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | ||||
<dt>URI suffix:</dt> | ||||
<dd>idp-proxy</dd> | ||||
<dt>Change controller:</dt> | ||||
<dd>IETF</dd> | ||||
</dl> | ||||
</section> | </section> | |||
</middle> | ||||
<back> | ||||
<references> | ||||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2818. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3264. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3711. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3986. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4566. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4568. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4648. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5246. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5763. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5764. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5785. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5890. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6347. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6454. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7022. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7675. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7918. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8122. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8259. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8261. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8445. | ||||
xml"/> | ||||
<section title="Changes"> | <!-- draft-ietf-rtcweb-overview: RFC 8825 --> | |||
<t> [RFC Editor: Please remove this section prior to publication.]</t> | <reference anchor="RFC8825" target="https://www.rfc-editor.org/info/rfc8825"> | |||
<section title="Changes since -15"> | <front> | |||
<t>Rewrite the Identity section in more conventional offer/answer format | <title>Overview: Real-Time Protocols for Browser-Based Applications</title> | |||
.</t> | <author initials="H." surname="Alvestrand" fullname="Harald T. Alvestrand"> | |||
<t>Clarify rules on changing identities.</t> | <organization /> | |||
</section> | </author> | |||
<date month="October" year="2020" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8825" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8825"/> | ||||
</reference> | ||||
<section title="Changes since -11"> | <!--draft-ietf-rtcweb-security: RFC 8826 --> | |||
<t> | <reference anchor="RFC8826" target="https://www.rfc-editor.org/info/rfc8826"> | |||
Update discussion of IdP security model | <front> | |||
</t> | <title>Security Considerations for WebRTC</title> | |||
<author initials='E.' surname='Rescorla' fullname='Eric Rescorla'> | ||||
<organization/> | ||||
</author> | ||||
<date month='October' year='2020'/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8826"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8826"/> | ||||
</reference> | ||||
<t> | <!-- draft-ietf-rtcweb-rtp-usage; RFC 8834 --> | |||
Replace "domain name" with RFC 3986 Authority | <reference anchor="RFC8834" target="https://www.rfc-editor.org/info/rfc8834"> | |||
</t> | <front> | |||
<title>Media Transport and Use of RTP in WebRTC</title> | ||||
<author initials="C." surname="Perkins" fullname="Colin Perkins"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="M." surname="Westerlund" fullname="Magnus Westerlund"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="J." surname="Ott" fullname="Jörg Ott"> | ||||
<organization /> | ||||
</author> | ||||
<date month="October" year="2020" /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8834" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8834"/> | ||||
</reference> | ||||
<t> | <!-- draft-ietf-mmusic-sdp-uks; RFC 8844 --> | |||
Clean up discussion of how to generate IdP URI. | <reference anchor='RFC8844' target="https://www.rfc-editor.org/info/rfc8844"> | |||
</t> | <front> | |||
<title>Unknown Key Share Attacks on uses of TLS with the Session Description Pro | ||||
tocol (SDP)</title> | ||||
<t> | <author initials='M' surname='Thomson' fullname='Martin Thomson'> | |||
Remove obsolete text about null cipher suites. | <organization /> | |||
</t> | </author> | |||
<t> | <author initials='E' surname='Rescorla' fullname='Eric Rescorla'> | |||
Remove obsolete appendixes about older IdP systems | <organization /> | |||
</t> | </author> | |||
<t> | <date month="October" year="2020"/> | |||
Require support for ECDSA, PFS, and AEAD | ||||
</t> | ||||
</section> | ||||
<section title="Changes since -10"> | ||||
<t> | ||||
Update cipher suite profiles. | ||||
</t> | ||||
<t> | ||||
Rework IdP interaction based on implementation experience in | ||||
Firefox. | ||||
</t> | ||||
</section> | ||||
<section title="Changes since -06"> | </front> | |||
<t> | <seriesInfo name="RFC" value="8859"/> | |||
Replaced RTCWEB and RTC-Web with WebRTC, except when referring to the | <seriesInfo name="DOI" value="10.17487/RFC8859"/> | |||
IETF WG | ||||
</t> | ||||
<t> | ||||
Forbade use in mixed content as discussed in Orlando. | ||||
</t> | ||||
<t> | ||||
Added a requirement to surface NULL ciphers to the top-level. | ||||
</t> | ||||
<t> | ||||
Tried to clarify SRTP versus DTLS-SRTP. | ||||
</t> | ||||
<t> | ||||
Added a section on screen sharing permissions. | ||||
</t> | ||||
<t> | ||||
Assorted editorial work. | ||||
</t> | ||||
</section> | ||||
<section title="Changes since -05"> | </reference> | |||
<t> | ||||
The following changes have been made since the -05 draft. | ||||
</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t> | ||||
Response to comments from Richard Barnes | ||||
</t> | ||||
<t> | ||||
More explanation of the IdP security properties and the federation | ||||
use case. | ||||
</t> | ||||
<t> | ||||
Editorial cleanup. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title="Changes since -03"> | <!-- draft-ietf-rtcweb-jsep; RFC 8829 --> | |||
<t> | <reference anchor="RFC8829" target="https://www.rfc-editor.org/info/rfc8829"> | |||
Version -04 was a version control mistake. Please ignore. | <front> | |||
</t> | <title>JavaScript Session Establishment Protocol (JSEP)</title> | |||
<t> | <author initials='J.' surname='Uberti' fullname='Justin Uberti'> | |||
The following changes have been made since the -04 draft. | <organization/> | |||
</t> | </author> | |||
<t> | <author initials="C." surname="Jennings" fullname="Cullen Jennings"> | |||
<list style="symbols"> | <organization/> | |||
<t> | </author> | |||
Move origin check from IdP to RP per discussion in YVR. | <author initials="E." surname="Rescorla" fullname="Eric Rescorla" | |||
</t> | role="editor"> | |||
<t> | <organization/> | |||
Clarified treatment of X.509-level identities. | </author> | |||
</t> | <date month='October' year='2020'/> | |||
<t> | </front> | |||
Editorial cleanup. | <seriesInfo name="RFC" value="8829"/> | |||
</t> | <seriesInfo name="DOI" value="10.17487/RFC8829"/> | |||
</list> | </reference> | |||
</t> | ||||
</section> | ||||
<section title="Changes since -03"> | <reference anchor="webcrypto" target="https://www.w3.org/TR/2017/REC-Web | |||
</section> | CryptoAPI-20170126/"> | |||
<front> | ||||
<title>Web Cryptography API</title> | ||||
<author initials="M" surname="Watson" fullname="Mark Watson"> | ||||
</author> | ||||
<date month="January" year="2017" day="26"/> | ||||
</front> | ||||
<refcontent>W3C Recommendation</refcontent> | ||||
</reference> | ||||
<section title="Changes since -02"> | <!-- [rfced] Normative References: Because the citation for | |||
<t> | [webcrypto] is used generally in text, we updated this listing per | |||
The following changes have been made since the -02 draft. | <https://www.w3.org/TR/WebCryptoAPI/>. Please let us know any | |||
</t> | objections. | |||
<t> | ||||
<list style="symbols"> | ||||
<t> | ||||
Forbid persistent HTTP permissions. | ||||
</t> | ||||
<t> | ||||
Clarified the text in S 5.4 to clearly refer to requirements on | ||||
the API to provide functionality to the site. | ||||
</t> | ||||
<t> | ||||
Fold in the IETF portion of draft-rescorla-rtcweb-generic-idp | ||||
</t> | ||||
<t> | ||||
Retarget the continuing consent section to assume Binding Requests | ||||
</t> | ||||
<t> | ||||
Added some more privacy and linkage text in various places. | ||||
</t> | ||||
<t> | ||||
Editorial improvements | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
</section> | ||||
</middle> | ||||
<back> | Original: | |||
[webcrypto] | ||||
editors, W., "Web Cryptography API", June 2013. | ||||
<references title="Normative References"> | Available at http://www.w3.org/TR/WebCryptoAPI/ | |||
&RFC2119; | ||||
&RFC2818; | ||||
&RFC3264; | ||||
&RFC3711; | ||||
&RFC3986; | ||||
&RFC4566; | ||||
&RFC4568; | ||||
&RFC4648; | ||||
&RFC5246; | ||||
&RFC5763; | ||||
&RFC5764; | ||||
&RFC5785; | ||||
&RFC5890; | ||||
&RFC6347; | ||||
&RFC6454; | ||||
&RFC7022; | ||||
&RFC7675; | ||||
&RFC7918; | ||||
&RFC8174; | ||||
&RFC8122; | ||||
&RFC8259; | ||||
&RFC8261; | ||||
&RFC8445; | ||||
&I-D.ietf-rtcweb-overview; | Currently: | |||
&I-D.ietf-rtcweb-security; | [webcrypto] | |||
&I-D.ietf-rtcweb-rtp-usage; | Watson, M., "Web Cryptography API", W3C Recommendation, | |||
&I-D.ietf-mmusic-sdp-uks; | 26 January 2017, | |||
&I-D.ietf-rtcweb-jsep; | <https://www.w3.org/TR/2017/REC-WebCryptoAPI-20170126/>. | |||
--> | ||||
<reference anchor="webcrypto"> | <reference anchor="webrtc-api" target="https://www.w3.org/TR/2019/CR-web | |||
<front> | rtc-20191213/"> | |||
<title>Web Cryptography API</title> | <front> | |||
<title>WebRTC 1.0: Real-time Communication Between Browsers</title> | ||||
<author initials="C." surname="Jennings" fullname="Cullen Jennings"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="H." surname="Boström" fullname="Henrik Boström"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="J-I." surname="Bruaroey" fullname="Jan-Ivar Bruaro | ||||
ey"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2019" month="December" day="13"/> | ||||
</front> | ||||
<refcontent>W3C Candidate Recommendation</refcontent> | ||||
</reference> | ||||
<author fullname="W3C editors" | <!-- [rfced] Normative References: The URL as provided for | |||
surname="Dahl, Sleevi"> | [webrtc-api] in the original document - | |||
<organization>W3C</organization> | <http://dev.w3.org/2011/webrtc/editor/webrtc.html> - steers to | |||
</author> | <http://w3c.github.io/webrtc-pc/>, dated October 2019. Please note | |||
that this GitHub page says "Editor's draft" and also says | ||||
"Latest published version: https://www.w3.org/TR/webrtc/." We have updated | ||||
this to refer to the "Latest published version". Please let us know any | ||||
objections. | ||||
<date day="25" month="June" year="2013" /> | Original: | |||
</front> | [webrtc-api] | |||
editors, W., "WebRTC 1.0: Real-time Communication Between | ||||
Browsers", October 2011. | ||||
<annotation>Available at | Available at http://dev.w3.org/2011/webrtc/editor/ | |||
http://www.w3.org/TR/WebCryptoAPI/</annotation> | webrtc.html | |||
</reference> | ||||
<reference anchor="webrtc-api"> | Currently: | |||
<front> | [webrtc-api] | |||
<title>WebRTC 1.0: Real-time Communication Between Browsers</title> | Jennings, C., Boström, H., and J-I. Bruaroey, "WebRTC 1.0: | |||
Real-time Communication Between Browsers", W3C Candidate | ||||
Recommendation, 13 December 2019, | ||||
<https://www.w3.org/TR/2019/CR-webrtc-20191213/>. | ||||
--> | ||||
<author fullname="W3C editors" | <reference anchor="FIPS186"> | |||
surname="Bergkvist, Burnett, Jennings, Narayanan"> | <front> | |||
<organization>W3C</organization> | <title>Digital Signature Standard (DSS)</title> | |||
</author> | <author> | |||
<organization>National Institute of Standards and Technology (NIST | ||||
)</organization> | ||||
</author> | ||||
<date year="2013" month="July"/> | ||||
</front> | ||||
<seriesInfo name="NIST PUB" value="186-4"/> | ||||
<seriesInfo name="DOI" value="10.6028/NIST.FIPS.186-4"/> | ||||
</reference> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7617. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3261. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5705. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6455. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6265. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6943. | ||||
xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6120. | ||||
xml"/> | ||||
<reference anchor="XmlHttpRequest" target="https://www.w3.org/TR/XMLHttp | ||||
Request/"> | ||||
<front> | ||||
<title>XMLHttpRequest Level 2</title> | ||||
<author initials="A." surname="van Kesteren"> | ||||
<organization/> | ||||
</author> | ||||
<date month="January" year="2012"/> | ||||
</front> | ||||
</reference> | ||||
<date day="4" month="October" year="2011" /> | <!-- [rfced] Informative References: The URL as provided for | |||
</front> | [XmlHttpRequest] in the original document - | |||
<http://www.w3.org/TR/XMLHttpRequest/> - steers to a page with the | ||||
title "XMLHttpRequest Level 1," dated October 2016. When we did a | ||||
Google search for "XMLHttpRequest Level 2," we found | ||||
<https://www.w3.org/TR/2012/WD-XMLHttpRequest-20120117/>, which is | ||||
partially obscured by a red box that says "This version is | ||||
outdated!" The link in the box in turn steers to the October 2016 | ||||
"XMLHttpRequest Level 1" page. | ||||
<annotation>Available at | Please advise. | |||
http://dev.w3.org/2011/webrtc/editor/webrtc.html</annotation> | ||||
</reference> | ||||
<reference anchor="FIPS186"> | Original: | |||
<front> | [XmlHttpRequest] | |||
<title>Digital Signature Standard (DSS)</title> | van Kesteren, A., "XMLHttpRequest Level 2", January 2012. --> | |||
<author > | ||||
<organization>National Institute of Standards and Technology (NIST)< | ||||
/organization> | ||||
</author> | ||||
<date year="2013" month="July"/> | ||||
</front> | ||||
<seriesInfo name="NIST PUB 186-4" value=""/> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<references title="Informative References"> | <section numbered="false" toc="default"> | |||
&RFC7617; | <name>Acknowledgements</name> | |||
&RFC3261; | <t> | |||
&RFC5705; | <contact fullname="Bernard Aboba"/>, <contact fullname="Harald | |||
&RFC6455; | Alvestrand"/>, <contact fullname="Richard Barnes"/>, <contact | |||
&RFC6265; | fullname="Dan Druta"/>, <contact fullname="Cullen | |||
&RFC6943; | Jennings"/>, <contact fullname="Hadriel Kaplan"/>, <contact | |||
&RFC6120; | fullname="Matthew Kaufman"/>, <contact fullname="Jim McEachern"/>, | |||
<contact fullname="Martin Thomson"/>, <contact fullname="Magnus | ||||
Westerlund"/>. <contact fullname="Matthew Kaufman"/> provided the UI mat | ||||
erial in | ||||
<xref target="sec.proposal.comsec" format="default"/>. <contact fullname | ||||
="Christer Holmberg"/> provided | ||||
the initial version of <xref target="sec.sdp-id-attr-oa" format="default | ||||
"/>. | ||||
</t> | ||||
</section> | ||||
</back> | ||||
<reference anchor="XmlHttpRequest"> | <!-- [rfced] Please let us know if any changes are needed for the | |||
<front> | following: | |||
<title>XMLHttpRequest Level 2</title> | ||||
<author initials="A." surname="van Kesteren"> | a) The following term was used inconsistently in this document. | |||
<organization></organization> | We chose to use the latter form. Please let us know any objections. | |||
</author> | ||||
<date day="17" month="January" year="2012"/> | Cookies ("use Cookies") / cookies ("access cookies") (Section 7.7) | |||
</front> | ||||
<format target="http://www.w3.org/TR/XMLHttpRequest/" type="TXT"/> | b) In the v2 XML file, <spanx style="verb"> was used to create single quotes | |||
</reference> | for some keys, values, and attribute names. Per RFC 7991, the xml2rfc v3 | |||
vocab, <spanx> has been deprecated: | ||||
Deprecate <spanx>; replace it with <strong>, <em>, and <tt>. | ||||
C238 uses single or double quotes when referring to SDP attributes. Note that | ||||
we have replaced instances of <spanx> with double quotes. Please let us know | ||||
if any updates are needed. | ||||
c) Please let us know how/if the following should be made consistent: | ||||
interdomain ("interdomain calling") / | ||||
inter-domain ("inter-domain protocol") | ||||
(Usage post-RFC 6000 is mixed but leans heavily toward | ||||
"inter-domain.") | ||||
Identity Providers ("overview of Identity Providers and the relevant | ||||
terminology") / identity providers | ||||
The rest of this document, and the rest of the documents in | ||||
Cluster 238, use the lowercase form. Changing "overview of | ||||
Identity Providers" to "overview of IdPs" in this document would | ||||
resolve this issue. | ||||
Relying Party (Section 4) / relying party (Section 7) | ||||
security characteristics / "security characteristics" | ||||
"https:" (The scheme, "https:") / "https" scheme (the "https" scheme) | ||||
--> | ||||
</references> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 371 change blocks. | ||||
1373 lines changed or deleted | 1675 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |