| rfc8827xml2.original.xml | rfc8827.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" conse | |||
| <!ENTITY RFC2119 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | nsus="true" docName="draft-ietf-rtcweb-security-arch-20" indexInclude="true" ipr | |||
| .2119.xml"> | ="pre5378Trust200902" number="8827" prepTime="2021-01-16T18:38:47" scripts="Comm | |||
| <!ENTITY RFC2818 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | on,Latin" sortRefs="true" submissionType="IETF" symRefs="true" tocDepth="4" tocI | |||
| .2818.xml"> | nclude="true" xml:lang="en"> | |||
| <!ENTITY RFC3261 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | <link href="https://datatracker.ietf.org/doc/draft-ietf-rtcweb-security-arch-2 | |||
| .3261.xml"> | 0" rel="prev"/> | |||
| <!ENTITY RFC3264 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | <link href="https://dx.doi.org/10.17487/rfc8827" rel="alternate"/> | |||
| .3264.xml"> | <link href="urn:issn:2070-1721" rel="alternate"/> | |||
| <!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 toc="yes" ?> | ||||
| <?rfc symrefs="yes" ?> | ||||
| <?rfc strict="yes" ?> | ||||
| <?rfc compact="yes" ?> | ||||
| <?rfc sortrefs="yes" ?> | ||||
| <?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" stream="IETF"/> | ||||
| <author fullname="Eric Rescorla" initials="E.K." surname="Rescorla"> | <author fullname="Eric Rescorla" initials="E." surname="Rescorla"> | |||
| <organization>RTFM, Inc.</organization> | <organization showOnFrontPage="true">Mozilla</organization> | |||
| <address> | <address> | |||
| <postal> | ||||
| <street>2064 Edgewood Drive</street> | ||||
| <city>Palo Alto</city> | ||||
| <region>CA</region> | ||||
| <code>94303</code> | ||||
| <country>USA</country> | ||||
| </postal> | ||||
| <phone>+1 650 678 2350</phone> | ||||
| <email>ekr@rtfm.com</email> | <email>ekr@rtfm.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date month="01" year="2021"/> | ||||
| <date/> | <abstract pn="section-abstract"> | |||
| <t indent="0" pn="section-abstract-1"> | ||||
| <area>ART</area> | ||||
| <workgroup>RTCWEB</workgroup> | ||||
| <abstract> | ||||
| <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> | |||
| <boilerplate> | ||||
| <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc= | ||||
| "exclude" pn="section-boilerplate.1"> | ||||
| <name slugifiedName="name-status-of-this-memo">Status of This Memo</name | ||||
| > | ||||
| <t indent="0" pn="section-boilerplate.1-1"> | ||||
| This is an Internet Standards Track document. | ||||
| </t> | ||||
| <t indent="0" pn="section-boilerplate.1-2"> | ||||
| This document is a product of the Internet Engineering Task Force | ||||
| (IETF). It represents the consensus of the IETF community. It has | ||||
| received public review and has been approved for publication by | ||||
| the Internet Engineering Steering Group (IESG). Further | ||||
| information on Internet Standards is available in Section 2 of | ||||
| RFC 7841. | ||||
| </t> | ||||
| <t indent="0" pn="section-boilerplate.1-3"> | ||||
| Information about the current status of this document, any | ||||
| errata, and how to provide feedback on it may be obtained at | ||||
| <eref target="https://www.rfc-editor.org/info/rfc8827" brackets="non | ||||
| e"/>. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="copyright" numbered="false" removeInRFC="false" toc="excl | ||||
| ude" pn="section-boilerplate.2"> | ||||
| <name slugifiedName="name-copyright-notice">Copyright Notice</name> | ||||
| <t indent="0" pn="section-boilerplate.2-1"> | ||||
| Copyright (c) 2021 IETF Trust and the persons identified as the | ||||
| document authors. All rights reserved. | ||||
| </t> | ||||
| <t indent="0" pn="section-boilerplate.2-2"> | ||||
| This document is subject to BCP 78 and the IETF Trust's Legal | ||||
| Provisions Relating to IETF Documents | ||||
| (<eref target="https://trustee.ietf.org/license-info" brackets="none | ||||
| "/>) in effect on the date of | ||||
| publication of this document. Please review these documents | ||||
| carefully, as they describe your rights and restrictions with | ||||
| respect to this document. Code Components extracted from this | ||||
| document must include Simplified BSD License text as described in | ||||
| Section 4.e of the Trust Legal Provisions and are provided without | ||||
| warranty as described in the Simplified BSD License. | ||||
| </t> | ||||
| <t indent="0" pn="section-boilerplate.2-3"> | ||||
| This document may contain material from IETF Documents or IETF | ||||
| Contributions published or made publicly available before November | ||||
| 10, 2008. The person(s) controlling the copyright in some of this | ||||
| material may not have granted the IETF Trust the right to allow | ||||
| modifications of such material outside the IETF Standards Process. | ||||
| Without obtaining an adequate license from the person(s) | ||||
| controlling the copyright in such materials, this document may not | ||||
| be modified outside the IETF Standards Process, and derivative | ||||
| works of it may not be created outside the IETF Standards Process, | ||||
| except to format it for publication as an RFC or to translate it | ||||
| into languages other than English. | ||||
| </t> | ||||
| </section> | ||||
| </boilerplate> | ||||
| <toc> | ||||
| <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" p | ||||
| n="section-toc.1"> | ||||
| <name slugifiedName="name-table-of-contents">Table of Contents</name> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-to | ||||
| c.1-1"> | ||||
| <li pn="section-toc.1-1.1"> | ||||
| <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref der | ||||
| ivedContent="1" format="counter" sectionFormat="of" target="section-1"/>. <xref | ||||
| derivedContent="" format="title" sectionFormat="of" target="name-introduction"> | ||||
| Introduction</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.2"> | ||||
| <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.1"><xref der | ||||
| ivedContent="2" format="counter" sectionFormat="of" target="section-2"/>. <xref | ||||
| derivedContent="" format="title" sectionFormat="of" target="name-terminology">T | ||||
| erminology</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.3"> | ||||
| <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" form | ||||
| at="counter" sectionFormat="of" target="section-3"/>. <xref derivedContent="" f | ||||
| ormat="title" sectionFormat="of" target="name-trust-model">Trust Model</xref></t | ||||
| > | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.3.2"> | ||||
| <li pn="section-toc.1-1.3.2.1"> | ||||
| <t indent="0" keepWithNext="true" pn="section-toc.1-1.3.2.1.1">< | ||||
| xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3. | ||||
| 1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-au | ||||
| thenticated-entities">Authenticated Entities</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.3.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent= | ||||
| "3.2" format="counter" sectionFormat="of" target="section-3.2"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-unauthenticated-entiti | ||||
| es">Unauthenticated Entities</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.4"> | ||||
| <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" form | ||||
| at="counter" sectionFormat="of" target="section-4"/>. <xref derivedContent="" f | ||||
| ormat="title" sectionFormat="of" target="name-overview">Overview</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.4.2"> | ||||
| <li pn="section-toc.1-1.4.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent= | ||||
| "4.1" format="counter" sectionFormat="of" target="section-4.1"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-initial-signaling">Ini | ||||
| tial Signaling</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.4.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent= | ||||
| "4.2" format="counter" sectionFormat="of" target="section-4.2"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-media-consent-verifica | ||||
| tion">Media Consent Verification</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.4.2.3"> | ||||
| <t indent="0" pn="section-toc.1-1.4.2.3.1"><xref derivedContent= | ||||
| "4.3" format="counter" sectionFormat="of" target="section-4.3"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-dtls-handshake">DTLS H | ||||
| andshake</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.4.2.4"> | ||||
| <t indent="0" pn="section-toc.1-1.4.2.4.1"><xref derivedContent= | ||||
| "4.4" format="counter" sectionFormat="of" target="section-4.4"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-communications-and-con | ||||
| sent-">Communications and Consent Freshness</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.5"> | ||||
| <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" form | ||||
| at="counter" sectionFormat="of" target="section-5"/>. <xref derivedContent="" f | ||||
| ormat="title" sectionFormat="of" target="name-sdp-identity-attribute">SDP Identi | ||||
| ty Attribute</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.5.2"> | ||||
| <li pn="section-toc.1-1.5.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent= | ||||
| "5.1" format="counter" sectionFormat="of" target="section-5.1"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-offer-answer-considera | ||||
| tions">Offer/Answer Considerations</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
| ction-toc.1-1.5.2.1.2"> | ||||
| <li pn="section-toc.1-1.5.2.1.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.5.2.1.2.1.1"><xref derived | ||||
| Content="5.1.1" format="counter" sectionFormat="of" target="section-5.1.1"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-generating | ||||
| -the-initial-sdp-">Generating the Initial SDP Offer</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.5.2.1.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.5.2.1.2.2.1"><xref derived | ||||
| Content="5.1.2" format="counter" sectionFormat="of" target="section-5.1.2"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-generating | ||||
| -an-sdp-answer">Generating an SDP Answer</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.5.2.1.2.3"> | ||||
| <t indent="0" pn="section-toc.1-1.5.2.1.2.3.1"><xref derived | ||||
| Content="5.1.3" format="counter" sectionFormat="of" target="section-5.1.3"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-processing | ||||
| -an-sdp-offer-or-">Processing an SDP Offer or Answer</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.5.2.1.2.4"> | ||||
| <t indent="0" pn="section-toc.1-1.5.2.1.2.4.1"><xref derived | ||||
| Content="5.1.4" format="counter" sectionFormat="of" target="section-5.1.4"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-modifying- | ||||
| the-session">Modifying the Session</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.6"> | ||||
| <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" form | ||||
| at="counter" sectionFormat="of" target="section-6"/>. <xref derivedContent="" f | ||||
| ormat="title" sectionFormat="of" target="name-detailed-technical-descript">Detai | ||||
| led Technical Description</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.6.2"> | ||||
| <li pn="section-toc.1-1.6.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.6.2.1.1"><xref derivedContent= | ||||
| "6.1" format="counter" sectionFormat="of" target="section-6.1"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-origin-and-web-securit | ||||
| y-iss">Origin and Web Security Issues</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.6.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.6.2.2.1"><xref derivedContent= | ||||
| "6.2" format="counter" sectionFormat="of" target="section-6.2"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-device-permissions-mod | ||||
| el">Device Permissions Model</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.6.2.3"> | ||||
| <t indent="0" pn="section-toc.1-1.6.2.3.1"><xref derivedContent= | ||||
| "6.3" format="counter" sectionFormat="of" target="section-6.3"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-communications-consent | ||||
| ">Communications Consent</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.6.2.4"> | ||||
| <t indent="0" pn="section-toc.1-1.6.2.4.1"><xref derivedContent= | ||||
| "6.4" format="counter" sectionFormat="of" target="section-6.4"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-ip-location-privacy">I | ||||
| P Location Privacy</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.6.2.5"> | ||||
| <t indent="0" pn="section-toc.1-1.6.2.5.1"><xref derivedContent= | ||||
| "6.5" format="counter" sectionFormat="of" target="section-6.5"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-communications-securit | ||||
| y">Communications Security</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7"> | ||||
| <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" form | ||||
| at="counter" sectionFormat="of" target="section-7"/>. <xref derivedContent="" f | ||||
| ormat="title" sectionFormat="of" target="name-web-based-peer-authenticati">Web-B | ||||
| ased Peer Authentication</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.7.2"> | ||||
| <li pn="section-toc.1-1.7.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent= | ||||
| "7.1" format="counter" sectionFormat="of" target="section-7.1"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-trust-relationships-id | ||||
| ps-ap">Trust Relationships: IdPs, APs, and RPs</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent= | ||||
| "7.2" format="counter" sectionFormat="of" target="section-7.2"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-overview-of-operation" | ||||
| >Overview of Operation</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7.2.3"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.3.1"><xref derivedContent= | ||||
| "7.3" format="counter" sectionFormat="of" target="section-7.3"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-items-for-standardizat | ||||
| ion">Items for Standardization</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7.2.4"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.4.1"><xref derivedContent= | ||||
| "7.4" format="counter" sectionFormat="of" target="section-7.4"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-binding-identity-asser | ||||
| tions">Binding Identity Assertions to JSEP Offer/Answer Transactions</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
| ction-toc.1-1.7.2.4.2"> | ||||
| <li pn="section-toc.1-1.7.2.4.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.4.2.1.1"><xref derived | ||||
| Content="7.4.1" format="counter" sectionFormat="of" target="section-7.4.1"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-carrying-i | ||||
| dentity-assertion">Carrying Identity Assertions</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7.2.5"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.5.1"><xref derivedContent= | ||||
| "7.5" format="counter" sectionFormat="of" target="section-7.5"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-determining-the-idp-ur | ||||
| i">Determining the IdP URI</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
| ction-toc.1-1.7.2.5.2"> | ||||
| <li pn="section-toc.1-1.7.2.5.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.5.2.1.1"><xref derived | ||||
| Content="7.5.1" format="counter" sectionFormat="of" target="section-7.5.1"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-authentica | ||||
| ting-party">Authenticating Party</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7.2.5.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.5.2.2.1"><xref derived | ||||
| Content="7.5.2" format="counter" sectionFormat="of" target="section-7.5.2"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-relying-pa | ||||
| rty">Relying Party</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7.2.6"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.6.1"><xref derivedContent= | ||||
| "7.6" format="counter" sectionFormat="of" target="section-7.6"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-requesting-assertions" | ||||
| >Requesting Assertions</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.7.2.7"> | ||||
| <t indent="0" pn="section-toc.1-1.7.2.7.1"><xref derivedContent= | ||||
| "7.7" format="counter" sectionFormat="of" target="section-7.7"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-managing-user-login">M | ||||
| anaging User Login</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.8"> | ||||
| <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" form | ||||
| at="counter" sectionFormat="of" target="section-8"/>. <xref derivedContent="" f | ||||
| ormat="title" sectionFormat="of" target="name-verifying-assertions">Verifying As | ||||
| sertions</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.8.2"> | ||||
| <li pn="section-toc.1-1.8.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.8.2.1.1"><xref derivedContent= | ||||
| "8.1" format="counter" sectionFormat="of" target="section-8.1"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-identity-formats">Iden | ||||
| tity Formats</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9"> | ||||
| <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" form | ||||
| at="counter" sectionFormat="of" target="section-9"/>. <xref derivedContent="" f | ||||
| ormat="title" sectionFormat="of" target="name-security-considerations">Security | ||||
| Considerations</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.9.2"> | ||||
| <li pn="section-toc.1-1.9.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.1.1"><xref derivedContent= | ||||
| "9.1" format="counter" sectionFormat="of" target="section-9.1"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-communications-securit | ||||
| y-2">Communications Security</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.2.1"><xref derivedContent= | ||||
| "9.2" format="counter" sectionFormat="of" target="section-9.2"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-privacy">Privacy</xref | ||||
| ></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.3"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.3.1"><xref derivedContent= | ||||
| "9.3" format="counter" sectionFormat="of" target="section-9.3"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-denial-of-service">Den | ||||
| ial of Service</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.4"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.1"><xref derivedContent= | ||||
| "9.4" format="counter" sectionFormat="of" target="section-9.4"/>. <xref derived | ||||
| Content="" format="title" sectionFormat="of" target="name-idp-authentication-mec | ||||
| hanis">IdP Authentication Mechanism</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
| ction-toc.1-1.9.2.4.2"> | ||||
| <li pn="section-toc.1-1.9.2.4.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.1.1"><xref derived | ||||
| Content="9.4.1" format="counter" sectionFormat="of" target="section-9.4.1"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-peerconnec | ||||
| tion-origin-check">PeerConnection Origin Check</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.4.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.2.1"><xref derived | ||||
| Content="9.4.2" format="counter" sectionFormat="of" target="section-9.4.2"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-idp-well-k | ||||
| nown-uri">IdP Well-Known URI</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.4.2.3"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.3.1"><xref derived | ||||
| Content="9.4.3" format="counter" sectionFormat="of" target="section-9.4.3"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-privacy-of | ||||
| -idp-generated-id">Privacy of IdP-Generated Identities and the Hosting Site</xre | ||||
| f></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.4.2.4"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.4.1"><xref derived | ||||
| Content="9.4.4" format="counter" sectionFormat="of" target="section-9.4.4"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-security-o | ||||
| f-third-party-idp">Security of Third-Party IdPs</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn | ||||
| ="section-toc.1-1.9.2.4.2.4.2"> | ||||
| <li pn="section-toc.1-1.9.2.4.2.4.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.4.2.1.1"><xref | ||||
| derivedContent="9.4.4.1" format="counter" sectionFormat="of" target="section-9. | ||||
| 4.4.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="nam | ||||
| e-confusable-characters">Confusable Characters</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.4.2.5"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.5.1"><xref derived | ||||
| Content="9.4.5" format="counter" sectionFormat="of" target="section-9.4.5"/>. < | ||||
| xref derivedContent="" format="title" sectionFormat="of" target="name-web-securi | ||||
| ty-feature-intera">Web Security Feature Interactions</xref></t> | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn | ||||
| ="section-toc.1-1.9.2.4.2.5.2"> | ||||
| <li pn="section-toc.1-1.9.2.4.2.5.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.5.2.1.1"><xref | ||||
| derivedContent="9.4.5.1" format="counter" sectionFormat="of" target="section-9. | ||||
| 4.5.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="nam | ||||
| e-popup-blocking">Popup Blocking</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.9.2.4.2.5.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.9.2.4.2.5.2.2.1"><xref | ||||
| derivedContent="9.4.5.2" format="counter" sectionFormat="of" target="section-9. | ||||
| 4.5.2"/>. <xref derivedContent="" format="title" sectionFormat="of" target="nam | ||||
| e-third-party-cookies">Third Party Cookies</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.10"> | ||||
| <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" fo | ||||
| rmat="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" | ||||
| format="title" sectionFormat="of" target="name-iana-considerations">IANA Consid | ||||
| erations</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.11"> | ||||
| <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="11" fo | ||||
| rmat="counter" sectionFormat="of" target="section-11"/>. <xref derivedContent="" | ||||
| format="title" sectionFormat="of" target="name-references">References</xref></t | ||||
| > | ||||
| <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
| n-toc.1-1.11.2"> | ||||
| <li pn="section-toc.1-1.11.2.1"> | ||||
| <t indent="0" pn="section-toc.1-1.11.2.1.1"><xref derivedContent | ||||
| ="11.1" format="counter" sectionFormat="of" target="section-11.1"/>. <xref deri | ||||
| vedContent="" format="title" sectionFormat="of" target="name-normative-reference | ||||
| s">Normative References</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.11.2.2"> | ||||
| <t indent="0" pn="section-toc.1-1.11.2.2.1"><xref derivedContent | ||||
| ="11.2" format="counter" sectionFormat="of" target="section-11.2"/>. <xref deri | ||||
| vedContent="" format="title" sectionFormat="of" target="name-informative-referen | ||||
| ces">Informative References</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.12"> | ||||
| <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="" form | ||||
| at="none" sectionFormat="of" target="section-appendix.a"/><xref derivedContent=" | ||||
| " format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgeme | ||||
| nts</xref></t> | ||||
| </li> | ||||
| <li pn="section-toc.1-1.13"> | ||||
| <t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="" form | ||||
| at="none" sectionFormat="of" target="section-appendix.b"/><xref derivedContent=" | ||||
| " format="title" sectionFormat="of" target="name-authors-address">Author's Addre | ||||
| ss</xref></t> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| </toc> | ||||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="sec.introduction" numbered="true" toc="include" removeInRFC | ||||
| <section title="Introduction" anchor="sec.introduction"> | ="false" pn="section-1"> | |||
| <t> | <name slugifiedName="name-introduction">Introduction</name> | |||
| The Real-Time Communications on the Web (RTCWEB) working group | <t indent="0" pn="section-1-1"> | |||
| 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" sectionFormat="of" derivedContent="RFC8825"/>. | |||
| 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" sectionFormat="of" derivedContent="RFC3261"/> 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" sectionFormat="of" derivedCon tent="Figure 1"/>. | |||
| </t> | </t> | |||
| <figure title="A simple WebRTC system" anchor="fig.simple"> | <figure anchor="fig.simple" align="left" suppress-title="false" pn="figure | |||
| <artwork><![CDATA[ | -1"> | |||
| +----------------+ | <name slugifiedName="name-a-simple-webrtc-system">A Simple WebRTC System | |||
| | | | </name> | |||
| | Web Server | | <artwork name="" type="" align="left" alt="" pn="section-1-2.1"> | |||
| | | | +----------------+ | |||
| +----------------+ | | | | |||
| ^ ^ | | Web Server | | |||
| / \ | | | | |||
| HTTP / \ HTTP | +----------------+ | |||
| / \ | ^ ^ | |||
| / \ | / \ | |||
| v v | HTTP / \ HTTP | |||
| JS API JS API | / \ | |||
| +-----------+ +-----------+ | / \ | |||
| | | Media | | | v v | |||
| | Browser |<---------->| Browser | | JS API JS API | |||
| | | | | | +-----------+ +-----------+ | |||
| +-----------+ +-----------+ | | | Media | | | |||
| ]]></artwork> | | Browser |<---------->| Browser | | |||
| | | | | | ||||
| +-----------+ +-----------+ </artwork> | ||||
| </figure> | </figure> | |||
| <t> | <t indent="0" pn="section-1-3"> | |||
| A more complicated system might allow for interdomain calling, as shown | A more complicated system might allow for inter-domain calling, as shown | |||
| in <xref target="fig.multidomain"/>. The protocol to be used between | in <xref target="fig.multidomain" format="default" sectionFormat="of" de | |||
| rivedContent="Figure 2"/>. The protocol to be 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" sectionFormat="of" derivedConten | ||||
| t="RFC6120"/>. | ||||
| </t> | </t> | |||
| <figure title="A multidomain WebRTC system" anchor="fig.multidomain"> | <figure anchor="fig.multidomain" align="left" suppress-title="false" pn="f | |||
| <artwork><![CDATA[ | igure-2"> | |||
| +--------------+ +--------------+ | <name slugifiedName="name-a-multidomain-webrtc-system">A Multidomain Web | |||
| | | SIP,XMPP,...| | | RTC System</name> | |||
| | Web Server |<----------->| Web Server | | <artwork name="" type="" align="left" alt="" pn="section-1-4.1"> | |||
| | | | | | +--------------+ +--------------+ | |||
| +--------------+ +--------------+ | | | SIP, XMPP, ... | | | |||
| ^ ^ | | Web Server |<-------------->| Web Server | | |||
| | | | | | | | | |||
| HTTP | | HTTP | +--------------+ +--------------+ | |||
| | | | ^ ^ | |||
| v v | | | | |||
| JS API JS API | HTTP | | HTTP | |||
| +-----------+ +-----------+ | | | | |||
| | | Media | | | v v | |||
| | Browser |<---------------->| Browser | | JS API JS API | |||
| | | | | | +-----------+ +-----------+ | |||
| +-----------+ +-----------+ | | | Media | | | |||
| ]]></artwork> | | Browser |<------------------->| Browser | | |||
| | | | | | ||||
| +-----------+ +-----------+ </artwork> | ||||
| </figure> | </figure> | |||
| <t indent="0" pn="section-1-5"> | ||||
| <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" sectionFormat="of" d erivedContent="RFC8826"/>. 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="include" removeInRFC="false" | ||||
| <section anchor="sec-term" title="Terminology"> | pn="section-2"> | |||
| <t> | <name slugifiedName="name-terminology">Terminology</name> | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <t indent="0" pn="section-2-1">The key words "<bcp14>MUST</bcp14>", "<bcp1 | |||
| NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | 4>MUST NOT</bcp14>", | |||
| "MAY", and "OPTIONAL" in this document are to be interpreted as | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | |||
| described in BCP 14 <xref target="RFC2119"/> | "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | |||
| <xref target="RFC8174"/> when, and only when, they | "<bcp14>SHOULD NOT</bcp14>", | |||
| appear in all capitals, as shown here. | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| </t> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
| to be interpreted as described in BCP 14 <xref target="RFC2119" format="defa | ||||
| ult" sectionFormat="of" derivedContent="RFC2119"/> | ||||
| <xref target="RFC8174" format="default" sectionFormat="of" derivedConten | ||||
| t="RFC8174"/> when, and only when, they appear in all capitals, | ||||
| as shown here.</t> | ||||
| </section> | </section> | |||
| <section anchor="sec.proposal.trusthierarchy" numbered="true" toc="include" | ||||
| <section title="Trust Model" anchor="sec.proposal.trusthierarchy"> | removeInRFC="false" pn="section-3"> | |||
| <t> | <name slugifiedName="name-trust-model">Trust Model</name> | |||
| <t indent="0" pn="section-3-1"> | ||||
| 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 indent="0" pn="section-3-2"> | |||
| 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="include" | ||||
| <section title="Authenticated Entities" anchor="sec.proposal.authenticated | removeInRFC="false" pn="section-3.1"> | |||
| "> | <name slugifiedName="name-authenticated-entities">Authenticated Entities | |||
| <t> | </name> | |||
| <t indent="0" pn="section-3.1-1"> | ||||
| 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" indent="3" pn="section-3.1-2"> | |||
| <list style="symbols"> | <dt pn="section-3.1-2.1">Calling services:</dt> | |||
| <t> | <dd pn="section-3.1-2.2">Web sites whose origin we can verify (optimal | |||
| Calling services: Web sites whose origin we can verify (optimally | ly | |||
| 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 pn="section-3.1-2.3">Other users:</dt> | |||
| <t> | <dd pn="section-3.1-2.4">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> | <t indent="0" pn="section-3.1-3"> | |||
| </list> | ||||
| </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 they wish to trust | |||
| Dr. Evil or not; after all, if he desires to contact Dr. Evil (perhaps | Dr. Evil or not; after all, if they desire to contact Dr. Evil (perhap | |||
| to arrange for ransom payment), it's safe to temporarily give him | s | |||
| to arrange for ransom payment), it's safe to temporarily give them | ||||
| 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 | they don't want Dr. Evil to be able to access their 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> | </t> | |||
| </section> | </section> | |||
| <section anchor="sec.proposal.unauthenticated" numbered="true" toc="includ | ||||
| <section title="Unauthenticated Entities" anchor="sec.proposal.unauthentic | e" removeInRFC="false" pn="section-3.2"> | |||
| ated"> | <name slugifiedName="name-unauthenticated-entities">Unauthenticated Enti | |||
| <t> | ties</name> | |||
| <t indent="0" pn="section-3.2-1"> | ||||
| 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="include" remove | |||
| InRFC="false" pn="section-4"> | ||||
| <section title="Overview" anchor="sec.proposal.overview"> | <name slugifiedName="name-overview">Overview</name> | |||
| <!-- TODO: Federated --> | <t indent="0" pn="section-4-1"> | |||
| <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 tradeoffs -- this architecture is still | |||
| compatible with those settings. | compatible with those settings. | |||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-4-2"> | |||
| 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" sectionFormat="of" derivedContent="Figure | |||
| 1"/>, but separates Alice's and Bob's identities 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-relationships" | |||
| target="sec.trust-relationships"/> provides an overview of Identity | format="default" sectionFormat="of" derivedContent="Section 7.1"/> provides an o | |||
| Providers and the relevant terminology. Alice and Bob might have | verview of IdPs | |||
| and the relevant terminology. Alice and Bob might have | ||||
| relationships with different IdPs as well. | relationships with different IdPs as well. | |||
| Note: The IdP mechanism described here has not seen wide adoption. | ||||
| See <xref target="sec.generic.idp" format="default" sectionFormat="of" d | ||||
| erivedContent="Section 7"/> for more on the status of | ||||
| IdP-based authentication. | ||||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-4-3"> | |||
| 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" sectionFormat="of" derivedContent="Figure | |||
| e | 3"/>). However, there are important settings 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" sectionFormat="of" derivedContent="Figure 4"/>) 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 indent="0" pn="section-4-4"> | |||
| 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" align="left" suppress-title="false" pn=" | |||
| <artwork><![CDATA[ | figure-3"> | |||
| <name slugifiedName="name-a-call-with-idp-based-ident">A Call with IdP-B | ||||
| ased Identity</name> | ||||
| <artwork name="" type="" align="left" alt="" pn="section-4-5.1"> | ||||
| +----------------+ | +----------------+ | |||
| | | | | | | |||
| | Signaling | | | Signaling | | |||
| | Server | | | Server | | |||
| | | | | | | |||
| +----------------+ | +----------------+ | |||
| ^ ^ | ^ ^ | |||
| / \ | / \ | |||
| HTTPS / \ HTTPS | HTTPS / \ HTTPS | |||
| / \ | / \ | |||
| / \ | / \ | |||
| v v | v v | |||
| JS API JS API | JS API JS API | |||
| +-----------+ +-----------+ | +-----------+ +-----------+ | |||
| | | Media | | | | | Media | | | |||
| 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 indent="0" pn="section-4-6"> | |||
| <xref target="fig.proposal-federated.idp"/> shows essentially the same | <xref target="fig.proposal-federated.idp" format="default" sectionFormat | |||
| ="of" derivedContent="Figure 4"/> shows essentially 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" s | |||
| above, the domains communicate by some unspecified protocol and | ectionFormat="of" derivedContent="Figure 2"/>. 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" align="left" suppress-title="f | |||
| sal-federated.idp"> | alse" pn="figure-4"> | |||
| <artwork><![CDATA[ | <name slugifiedName="name-a-federated-call-with-idp-b">A Federated Call | |||
| with IdP-Based Identity</name> | ||||
| <artwork name="" type="" align="left" alt="" pn="section-4-7.1"> | ||||
| +----------------+ Unspecified +----------------+ | +----------------+ Unspecified +----------------+ | |||
| | | protocol | | | | | protocol | | | |||
| | Signaling |<----------------->| Signaling | | | Signaling |<----------------->| Signaling | | |||
| | Server | (SIP, XMPP, ...) | Server | | | Server | (SIP, XMPP, ...) | Server | | |||
| | | | | | | | | | | |||
| +----------------+ +----------------+ | +----------------+ +----------------+ | |||
| ^ ^ | ^ ^ | |||
| | | | | | | |||
| HTTPS | | HTTPS | HTTPS | | HTTPS | |||
| | | | | | | |||
| | | | | | | |||
| v v | v v | |||
| JS API JS API | JS API JS API | |||
| +-----------+ +-----------+ | +-----------+ +-----------+ | |||
| | | Media | | | | | Media | | | |||
| 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="include" removeInRFC="false" pn="section-4.1 | ||||
| <section title="Initial Signaling"> | "> | |||
| <t> | <name slugifiedName="name-initial-signaling">Initial Signaling</name> | |||
| For simplicity, assume the topology in <xref | <t indent="0" pn="section-4.1-1"> | |||
| target="fig.proposal.idp"/>. Alice and Bob are both users of a common | For simplicity, assume the topology in <xref target="fig.proposal.idp" | |||
| format="default" sectionFormat="of" derivedContent="Figure 3"/>. 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 IdP. 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 indent="0" pn="section-4.1-2"> | |||
| 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. 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 indent="0" pn="section-4.1-3"> | ||||
| <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 indent="0" pn="section-4.1-4"> | |||
| 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" sectionFormat="of" derivedContent="RFC8829"/> containing: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4 | |||
| <list style="symbols"> | .1-5"> | |||
| <t> | <li pn="section-4.1-5.1"> | |||
| Media channel information | Media channel information | |||
| </t> | </li> | |||
| <t> | <li pn="section-4.1-5.2"> | |||
| Interactive Connectivity Establishment (ICE) <xref | Interactive Connectivity Establishment (ICE) <xref target="RFC8445 | |||
| target="RFC8445"/> candidates | " format="default" sectionFormat="of" derivedContent="RFC8445"/> candidates | |||
| </t> | </li> | |||
| <t> | <li pn="section-4.1-5.3"> | |||
| 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" sectionFormat="of" derived | |||
| Content="RFC5763"/>. 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 indent="0" pn="section-4.1-6"> | |||
| <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" sectionFormat="of" derivedContent="Section 7"/> | |||
| 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 indent="0" pn="section-4.1-7"> | |||
| This message is sent to the signaling server, e.g., by XMLHttpRequest | This message is sent to the signaling server, e.g., by fetch() | |||
| <xref target="XmlHttpRequest"/> or by WebSockets <xref | <xref target="fetch" format="default" sectionFormat="of" derivedConten | |||
| target="RFC6455"/>, over TLS <xref target="RFC5246"/>. | t="fetch"/> or by WebSockets | |||
| <xref target="RFC6455" format="default" sectionFormat="of" derivedCont | ||||
| ent="RFC6455"/>, over TLS <xref target="RFC8446" format="default" sectionFormat= | ||||
| "of" derivedContent="RFC8446"/>. | ||||
| 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 IdP | |||
| (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 | |||
| " sectionFormat="of" derivedContent="Section 7.1"/>. | ||||
| 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 indent="0" pn="section-4.1-8"> | |||
| 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 indent="0" pn="section-4.1-9"> | |||
| 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 provided | |||
| 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" sectionFormat="of" derivedContent="Figure 4"/>, | |||
| 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 indent="0" pn="section-4.1-10"> | |||
| 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. I.e., 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="include" removeInRFC="false" pn="section-4.2 | ||||
| <section title="Media Consent Verification"> | "> | |||
| <t> | <name slugifiedName="name-media-consent-verification">Media Consent Veri | |||
| As described in (<xref target="I-D.ietf-rtcweb-security"/>; Section | fication</name> | |||
| 4.2) media consent verification is provided via ICE. Thus, Alice and | <t indent="0" pn="section-4.2-1"> | |||
| As described in <xref target="RFC8826" sectionFormat="comma" section=" | ||||
| 4.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8826#section-4. | ||||
| 2" derivedContent="RFC8826"/>, 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 indent="0" pn="section-4.2-2"> | |||
| 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="include" removeInRFC="false" pn="section-4.3 | ||||
| <section title="DTLS Handshake"> | "> | |||
| <t> | <name slugifiedName="name-dtls-handshake">DTLS Handshake</name> | |||
| <t indent="0" pn="section-4.3-1"> | ||||
| 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" sectionFormat="of" derivedContent="RFC6347"/> | |||
| and DTLS-SRTP <xref target="RFC5763"/> keying for SRTP | and DTLS-SRTP <xref target="RFC5763" format="default" sectionFormat="o | |||
| <xref target="RFC3711"/> for the media channel and SCTP over DTLS | f" derivedContent="RFC5763"/> keying for SRTP | |||
| <xref target="RFC8261"/> for data | <xref target="RFC3711" format="default" sectionFormat="of" derivedCont | |||
| ent="RFC3711"/> for the media channel and | ||||
| the Stream Control Transmission Protocol (SCTP) over DTLS | ||||
| <xref target="RFC8261" format="default" sectionFormat="of" derivedCont | ||||
| ent="RFC8261"/> 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" sectionFormat="of" derivedContent="RFC5705"/> and used to | |||
| key SRTP for the media channels. | ||||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-4.3-2"> | |||
| 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., | |||
| that the signaling service cannot mount a passive attack on the | that the signaling service cannot mount a passive attack on the | |||
| communications). | communications). | |||
| skipping to change at line 539 ¶ | skipping to change at line 703 ¶ | |||
| 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="include" removeInRFC="false" pn="section-4.4 | ||||
| <section title="Communications and Consent Freshness"> | "> | |||
| <t> | <name slugifiedName="name-communications-and-consent-">Communications an | |||
| d Consent Freshness</name> | ||||
| <t indent="0" pn="section-4.4-1"> | ||||
| 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 indent="0" pn="section-4.4-2"> | |||
| 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 using the | |||
| Section 5.3, these keepalives MUST be based on the consent freshness | consent freshness | |||
| mechanism specified in <xref target="RFC7675"/>. If a | mechanism specified in <xref target="RFC7675" format="default" section | |||
| Format="of" derivedContent="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="include" removeInRFC= | ||||
| <section title="SDP Identity Attribute" anchor="sec.sdp-id-attr"> | "false" pn="section-5"> | |||
| <t> | <name slugifiedName="name-sdp-identity-attribute">SDP Identity Attribute</ | |||
| The SDP 'identity' attribute is a session-level attribute that | name> | |||
| <t indent="0" pn="section-5-1"> | ||||
| 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" format="default | |||
| " derivedLink="https://rfc-editor.org/rfc/rfc4648#section-4" derivedContent="RFC | ||||
| 4648"/>. | ||||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-5-2"> | |||
| 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 indent="0" pn="section-5-3"> | |||
| 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" indent="3" pn="section-5-4"> | |||
| <artwork type="inline"><![CDATA[ | <dt pn="section-5-4.1">Name:</dt> | |||
| Syntax: | <dd pn="section-5-4.2">identity</dd> | |||
| <dt pn="section-5-4.3">Value:</dt> | ||||
| identity-assertion = identity-assertion-value | <dd pn="section-5-4.4">identity-assertion</dd> | |||
| *(SP identity-extension) | <dt pn="section-5-4.5">Usage Level:</dt> | |||
| identity-assertion-value = base64 | <dd pn="section-5-4.6">session</dd> | |||
| identity-extension = extension-name [ "=" extension-value ] | <dt pn="section-5-4.7">Charset Dependent:</dt> | |||
| extension-name = token | <dd pn="section-5-4.8">no</dd> | |||
| extension-value = 1*(%x01-09 / %x0b-0c / %x0e-3a / %x3c-ff) | <dt pn="section-5-4.9">Default Value:</dt> | |||
| ; byte-string from [RFC4566] | <dd pn="section-5-4.10">N/A</dd> | |||
| </dl> | ||||
| <ALPHA and DIGIT as defined in [RFC4566]> | <t indent="0" pn="section-5-5">Syntax:</t> | |||
| <base64 as defined in [RFC4566]> | <sourcecode name="abnf-1" type="abnf" markers="false" pn="section-5-6"> | |||
| identity-assertion = identity-assertion-value | ||||
| Example: | *(SP identity-extension) | |||
| identity-assertion-value = base64 | ||||
| a=identity:\ | identity-extension = extension-name [ "=" extension-value ] | |||
| eyJpZHAiOnsiZG9tYWluIjoiZXhhbXBsZS5vcmciLCJwcm90b2NvbCI6ImJvZ3Vz\ | extension-name = token | |||
| In0sImFzc2VydGlvbiI6IntcImlkZW50aXR5XCI6XCJib2JAZXhhbXBsZS5vcmdc\ | extension-value = 1*(%x01-09 / %x0b-0c / %x0e-3a / %x3c-ff) | |||
| IixcImNvbnRlbnRzXCI6XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6XCIsXCJz\ | ; byte-string from [RFC4566] | |||
| aWduYXR1cmVcIjpcIjAxMDIwMzA0MDUwNlwifSJ9 | ||||
| Note that long lines in the example are folded to meet the column | <ALPHA and DIGIT as defined in [RFC4566]> | |||
| <base64 as defined in [RFC4566]> | ||||
| </sourcecode> | ||||
| <t indent="0" pn="section-5-7">Example:</t> | ||||
| <sourcecode name="sdp-1" type="sdp" markers="false" pn="section-5-8"> | ||||
| a=identity:\ | ||||
| eyJpZHAiOnsiZG9tYWluIjoiZXhhbXBsZS5vcmciLCJwcm90b2NvbCI6ImJvZ3Vz\ | ||||
| In0sImFzc2VydGlvbiI6IntcImlkZW50aXR5XCI6XCJib2JAZXhhbXBsZS5vcmdc\ | ||||
| IixcImNvbnRlbnRzXCI6XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6XCIsXCJz\ | ||||
| aWduYXR1cmVcIjpcIjAxMDIwMzA0MDUwNlwifSJ9</sourcecode> | ||||
| <aside pn="section-5-9"> | ||||
| <t indent="0" pn="section-5-9.1">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 indent="0" pn="section-5-10"> | |||
| </figure> | ||||
| <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 indent="0" pn="section-5-11"> | |||
| 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" sectionFormat="of" derivedConte | |||
| contains two keys: "assertion" and "idp". The <spanx style="verb">asser | nt="RFC8259"/>. The JSON object | |||
| tion</spanx> key value contains | contains two keys: "assertion" and "idp". The "assertion" key value con | |||
| an opaque string that is consumed by the IdP. The <spanx style="verb">i | tains | |||
| dp</spanx> key value contains a | an opaque string that is consumed by the IdP. The "idp" key value conta | |||
| 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" sectionFormat="of" d | |||
| </t> | erivedContent="Section 7.6"/> for more details. | |||
| <section title="Offer/Answer Considerations" anchor="sec.sdp-id-attr-oa"> | </t> | |||
| <t> | <section anchor="sec.sdp-id-attr-oa" numbered="true" toc="include" removeI | |||
| This section defines the SDP Offer/Answer <xref target="RFC3264"/> co | nRFC="false" pn="section-5.1"> | |||
| nsiderations for the SDP | <name slugifiedName="name-offer-answer-considerations">Offer/Answer Cons | |||
| 'identity' attribute. | iderations</name> | |||
| </t> | <t indent="0" pn="section-5.1-1"> | |||
| <t> | This section defines the SDP offer/answer <xref target="RFC3264" form | |||
| at="default" sectionFormat="of" derivedContent="RFC3264"/> considerations for th | ||||
| e SDP | ||||
| "identity" attribute. | ||||
| </t> | ||||
| <t indent="0" pn="section-5.1-2"> | ||||
| 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="include" | |||
| <section title="Generating the Initial SDP Offer" anchor="sec.sdp-id-at | removeInRFC="false" pn="section-5.1.1"> | |||
| tr-oa-inio"> | <name slugifiedName="name-generating-the-initial-sdp-">Generating the | |||
| <t> | Initial SDP Offer</name> | |||
| <t indent="0" pn="section-5.1.1-1"> | ||||
| 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="include" | |||
| sa"> | removeInRFC="false" pn="section-5.1.2"> | |||
| <t> | <name slugifiedName="name-generating-an-sdp-answer">Generating an SDP | |||
| If the answerer elects to include an 'identity' attribute, it follo | Answer</name> | |||
| ws | <t indent="0" pn="section-5.1.2-1"> | |||
| the same steps as those in <xref target="sec.sdp-id-attr-oa-inio"/> | If the answerer elects to include an "identity" attribute, it follo | |||
| . | ws | |||
| The answerer can choose to include or omit an 'identity' attribute | the same steps as those in <xref target="sec.sdp-id-attr-oa-inio" f | |||
| independently, | ormat="default" sectionFormat="of" derivedContent="Section 5.1.1"/>. | |||
| The answerer can choose to include or omit an "identity" attribute | ||||
| 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="include" | |||
| ttr-oa-offa"> | removeInRFC="false" pn="section-5.1.3"> | |||
| <t> | <name slugifiedName="name-processing-an-sdp-offer-or-">Processing an S | |||
| When an endpoint receives an offer or answer that contains an 'iden | DP Offer or Answer</name> | |||
| tity' | <t indent="0" pn="section-5.1.3-1"> | |||
| attribute, the answerer can use the the attribute information to | When an endpoint receives an offer or answer that contains an "iden | |||
| tity" | ||||
| 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" sectionFormat="of" derivedContent="Section 7.1"/ >, | |||
| 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="include" | |||
| > | removeInRFC="false" pn="section-5.1.4"> | |||
| <t> | <name slugifiedName="name-modifying-the-session">Modifying the Session | |||
| </name> | ||||
| <t indent="0" pn="section-5.1.4-1"> | ||||
| 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" format="default" derivedLink="https://rfc-editor.org/rfc/rfc88 | |||
| 5.2.1 requires that each media section use the same set of | 29#section-5.2.1" derivedContent="RFC8829"/> requires that each media section us | |||
| fingerprints for every media section. | e the same set of fingerprints. | |||
| 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 indent="0" pn="section-5.1.4-2"> | |||
| 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="include" remove | ||||
| <section title="Detailed Technical Description" anchor="sec.proposal.detaile | InRFC="false" pn="section-6"> | |||
| d"> | <name slugifiedName="name-detailed-technical-descript">Detailed Technical | |||
| Description</name> | ||||
| <section title="Origin and Web Security Issues" anchor="sec.proposal.origi | <section anchor="sec.proposal.origin" numbered="true" toc="include" remove | |||
| n"> | InRFC="false" pn="section-6.1"> | |||
| <t> | <name slugifiedName="name-origin-and-web-security-iss">Origin and Web Se | |||
| The basic unit of permissions for WebRTC is the origin <xref | curity Issues</name> | |||
| target="RFC6454"/>. Because the security of the origin depends on | <t indent="0" pn="section-6.1-1"> | |||
| The basic unit of permissions for WebRTC is the origin <xref target="R | ||||
| FC6454" format="default" sectionFormat="of" derivedContent="RFC6454"/>. 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" sectionFormat="of" derivedContent="RFC2818"/>. | |||
| different permissions domains. Note: this follows directly from the | Thus, clients <bcp14>MUST</bcp14> treat HTTP 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 indent="0" pn="section-6.1-2"> | |||
| 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 indent="0" pn="section-6.1-3"> | |||
| Note that it is possible for a page which was not mixed content to | Note that it is possible for a page which 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 indent="0" pn="section-6.1-4"> | |||
| 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. However, it is assumed t hat | |||
| 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="inc | ||||
| <section title="Device Permissions Model" anchor="sec.proposal.device.perm | lude" removeInRFC="false" pn="section-6.2"> | |||
| issions"> | <name slugifiedName="name-device-permissions-model">Device Permissions M | |||
| <t> | odel</name> | |||
| Implementations MUST obtain explicit user consent prior to providing | <t indent="0" pn="section-6.2-1"> | |||
| access to the camera and/or microphone. Implementations MUST at | Implementations <bcp14>MUST</bcp14> obtain explicit user consent prior | |||
| 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" bare="false" empty="false" indent="3" pn="section-6 | |||
| <list style="symbols"> | .2-2"> | |||
| <t> | <li pn="section-6.2-2.1"> | |||
| Requests for one-time camera/microphone access. | Requests for one-time camera/microphone access. | |||
| </t> | </li> | |||
| <t> | <li pn="section-6.2-2.2"> | |||
| Requests for permanent access. | Requests for permanent access. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | <t indent="0" pn="section-6.2-3"> | |||
| <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 indent="0" pn="section-6.2-4"> | |||
| 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 they are willing to communicate with, e.g., "my mother" rather t han | |||
| "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" indent="3" pn="section-6.2-5"> | ||||
| <t> | <dt pn="section-6.2-5.1">API Requirement:</dt> | |||
| <list style="hanging"> | <dd pn="section-6.2-5.2"> | |||
| <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" indent="3" pn="section-6.2-6"> | |||
| <dt pn="section-6.2-6.1">UI Requirement:</dt> | ||||
| <t> | <dd pn="section-6.2-6.2"> | |||
| <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" indent="3" pn="section-6.2-7"> | |||
| <dt pn="section-6.2-7.1">UI Requirement:</dt> | ||||
| <t> | <dd pn="section-6.2-7.2"> | |||
| <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> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6 | |||
| .2-8"> | ||||
| <t> | <li pn="section-6.2-8.1"> | |||
| <list style="symbols"> | Browsers <bcp14>MUST NOT</bcp14> permit permanent screen or applic | |||
| <t> | ation sharing | |||
| Browsers MUST NOT permit permanent screen or application 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 pn="section-6.2-8.2"> | |||
| 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 the request for camera and microphone | |||
| </t> | permissions. | |||
| </li> | ||||
| <t> | <li pn="section-6.2-8.3"> | |||
| The browser MUST indicate any windows which are currently being | The browser <bcp14>MUST</bcp14> indicate any windows which are cur | |||
| shared in some unambiguous way. Windows which are not visible MUST | rently being | |||
| NOT be shared even if the application is being shared. If the | shared in some unambiguous way. Windows which are not visible <bcp | |||
| screen is being shared, then that MUST be indicated. | 14>MUST NOT</bcp14> be shared even if the application is being shared. If the | |||
| </t> | screen is being shared, then that <bcp14>MUST</bcp14> be indicated | |||
| </list> | . | |||
| </t> | </li> | |||
| </ul> | ||||
| <t> | <t indent="0" pn="section-6.2-9"> | |||
| 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" sectionFormat="of" derivedContent="Section 6.3"/> for a | |||
| related issue.) | ||||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-6.2-10"> | |||
| 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" bare="false" empty="false" indent="3" pn="section-6 | |||
| <list style="symbols"> | .2-11"> | |||
| <t> | <li pn="section-6.2-11.1"> | |||
| Allow future calls to this verified user. | Allow future calls to this verified user. | |||
| </t> | </li> | |||
| <t> | <li pn="section-6.2-11.2"> | |||
| 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 indent="0" pn="section-6.2-12"> | |||
| <t> | Implementations <bcp14>SHOULD</bcp14> also provide a different user in | |||
| Implementations SHOULD also provide a different user interface | 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" sectionFormat="of" derivedContent="Section 6.5"/> provides | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="sec.proposal.communications.consent" numbered="true" toc= | ||||
| <section title="Communications Consent" anchor="sec.proposal.communication | "include" removeInRFC="false" pn="section-6.3"> | |||
| s.consent"> | <name slugifiedName="name-communications-consent">Communications Consent | |||
| </name> | ||||
| <t> | <t indent="0" pn="section-6.3-1"> | |||
| 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" sectionFormat="of" derivedContent="RFC8445"/>. | ||||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-6.3-2"> | |||
| 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, though | |||
| it of | ||||
| course knows it. | course knows it. | |||
| </t> | </t> | |||
| <t> <!-- FIXME: phrasing of first sentence still awkward --> | <t indent="0" pn="section-6.3-3"> | |||
| 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="11" format="default" derivedLink="https://rfc-edit | |||
| which are | or.org/rfc/rfc8445#section-11" derivedContent="RFC8445"/> keepalives use STUN Bi | |||
| nding Indications, which are | ||||
| one-way and therefore not sufficient. The current WG consensus is to | 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" sec tionFormat="of" derivedContent="RFC7675"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="sec.proposal.ip.location.privacy" numbered="true" toc="in | ||||
| <section title="IP Location Privacy" anchor="sec.proposal.ip.location.priv | clude" removeInRFC="false" pn="section-6.4"> | |||
| acy"> | <name slugifiedName="name-ip-location-privacy">IP Location Privacy</name | |||
| <t> | > | |||
| <t indent="0" pn="section-6.4-1"> | ||||
| 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. 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" indent="3" pn="section-6.4-2"> | ||||
| <t> | <dt pn="section-6.4-2.1">API Requirement:</dt> | |||
| <list style="hanging"> | <dd pn="section-6.4-2.2"> | |||
| <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" indent="3" pn="section-6.4-3"> | |||
| <dt pn="section-6.4-3.1">API Requirement:</dt> | ||||
| <t> | <dd pn="section-6.4-3.2"> | |||
| <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" indent="3" pn="section-6.4-4"> | |||
| <dt pn="section-6.4-4.1">API Requirement:</dt> | ||||
| <t> | <dd pn="section-6.4-4.2"> | |||
| <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 indent="0" pn="section-6.4-5"> | |||
| <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> | |||
| <t indent="0" pn="section-6.4-6"> | ||||
| Note: These requirements are intended to allow sites to conceal the | ||||
| user's IP address from the peer. For guidance on concealing the | ||||
| user's IP address from the calling site see <xref target="RFC8828" for | ||||
| mat="default" sectionFormat="of" derivedContent="RFC8828"/>. | ||||
| </t> | ||||
| </section> | </section> | |||
| <section anchor="sec.proposal.comsec" numbered="true" toc="include" remove | ||||
| <section title="Communications Security" anchor="sec.proposal.comsec"> | InRFC="false" pn="section-6.5"> | |||
| <t> | <name slugifiedName="name-communications-security">Communications Securi | |||
| Implementations MUST support SRTP <xref target="RFC3711"/>. | ty</name> | |||
| Implementations MUST support DTLS <xref target="RFC6347"/> and | <t indent="0" pn="section-6.5-1"> | |||
| DTLS-SRTP <xref target="RFC5763"/><xref target="RFC5764"/> for SRTP | Implementations <bcp14>MUST</bcp14> support SRTP <xref target="RFC3711 | |||
| keying. Implementations MUST support SCTP over DTLS <xref | " format="default" sectionFormat="of" derivedContent="RFC3711"/>. | |||
| target="RFC8261"/>. | Implementations <bcp14>MUST</bcp14> support DTLS <xref target="RFC6347 | |||
| " format="default" sectionFormat="of" derivedContent="RFC6347"/> and | ||||
| DTLS-SRTP <xref target="RFC5763" format="default" sectionFormat="of" d | ||||
| erivedContent="RFC5763"/> <xref target="RFC5764" format="default" sectionFormat= | ||||
| "of" derivedContent="RFC5764"/> for SRTP | ||||
| keying. Implementations <bcp14>MUST</bcp14> support SCTP over DTLS <xr | ||||
| ef target="RFC8261" format="default" sectionFormat="of" derivedContent="RFC8261" | ||||
| />. | ||||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-6.5-2"> | |||
| 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 <b | |||
| be sent over plain (unencrypted) RTP or RTCP; that is, implementations | cp14>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 NOT</bcp14> negotiate cipher suites with NULL encryption modes. DT | |||
| MUST be offered for every media channel. WebRTC implementations MUST | LS-SRTP | |||
| NOT | <bcp14>MUST</bcp14> be offered for every media channel. WebRTC implem | |||
| offer SDP Security Descriptions <xref target="RFC4568"/> or select it | entations <bcp14>MUST NOT</bcp14> | |||
| if offered. | offer SDP security descriptions <xref target="RFC4568" format="default | |||
| A SRTP MKI MUST NOT be used. | " sectionFormat="of" derivedContent="RFC4568"/> or select it if offered. | |||
| An SRTP Master Key Identifier (MKI) <bcp14>MUST NOT</bcp14> be used. | ||||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-6.5-3"> | |||
| All data channels MUST be secured via DTLS. | All data channels <bcp14>MUST</bcp14> be secured via DTLS. | |||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-6.5-4"> | |||
| 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" sectionFormat="of" derivedCont ent="FIPS186">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 which 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 Forward Secrecy | |||
| over non-PFS cipher suites and SHOULD favor AEAD over non-AEAD cipher | (FS) | |||
| suites. | over non-FS cipher suites and <bcp14>SHOULD</bcp14> favor | |||
| Authenticated Encryption with Associated Data (AEAD) over non-AEAD cip | ||||
| her suites. | ||||
| Note: the IETF is in the process of standardizing DTLS 1.3 | ||||
| <xref target="I-D.ietf-tls-dtls13" format="default" sectionFormat="of" | ||||
| derivedContent="TLS-DTLS13"/>. | ||||
| </t> | </t> | |||
| <t indent="0" pn="section-6.5-5"> | ||||
| <t> | Implementations <bcp14>MUST NOT</bcp14> implement DTLS renegotiation a | |||
| Implementations MUST NOT implement DTLS renegotiation and MUST reject | nd <bcp14>MUST</bcp14> reject | |||
| it with a "no_renegotiation" alert if offered.</t> | it with a "no_renegotiation" alert if offered.</t> | |||
| <t indent="0" pn="section-6.5-6"> | ||||
| <t> | Endpoints <bcp14>MUST NOT</bcp14> implement TLS False Start <xref targ | |||
| Endpoints MUST NOT implement TLS False Start <xref target="RFC7918"/>. | et="RFC7918" format="default" sectionFormat="of" derivedContent="RFC7918"/>.</t> | |||
| </t> | <dl newline="false" spacing="normal" indent="3" pn="section-6.5-7"> | |||
| <dt pn="section-6.5-7.1">API Requirement:</dt> | ||||
| <t> | <dd pn="section-6.5-7.2"> | |||
| <list style="hanging"> | The API <bcp14>MUST</bcp14> generate a new authentication key pair | |||
| <t hangText="API Requirement:"> | for every new | |||
| The API MUST generate a new authentication key pair 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 pn="section-6.5-7.3">API Requirement:</dt> | |||
| The API MUST provide a means to reuse a key pair for calls. This | <dd pn="section-6.5-7.4"> | |||
| 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 pn="section-6.5-7.5">API Requirement:</dt> | |||
| <dd pn="section-6.5-7.6"> | ||||
| 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 pn="section-6.5-7.7">API Requirement:</dt> | |||
| When DTLS-SRTP is used, the API MUST NOT permit the JS to obtain | <dd pn="section-6.5-7.8"> | |||
| 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" indent="3" pn="section-6.5-8"> | |||
| <dt pn="section-6.5-8.1">UI Requirements:</dt> | ||||
| <t> | <dd pn="section-6.5-8.2"> | |||
| <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 pn="section-6.5-8.3"/> | |||
| The following properties SHOULD be displayed "up-front" in the | <dd pn="section-6.5-8.4"> | |||
| 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 pn="section-6.5-8.5"/> | |||
| <list style="symbols"> | <dd pn="section-6.5-8.6"> | |||
| <t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | |||
| A client MUST provide a user interface through which a user | on-6.5-8.6.1"> | |||
| may determine the security characteristics for | <li pn="section-6.5-8.6.1.1"> | |||
| currently-displayed audio and video stream(s) | A client <bcp14>MUST</bcp14> provide a user interface through | |||
| </t> | which a user | |||
| may determine the "security characteristics" for | ||||
| <t> | currently displayed audio and video stream(s). | |||
| A client MUST provide a user interface through which a user | </li> | |||
| may determine the security characteristics for transmissions | <li pn="section-6.5-8.6.1.2"> | |||
| A client <bcp14>MUST</bcp14> provide a user interface through | ||||
| which a user | ||||
| may determine the "security characteristics" for transmissions | ||||
| of their microphone audio and camera video. | of their microphone audio and camera video. | |||
| </t> | </li> | |||
| <li pn="section-6.5-8.6.1.3"> | ||||
| <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 | sectionFormat="of" derivedContent="Section 7"/>), 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 pn="section-6.5-8.7"/> | |||
| </t> | <dd pn="section-6.5-8.8"> | |||
| <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 pn="section-6.5-8.9"/> | |||
| <list style="symbols"> | <dd pn="section-6.5-8.10"> | |||
| <t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="secti | |||
| The "security characteristics" MUST indicate the cryptographic | on-6.5-8.10.1"> | |||
| algorithms in use (For example: "AES-CBC".) | <li pn="section-6.5-8.10.1.1"> | |||
| </t> | The "security characteristics" <bcp14>MUST</bcp14> indicate th | |||
| e cryptographic | ||||
| <t> | algorithms in use (for example, "AES-CBC"). | |||
| The "security characteristics" MUST indicate whether PFS is | </li> | |||
| <li pn="section-6.5-8.10.1.2"> | ||||
| The "security characteristics" <bcp14>MUST</bcp14> indicate wh | ||||
| ether FS is | ||||
| provided. | provided. | |||
| </t> | </li> | |||
| <li pn="section-6.5-8.10.1.3"> | ||||
| <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="include" removeInRFC= | ||||
| <section title="Web-Based Peer Authentication" anchor="sec.generic.idp"> | "false" pn="section-7"> | |||
| <t> | <name slugifiedName="name-web-based-peer-authenticati">Web-Based Peer Auth | |||
| entication</name> | ||||
| <t indent="0" pn="section-7-1"> | ||||
| NOTE: The mechanism described in this section was designed relatively | ||||
| early in the RTCWEB process. In retrospect, the WG was too optimistic | ||||
| about the enthusiasm for this kind of mechanism. At the time of publicat | ||||
| ion, | ||||
| it has not been widely adopted or implemented. It appears in this docume | ||||
| nt | ||||
| as a description of the state of the art as of this writing. | ||||
| </t> | ||||
| <t indent="0" pn="section-7-2"> | ||||
| 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 indent="0" pn="section-7-3"> | |||
| 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) IdP which 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 IdP 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 indent="0" pn="section-7-4"> | |||
| 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 indent="0" pn="section-7-5"> | |||
| 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="include" re | ||||
| <section title="Trust Relationships: IdPs, APs, and RPs" anchor="sec.tru | moveInRFC="false" pn="section-7.1"> | |||
| st-relationships"> | <name slugifiedName="name-trust-relationships-idps-ap">Trust Relationshi | |||
| <t> | ps: IdPs, APs, and RPs</name> | |||
| <t indent="0" pn="section-7.1-1"> | ||||
| Any federated identity protocol has three major participants: | Any federated identity protocol has three major participants: | |||
| </t> | </t> | |||
| <t> | <dl newline="false" spacing="normal" indent="3" pn="section-7.1-2"> | |||
| <list style="hanging"> | <dt pn="section-7.1-2.1">Authenticating Party (AP):</dt> | |||
| <t hangText="Authenticating Party (AP):"> | <dd pn="section-7.1-2.2"> | |||
| The entity which is trying to establish its identity. | The entity which is trying to establish its identity. | |||
| </t> | </dd> | |||
| <t> | <dt pn="section-7.1-2.3">Identity Provider (IdP):</dt> | |||
| </t> | <dd pn="section-7.1-2.4"> | |||
| <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 pn="section-7.1-2.5">Relying Party (RP):</dt> | ||||
| <t> | <dd pn="section-7.1-2.6"> | |||
| </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 indent="0" pn="section-7.1-3"> | |||
| <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 indent="0" pn="section-7.1-4"> | |||
| 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" indent="3" pn="section-7.1-5"> | |||
| <list style="hanging"> | <dt pn="section-7.1-5.1">Authoritative:</dt> | |||
| <t hangText="Authoritative: "> | <dd pn="section-7.1-5.2"> | |||
| 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 | IdPs include DNSSEC, an identity system for SIP | |||
| (see <xref target="RFC8224" format="default" sectionFormat="of" | ||||
| derivedContent="RFC8224"/>), 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> | </dd> | |||
| <dt pn="section-7.1-5.3">Third-Party:</dt> | ||||
| <t> | <dd pn="section-7.1-5.4"> | |||
| </t> | ||||
| <t hangText="Third-Party: "> | ||||
| 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 users' identities 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 IdP | |||
| provider is SSL/TLS certificates, where there are a large number | is SSL/TLS certificates, where there are a large number of | |||
| of | certificate authorities (CAs) all of whom can attest to any doma | |||
| CAs all of whom can attest to any domain name. | in name. | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | <t indent="0" pn="section-7.1-6"> | |||
| <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 they | |||
| looks at the identity. | look at the identity. | |||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-7.1-7"> | |||
| 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="include" removeInRFC=" | ||||
| <section title="Overview of Operation" anchor="sec.overview"> | false" pn="section-7.2"> | |||
| <t> | <name slugifiedName="name-overview-of-operation">Overview of Operation</ | |||
| name> | ||||
| <t indent="0" pn="section-7.2-1"> | ||||
| 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 indent="0" pn="section-7.2-2"> | |||
| 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" bare="false" empty="false" indent="3" pn="section-7 | |||
| .2-3"> | ||||
| <li pn="section-7.2-3.1"> | ||||
| Identity assertion generation. | Identity assertion generation. | |||
| </t> | </li> | |||
| <t> | <li pn="section-7.2-3.2"> | |||
| Identity assertion verification. | Identity assertion verification. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | <t indent="0" pn="section-7.2-4"> | |||
| <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="" pn="section-7.2-5"> | |||
| <artwork><![CDATA[ | ||||
| +--------------------------------------+ | +--------------------------------------+ | |||
| | Browser | | | Browser | | |||
| | | | | | | |||
| | +----------------------------------+ | | | +----------------------------------+ | | |||
| | | https://calling-site.example.com | | | | | https://calling-site.example.com | | | |||
| | | | | | | | | | | |||
| | | Calling JS Code | | | | | Calling JS Code | | | |||
| | | ^ | | | | | ^ | | | |||
| | +---------------|------------------+ | | | +---------------|------------------+ | | |||
| | | API Calls | | | | API Calls | | |||
| | v | | | v | | |||
| | 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 indent="0" pn="section-7.2-6"> | |||
| </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" indent="adaptive" start="1" pn="section-7. | |||
| 2-7"> | ||||
| <li pn="section-7.2-7.1" derivedCounter="1."> | ||||
| 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 pn="section-7.2-7.2" derivedCounter="2."> | |||
| 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" se | |||
| </t> | ctionFormat="of" derivedContent="webrtc-api"/>. | |||
| <t> | </li> | |||
| <li pn="section-7.2-7.3" derivedCounter="3."> | ||||
| 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 indent="0" pn="section-7.2-8"> | |||
| <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 | IdP; 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="include" removeInR | ||||
| <section title="Items for Standardization" anchor="sec.standardized"> | FC="false" pn="section-7.3"> | |||
| <t> | <name slugifiedName="name-items-for-standardization">Items for Standardi | |||
| zation</name> | ||||
| <t indent="0" pn="section-7.3-1"> | ||||
| There are two parts to this work: | There are two parts to this work: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-7 | |||
| <list style="symbols"> | .3-2"> | |||
| <t> | <li pn="section-7.3-2.1"> | |||
| 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" sectionFormat=" | |||
| of" derivedContent="Section 7.4"/>. | ||||
| <t> | </li> | |||
| <li pn="section-7.3-2.2"> | ||||
| 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" sectionFormat="of" derivedContent="webrtc-api"/>. | |||
| </list> | </li> | |||
| </t> | </ul> | |||
| <t> | <t indent="0" pn="section-7.3-3"> | |||
| 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="include" removeInR | ||||
| <section title="Binding Identity Assertions to JSEP Offer/Answer Transac | FC="false" pn="section-7.4"> | |||
| tions" anchor="sec.jsep-binding"> | <name slugifiedName="name-binding-identity-assertions">Binding Identity | |||
| Assertions to JSEP Offer/Answer Transactions</name> | ||||
| <t> | <t indent="0" pn="section-7.4-1"> | |||
| 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> | <sourcecode name="json-1" type="json" markers="false" pn="section-7.4-2" | |||
| <artwork><![CDATA[ | > | |||
| { | { | |||
| "fingerprint": | "fingerprint": | |||
| [ | [ | |||
| { "algorithm": "sha-256", | { "algorithm": "sha-256", | |||
| "digest": "4A:AD:B9:B1:3F:...:E5:7C:AB" }, | "digest": "4A:AD:B9:B1:3F:...:E5:7C:AB" }, | |||
| { "algorithm": "sha-1", | { "algorithm": "sha-1", | |||
| "digest": "74:E9:76:C8:19:...:F4:45:6B" } | "digest": "74:E9:76:C8:19:...:F4:45:6B" } | |||
| ] | ] | |||
| } | }</sourcecode> | |||
| ]]></artwork> | <t indent="0" pn="section-7.4-3"> | |||
| </figure> | The "fingerprint" value is an array of | |||
| <t> | objects. Each object in the array contains "algorithm" and "digest" | |||
| The <spanx style="verb">fingerprint</spanx> value is an array of | values, which correspond directly to | |||
| objects. Each object in the array contains <spanx | the algorithm and digest values in the "fingerprint" attribute of th | |||
| style="verb">algorithm</spanx> and <spanx | e SDP <xref target="RFC8122" format="default" sectionFormat="of" derivedContent= | |||
| style="verb">digest</spanx> values, which correspond directly to | "RFC8122"/>. | |||
| the algorithm and digest values in the <spanx | </t> | |||
| style="verb">fingerprint</spanx> attribute of the SDP <xref | <t indent="0" pn="section-7.4-4"> | |||
| target="RFC8122"/>. | This object is encoded in a <xref target="RFC8259" format="default" | |||
| </t> | sectionFormat="of" derivedContent="RFC8259">JSON</xref> | |||
| <t> | ||||
| 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" sectionFormat="of" derivedContent="Section 7.4.1"/>. | |||
| <t> | </t> | |||
| <t indent="0" pn="section-7.4-5"> | ||||
| 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="include" remo | ||||
| <section title="Carrying Identity Assertions" anchor="sec.carry-assert | veInRFC="false" pn="section-7.4.1"> | |||
| ion"> | <name slugifiedName="name-carrying-identity-assertion">Carrying Identi | |||
| <t> | ty Assertions</name> | |||
| Once an IdP has generated an assertion (see <xref | <t indent="0" pn="section-7.4.1-1"> | |||
| target="sec.request-assert"/>), it is attached to the SDP | Once an IdP has generated an assertion (see <xref target="sec.requ | |||
| offer/answer message. This is done by adding a new 'identity' | est-assert" format="default" sectionFormat="of" derivedContent="Section 7.6"/>), | |||
| it is attached to the SDP | ||||
| 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" sectionFormat="of" derivedContent="RFC4648">base64-encoded</xref> to | |||
| produce this string. | ||||
| For example: | For example: | |||
| </t> | </t> | |||
| <figure> | <sourcecode name="sdp-1" type="sdp" markers="false" pn="section-7.4.1- | |||
| <artwork><![CDATA[ | 2"> | |||
| 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> | |||
| <aside pn="section-7.4.1-3"> | ||||
| Note that long lines in the example are folded to meet the column | <t indent="0" pn="section-7.4.1-3.1">Note that long lines in the exa | |||
| mple 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 indent="0" pn="section-7.4.1-4"> | |||
| </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 indent="0" pn="section-7.4.1-5"> | |||
| 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 indent="0" pn="section-7.4.1-6"> | |||
| 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="include" removeInRFC="f | |||
| <t> | alse" pn="section-7.5"> | |||
| <name slugifiedName="name-determining-the-idp-uri">Determining the IdP U | ||||
| RI</name> | ||||
| <t indent="0" pn="section-7.5-1"> | ||||
| 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" indent="3" pn="section-7.5-2"> | |||
| <list style="hanging"> | <dt pn="section-7.5-2.1">authority:</dt> | |||
| <t hangText="Authority:"> | <dd pn="section-7.5-2.2"> | |||
| The <xref target="RFC3986"> authority</xref> at which the | The <xref target="RFC3986" format="default" sectionFormat | |||
| ="of" derivedContent="RFC3986"> authority</xref> at which the | ||||
| IdP's service is hosted. | IdP's service is hosted. | |||
| </t> | </dd> | |||
| <t hangText="protocol:"> | <dt pn="section-7.5-2.3">protocol:</dt> | |||
| <dd pn="section-7.5-2.4"> | ||||
| 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 indent="0" pn="section-7.5-3"> | |||
| <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="RFC8615" format="default" | |||
| URI</xref>. The well-known URI for an IdP proxy is formed from | sectionFormat="of" derivedContent="RFC8615">well-known | |||
| URI</xref>. | ||||
| 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" indent="adaptive" start="1" pn="section-7. | |||
| The scheme, "https:". An IdP MUST be loaded using <xref | 5-4"> | |||
| target="RFC2818">HTTPS</xref>. | <li pn="section-7.5-4.1" derivedCounter="1."> | |||
| </t> | The scheme, "https:". An IdP <bcp14>MUST</bcp14> be loaded | |||
| <t> | using <xref target="RFC2818" format="default" sectionFormat="of" derivedContent= | |||
| The <xref target="RFC3986">authority</xref>. As noted above | "RFC2818">HTTPS</xref>. | |||
| , | </li> | |||
| the authority MAY contain a non-default port number or | <li pn="section-7.5-4.2" derivedCounter="2."> | |||
| The <xref target="RFC3986" format="default" sectionFormat="o | ||||
| f" derivedContent="RFC3986">authority</xref>. 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 pn="section-7.5-4.3" derivedCounter="3."> | |||
| 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 indent="0" pn="section-7.5-5"> | ||||
| 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 align="left" pn="section-7.5-6">https://identity.example.com/.w | |||
| <artwork><![CDATA[ | ell-known/idp-proxy/example</artwork> | |||
| https://identity.example.com/.well-known/idp-proxy/example | <t indent="0" pn="section-7.5-7"> | |||
| ]]></artwork> | The IdP <bcp14>MAY</bcp14> redirect requests to this URL, but th | |||
| </figure> | ey <bcp14>MUST</bcp14> retain | |||
| <t> | the "https:" scheme. This changes the effective origin of the | |||
| The IdP MAY redirect requests to this URL, but they MUST retain | ||||
| 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. I.e., the IdP is still | |||
| regarded as authoritative for the original domain. | regarded as authoritative for the original domain. | |||
| </t> | </t> | |||
| <section numbered="true" toc="include" removeInRFC="false" pn="section-7 | ||||
| <section title="Authenticating Party"> | .5.1"> | |||
| <t> | <name slugifiedName="name-authenticating-party">Authenticating Party</ | |||
| name> | ||||
| <t indent="0" pn="section-7.5.1-1"> | ||||
| 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" bare="false" empty="false" indent="3" pn="section | |||
| -7.5.1-2"> | ||||
| <li pn="section-7.5.1-2.1"> | ||||
| Provided by the user directly. | Provided by the user directly. | |||
| </t> | </li> | |||
| <t> | <li pn="section-7.5.1-2.2"> | |||
| 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="include" removeInRFC="false" pn="section-7 | |||
| .5.2"> | ||||
| <section title="Relying Party"> | <name slugifiedName="name-relying-party">Relying Party</name> | |||
| <t> | <t indent="0" pn="section-7.5.2-1"> | |||
| 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" sectionForm | |||
| at="of" derivedContent="Section 7.6"/>), 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" sectionFormat="of" derivedContent="Section 8.1"/>. | |||
| </section> | </t> | |||
| </section> | </section> | |||
| </section> | ||||
| <section title="Requesting Assertions" anchor="sec.request-assert"> | <section anchor="sec.request-assert" numbered="true" toc="include" removeI | |||
| <t> | nRFC="false" pn="section-7.6"> | |||
| The input to identity assertion is the JSON-encoded object | <name slugifiedName="name-requesting-assertions">Requesting Assertions</ | |||
| described in <xref target="sec.jsep-binding"/> that contains the | name> | |||
| <t indent="0" pn="section-7.6-1"> | ||||
| The input to the identity assertion generation process is the JS | ||||
| ON-encoded object | ||||
| described in <xref target="sec.jsep-binding" format="default" se | ||||
| ctionFormat="of" derivedContent="Section 7.4"/> that contains the | ||||
| set of certificate fingerprints the browser intends to use. | 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 indent="0" pn="section-7.6-2"> | |||
| 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 indent="0" pn="section-7.6-3"> | |||
| 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 indent="0" pn="section-7.6-4"> | |||
| 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" indent="3" pn="section-7.6-5"> | |||
| <list style="hanging"> | <dt pn="section-7.6-5.1">idp:</dt> | |||
| <t hangText="idp:"> | <dd pn="section-7.6-5.2"> | |||
| 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 pn="section-7.6-5.3">assertion:</dt> | |||
| <dd pn="section-7.6-5.4"> | ||||
| 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 indent="0" pn="section-7.6-6"> | |||
| <t> | <xref target="fig.assert-ex" format="default" sectionFormat="of" | |||
| <xref target="fig.assert-ex"/> shows an example assertion | derivedContent="Figure 5"/> shows an example 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" align="left" suppress-title="false" pn="f | ||||
| <figure title="Example assertion" anchor="fig.assert-ex"> | igure-5"> | |||
| <artwork><![CDATA[ | <name slugifiedName="name-example-assertion">Example Assertion</name> | |||
| <sourcecode name="json-2" type="json" markers="false" pn="section-7.6- | ||||
| 7.1"> | ||||
| { | { | |||
| "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 indent="0" pn="section-7.6-8"> | |||
| <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" sectionFormat="of" deriv | |||
| value of the <spanx style="verb">identity</spanx> attribute. | edContent="RFC4648">base64-encoded</xref>, and used as the | |||
| IdPs SHOULD ensure that any assertions they | value of the "identity" attribute. | |||
| IdPs <bcp14>SHOULD</bcp14> ensure that any assertions they | ||||
| generate cannot be interpreted in a different context. E.g., | generate cannot be interpreted in a different context. E.g., | |||
| 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="include" removeInRFC | ||||
| <section title="Managing User Login" anchor="sec.user-login"> | ="false" pn="section-7.7"> | |||
| <t> | <name slugifiedName="name-managing-user-login">Managing User Login</name | |||
| > | ||||
| <t indent="0" pn="section-7.7-1"> | ||||
| 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" sectionFormat="of" derivedContent="RFC6265">c | |||
| ookies</xref> or <xref target="RFC7617" format="default" sectionFormat="of" deri | ||||
| vedContent="RFC7617">HTTP | ||||
| authentication</xref> for subsequent exchanges. | authentication</xref> for subsequent exchanges. | |||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-7.7-2"> | |||
| 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 indent="0" pn="section-7.7-3"> | |||
| 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 indent="0" pn="section-7.7-4"> | |||
| 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" sectionFormat="of" derivedContent="webrtc-api"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sec.verify-assert" numbered="true" toc="include" removeInRF | ||||
| <section title="Verifying Assertions" anchor="sec.verify-assert"> | C="false" pn="section-8"> | |||
| <t> | <name slugifiedName="name-verifying-assertions">Verifying Assertions</name | |||
| > | ||||
| <t indent="0" pn="section-8-1"> | ||||
| 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 indent="0" pn="section-8-2"> | |||
| 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 indent="0" pn="section-8-3"> | |||
| 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" indent="3" pn="section-8-4"> | |||
| <dt pn="section-8-4.1">identity:</dt> | ||||
| <dd pn="section-8-4.2"> | ||||
| 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" sectionFormat="of" derivedContent="Section 8.1"/>. | |||
| <t hangText="contents:"> | </dd> | |||
| <dt pn="section-8-4.3">contents:</dt> | ||||
| <dd pn="section-8-4.4"> | ||||
| 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 indent="0" pn="section-8-5"> | |||
| <t> | <xref target="fig.verify-ex" format="default" sectionFormat="of" | |||
| <xref target="fig.verify-ex"/> shows an example response, | derivedContent="Figure 6"/> shows an example response, | |||
| which is JSON-formatted. | which is JSON-formatted. | |||
| </t> | </t> | |||
| <figure anchor="fig.verify-ex" align="left" suppress-title="false" pn="fig | ||||
| <figure title="Example verification result" anchor="fig.verify-ex" | ure-6"> | |||
| > | <name slugifiedName="name-example-verification-result">Example Verificat | |||
| <artwork> | ion Result</name> | |||
| <![CDATA[ | <sourcecode name="json-3" type="json" markers="false" pn="section-8-6.1" | |||
| > | ||||
| { | { | |||
| "identity": "bob@example.org", | "identity": "bob@example.org", | |||
| "contents": "{\"fingerprint\":[ ... ]}" | "contents": "{\"fingerprint\":[ ... ]}" | |||
| } | }</sourcecode> | |||
| ]]></artwork> | </figure> | |||
| </figure> | <section anchor="sec.id-format" numbered="true" toc="include" removeInRFC= | |||
| "false" pn="section-8.1"> | ||||
| <section title="Identity Formats" anchor="sec.id-format"> | <name slugifiedName="name-identity-formats">Identity Formats</name> | |||
| <t> | <t indent="0" pn="section-8.1-1"> | |||
| The identity provided from the IdP to the RP browser MUST | The identity provided from the IdP to the RP browser <bcp14>MU | |||
| 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" sectionFor | |||
| ce of U-labels. | mat="of" derivedContent="RFC5890"/> encoded as a sequence of U-labels. | |||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-8.1-2"> | |||
| 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" indent="adaptive" start="1" pn="section-8. | ||||
| 1-3"> | ||||
| <li pn="section-8.1-3.1" derivedCounter="1."> | ||||
| 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" format="default" derivedLink="https://rfc-editor.org/rfc/rfc5890#se | |||
| <t> | ction-2.3.2.4" derivedContent="RFC5890"/>. | |||
| </li> | ||||
| <li pn="section-8.1-3.2" derivedCounter="2."> | ||||
| <t indent="0" pn="section-8.1-3.2.1"> | ||||
| 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" indent="adaptive" start="1" pn="sectio | ||||
| n-8.1-3.2.2"> | ||||
| <li pn="section-8.1-3.2.2.1" derivedCounter="1."> | ||||
| 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 pn="section-8.1-3.2.2.2" derivedCounter="2."> | |||
| 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 indent="0" pn="section-8.1-4"> | |||
| <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" format="default" derivedLink="https://rfc-editor.org/rfc/rfc3986#sect | |||
| ion-2.1" derivedContent="RFC3986"/>. Characters other than '@' and '%' <bcp14>MU | ||||
| ST 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 indent="0" pn="section-8.1-5"> | |||
| 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> | <section anchor="sec.sec-cons" numbered="true" toc="include" removeInRFC="fa | |||
| lse" pn="section-9"> | ||||
| <section title="Security Considerations" anchor="sec.sec-cons"> | <name slugifiedName="name-security-considerations">Security Considerations | |||
| <t> | </name> | |||
| Much of the security analysis of this problem is contained in <xref | <t indent="0" pn="section-9-1"> | |||
| target="I-D.ietf-rtcweb-security"/> or in the discussion of the | Much of the security analysis of RTCWEB is contained in <xref target=" | |||
| RFC8826" format="default" sectionFormat="of" derivedContent="RFC8826"/> or in th | ||||
| e discussion of the | ||||
| particular issues above. In order to avoid repetition, this section | particular issues above. 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="include" removeInRFC="false" pn="section-9.1 | ||||
| <section title="Communications Security"> | "> | |||
| <t> | <name slugifiedName="name-communications-security-2">Communications Secu | |||
| IF HTTPS is not used to secure communications to the signaling | rity</name> | |||
| <t indent="0" pn="section-9.1-1"> | ||||
| 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" sectionFormat="of" d erivedContent="Section 7"/> 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> | |||
| <t indent="0" pn="section-9.1-2"> | ||||
| <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" sectionFormat="of" derivedContent="Section 6.5"/> 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" sectionFormat="of " derivedContent="Section 7"/> are more suitable 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 IdP 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 indent="0" pn="section-9.1-3"> | ||||
| <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" sec tionFormat="of" derivedContent="webcrypto"/>. 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="include" removeInRFC="false" pn="section-9.2 | ||||
| <section title="Privacy"> | "> | |||
| <t> | <name slugifiedName="name-privacy">Privacy</name> | |||
| <t indent="0" pn="section-9.2-1"> | ||||
| The requirements in this document are intended to allow: | The requirements in this document are intended to allow: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-9 | |||
| <list style="symbols"> | .2-2"> | |||
| <t> | <li pn="section-9.2-2.1"> | |||
| Users to participate in calls without revealing their location. | Users to participate in calls without revealing their location. | |||
| </t> | </li> | |||
| <t> | <li pn="section-9.2-2.2"> | |||
| 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 indent="0" pn="section-9.2-3"> | |||
| <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 tradeoffs | |||
| </t> | . | |||
| <t> | </t> | |||
| <t indent="0" pn="section-9.2-4"> | ||||
| 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/Tor | |||
| implementations SHOULD arrange to route the media as well as the | implementations <bcp14>SHOULD</bcp14> arrange to route the media as | |||
| well as the | ||||
| signaling through Tor. Currently this will produce very suboptimal | signaling through Tor. Currently this will produce very suboptimal | |||
| performance. | performance. | |||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-9.2-5"> | |||
| Additionally, any identifier which persists across multiple calls is | Additionally, any identifier which 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" sectionFo | |||
| </section> | rmat="of" derivedContent="RFC7022"/>. | |||
| </t> | ||||
| <section title="Denial of Service"> | </section> | |||
| <t> | <section numbered="true" toc="include" removeInRFC="false" pn="section-9.3 | |||
| "> | ||||
| <name slugifiedName="name-denial-of-service">Denial of Service</name> | ||||
| <t indent="0" pn="section-9.3-1"> | ||||
| 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 denial-of-service (DoS) attacks in which an attacker uses c lients | |||
| 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 indent="0" pn="section-9.3-2"> | |||
| 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, they 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 indent="0" pn="section-9.3-3"> | |||
| 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 indent="0" pn="section-9.3-4"> | |||
| 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> | <xref target="RFC8834" sectionFormat="comma" section="13" format="de | |||
| <t> | fault" derivedLink="https://rfc-editor.org/rfc/rfc8834#section-13" derivedConten | |||
| <xref target="I-D.ietf-rtcweb-rtp-usage"/> Section 13 documents a nu | t="RFC8834"/> documents a number | |||
| mber | ||||
| of potential RTCP-based DoS attacks and countermeasures. | of potential RTCP-based DoS attacks and countermeasures. | |||
| </t> | </t> | |||
| <t> | <t indent="0" pn="section-9.3-5"> | |||
| 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 tradeoffs here. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="include" removeInRFC="false" pn="section-9.4 | ||||
| <section title="IdP Authentication Mechanism"> | "> | |||
| <t> | <name slugifiedName="name-idp-authentication-mechanis">IdP Authenticatio | |||
| n Mechanism</name> | ||||
| <t indent="0" pn="section-9.4-1"> | ||||
| 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="include" removeInRF | ||||
| <section title="PeerConnection Origin Check" anchor="sec.pc-origin"> | C="false" pn="section-9.4.1"> | |||
| <t> | <name slugifiedName="name-peerconnection-origin-check">PeerConnection | |||
| Origin Check</name> | ||||
| <t indent="0" pn="section-9.4.1-1"> | ||||
| 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 their 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 IdP's | |||
| origin and | 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 indent="0" pn="section-9.4.1-2"> | |||
| 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" sectionFormat="of" der ivedContent="RFC8844"/> for defenses against this | |||
| form of attack. | form of attack. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="sec.sec-idp-uri" numbered="true" toc="include" removeIn | ||||
| <section title="IdP Well-known URI" anchor="sec.sec-idp-uri"> | RFC="false" pn="section-9.4.2"> | |||
| <t> | <name slugifiedName="name-idp-well-known-uri">IdP Well-Known URI</name | |||
| As described in <xref target="sec.idp-uri"/> the IdP proxy HTML/JS | > | |||
| <t indent="0" pn="section-9.4.2-1"> | ||||
| As described in <xref target="sec.idp-uri" format="default" sectio | ||||
| nFormat="of" derivedContent="Section 7.5"/>, 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="include" removeInRFC="false" pn="section-9 | ||||
| <section title="Privacy of IdP-generated identities and the hosting si | .4.3"> | |||
| te"> | <name slugifiedName="name-privacy-of-idp-generated-id">Privacy of IdP- | |||
| <t> | Generated Identities and the Hosting Site</name> | |||
| <t indent="0" pn="section-9.4.3-1"> | ||||
| 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="include" remo | ||||
| <section title="Security of Third-Party IdPs" anchor="sec.sec-third-pa | veInRFC="false" pn="section-9.4.4"> | |||
| rty"> | <name slugifiedName="name-security-of-third-party-idp">Security of Thi | |||
| <t> | rd-Party IdPs</name> | |||
| <t indent="0" pn="section-9.4.4-1"> | ||||
| 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 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="include" removeInRFC="false" pn="section | ||||
| <section title="Confusable Characters"> | -9.4.4.1"> | |||
| <t> | <name slugifiedName="name-confusable-characters">Confusable Characte | |||
| rs</name> | ||||
| <t indent="0" pn="section-9.4.4.1-1"> | ||||
| 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" sectionFormat="of" deriv edContent="RFC6943"/> 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. | format="default" derivedLink="https://rfc-editor.org/rfc/rfc5890#section-4.4" de | |||
| </t> | rivedContent="RFC5890"/>). Other best practices are still in development. | |||
| </section> | </t> | |||
| </section> | </section> | |||
| </section> | ||||
| <section title="Web Security Feature Interactions"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-9 | |||
| <t> | .4.5"> | |||
| <name slugifiedName="name-web-security-feature-intera">Web Security Fe | ||||
| ature Interactions</name> | ||||
| <t indent="0" pn="section-9.4.5-1"> | ||||
| 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="include" rem | ||||
| <section title="Popup Blocking" anchor="sec.popup-blocking"> | oveInRFC="false" pn="section-9.4.5.1"> | |||
| <t> | <name slugifiedName="name-popup-blocking">Popup Blocking</name> | |||
| When popup blocking is in use, the IdP proxy is unable to genera | <t indent="0" pn="section-9.4.5.1-1"> | |||
| te popup windows, dialogs or | When popup blocking is in use, the IdP proxy is unable to genera | |||
| 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="include" | ||||
| <section title="Third Party Cookies" anchor="sec.3rd-party-cookies"> | removeInRFC="false" pn="section-9.4.5.2"> | |||
| <t> | <name slugifiedName="name-third-party-cookies">Third Party Cookies</ | |||
| name> | ||||
| <t indent="0" pn="section-9.4.5.2-1"> | ||||
| 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="include" removeInRFC="f | |||
| <t> | alse" pn="section-10"> | |||
| This specification defines the <spanx style="verb">identity</spanx> | <name slugifiedName="name-iana-considerations">IANA Considerations</name> | |||
| SDP attribute per the procedures of Section 8.2.4 of <xref | <t indent="0" pn="section-10-1"> | |||
| target="RFC4566"/>. The required information for the registration is | This specification defines the "identity" | |||
| SDP attribute per the procedures of <xref target="RFC4566" sectionForm | ||||
| at="of" section="8.2.4" format="default" derivedLink="https://rfc-editor.org/rfc | ||||
| /rfc4566#section-8.2.4" derivedContent="RFC4566"/>. The required information fo | ||||
| r the registration is | ||||
| included here: | included here: | |||
| <list style="hanging"> | ||||
| <t hangText="Contact Name:">IESG (iesg@ietf.org)</t> | ||||
| <t hangText="Attribute Name:">identity</t> | ||||
| <t hangText="Long Form:">identity</t> | ||||
| <t hangText="Type of Attribute:">session-level</t> | ||||
| <t hangText="Charset Considerations:">This attribute is not subject | ||||
| to the charset attribute.</t> | ||||
| <t hangText="Purpose:">This attribute carries an identity assertion, | ||||
| binding an identity to the transport-level security session.</t> | ||||
| <t hangText="Appropriate Values:">See <xref | ||||
| target="sec.sdp-id-attr"/> of RFCXXXX [[Editor Note: This | ||||
| document.]]</t> | ||||
| <t hangText="Mux Category:">NORMAL.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | ||||
| This section reqisters the <spanx style="verb">idp-proxy</spanx> well- | ||||
| known | ||||
| URI from <xref target="RFC5785"/>. | ||||
| <list style="hanging"> | ||||
| <t hangText="URI suffix:">idp-proxy</t> | ||||
| <t hangText="Change controller:">IETF</t> | ||||
| </list> | ||||
| </t> | ||||
| </section> | ||||
| <section title="Acknowledgements"> | ||||
| <t> | ||||
| Bernard Aboba, Harald Alvestrand, Richard Barnes, Dan Druta, Cullen | ||||
| Jennings, Hadriel Kaplan, Matthew Kaufman, Jim McEachern, Martin | ||||
| 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> | |||
| </section> | <dl newline="false" spacing="normal" indent="3" pn="section-10-2"> | |||
| <dt pn="section-10-2.1">Contact Name:</dt> | ||||
| <section title="Changes"> | <dd pn="section-10-2.2">IESG (iesg@ietf.org)</dd> | |||
| <t> [RFC Editor: Please remove this section prior to publication.]</t> | <dt pn="section-10-2.3">Attribute Name:</dt> | |||
| <section title="Changes since -15"> | <dd pn="section-10-2.4">identity</dd> | |||
| <t>Rewrite the Identity section in more conventional offer/answer format | <dt pn="section-10-2.5">Long Form:</dt> | |||
| .</t> | <dd pn="section-10-2.6">identity</dd> | |||
| <t>Clarify rules on changing identities.</t> | <dt pn="section-10-2.7">Type of Attribute:</dt> | |||
| </section> | <dd pn="section-10-2.8">session</dd> | |||
| <dt pn="section-10-2.9">Charset Considerations:</dt> | ||||
| <section title="Changes since -11"> | <dd pn="section-10-2.10">This attribute is not subject | |||
| <t> | to the charset attribute.</dd> | |||
| Update discussion of IdP security model | <dt pn="section-10-2.11">Purpose:</dt> | |||
| </t> | <dd pn="section-10-2.12">This attribute carries an identity assertion, | |||
| binding an identity to the transport-level security session.</dd> | ||||
| <t> | <dt pn="section-10-2.13">Appropriate Values:</dt> | |||
| Replace "domain name" with RFC 3986 Authority | <dd pn="section-10-2.14">See <xref target="sec.sdp-id-attr" format="defa | |||
| </t> | ult" sectionFormat="of" derivedContent="Section 5"/> of RFC 8827.</dd> | |||
| <dt pn="section-10-2.15">Mux Category:</dt> | ||||
| <t> | <dd pn="section-10-2.16">NORMAL</dd> | |||
| Clean up discussion of how to generate IdP URI. | </dl> | |||
| </t> | <t indent="0" pn="section-10-3"> | |||
| This section registers the "idp-proxy" well-known | ||||
| <t> | URI from <xref target="RFC8615" format="default" sectionFormat="of" de | |||
| Remove obsolete text about null cipher suites. | rivedContent="RFC8615"/>. | |||
| </t> | </t> | |||
| <dl newline="false" spacing="normal" indent="3" pn="section-10-4"> | ||||
| <t> | <dt pn="section-10-4.1">URI suffix:</dt> | |||
| Remove obsolete appendixes about older IdP systems | <dd pn="section-10-4.2">idp-proxy</dd> | |||
| </t> | <dt pn="section-10-4.3">Change controller:</dt> | |||
| <dd pn="section-10-4.4">IETF</dd> | ||||
| <t> | </dl> | |||
| 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"> | ||||
| <t> | ||||
| Replaced RTCWEB and RTC-Web with WebRTC, except when referring to the | ||||
| 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"> | ||||
| <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"> | ||||
| <t> | ||||
| Version -04 was a version control mistake. Please ignore. | ||||
| </t> | ||||
| <t> | ||||
| The following changes have been made since the -04 draft. | ||||
| </t> | ||||
| <t> | ||||
| <list style="symbols"> | ||||
| <t> | ||||
| Move origin check from IdP to RP per discussion in YVR. | ||||
| </t> | ||||
| <t> | ||||
| Clarified treatment of X.509-level identities. | ||||
| </t> | ||||
| <t> | ||||
| Editorial cleanup. | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| </section> | ||||
| <section title="Changes since -03"> | ||||
| </section> | ||||
| <section title="Changes since -02"> | ||||
| <t> | ||||
| The following changes have been made since the -02 draft. | ||||
| </t> | ||||
| <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> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <displayreference target="I-D.ietf-tls-dtls13" to="TLS-DTLS13"/> | ||||
| <references pn="section-11"> | ||||
| <name slugifiedName="name-references">References</name> | ||||
| <references pn="section-11.1"> | ||||
| <name slugifiedName="name-normative-references">Normative References</na | ||||
| me> | ||||
| <reference anchor="FIPS186" quoteTitle="true" target="https://doi.org/10 | ||||
| .6028/NIST.FIPS.186-4" derivedAnchor="FIPS186"> | ||||
| <front> | ||||
| <title>Digital Signature Standard (DSS)</title> | ||||
| <author> | ||||
| <organization showOnFrontPage="true">National Institute of Standar | ||||
| ds 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> | ||||
| <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2 | ||||
| 119" quoteTitle="true" derivedAnchor="RFC2119"> | ||||
| <front> | ||||
| <title>Key words for use in RFCs to Indicate Requirement Levels</tit | ||||
| le> | ||||
| <author initials="S." surname="Bradner" fullname="S. Bradner"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="1997" month="March"/> | ||||
| <abstract> | ||||
| <t indent="0">In many standards track documents several words are | ||||
| used to signify the requirements in the specification. These words are often ca | ||||
| pitalized. This document defines these words as they should be interpreted in IE | ||||
| TF documents. This document specifies an Internet Best Current Practices for th | ||||
| e Internet Community, and requests discussion and suggestions for improvements.< | ||||
| /t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="2119"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2818" target="https://www.rfc-editor.org/info/rfc2 | ||||
| 818" quoteTitle="true" derivedAnchor="RFC2818"> | ||||
| <front> | ||||
| <title>HTTP Over TLS</title> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2000" month="May"/> | ||||
| <abstract> | ||||
| <t indent="0">This memo describes how to use Transport Layer Secur | ||||
| ity (TLS) to secure Hypertext Transfer Protocol (HTTP) connections over the Inte | ||||
| rnet. This memo provides information for the Internet community.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2818"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2818"/> | ||||
| </reference> | ||||
| <reference anchor="RFC3264" target="https://www.rfc-editor.org/info/rfc3 | ||||
| 264" quoteTitle="true" derivedAnchor="RFC3264"> | ||||
| <front> | ||||
| <title>An Offer/Answer Model with Session Description Protocol (SDP) | ||||
| </title> | ||||
| <author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | ||||
| "> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2002" month="June"/> | ||||
| <abstract> | ||||
| <t indent="0">This document defines a mechanism by which two entit | ||||
| ies can make use of the Session Description Protocol (SDP) to arrive at a common | ||||
| view of a multimedia session between them. In the model, one participant offer | ||||
| s the other a description of the desired session from their perspective, and the | ||||
| other participant answers with the desired session from their perspective. Thi | ||||
| s offer/answer model is most useful in unicast sessions where information from b | ||||
| oth participants is needed for the complete view of the session. The offer/answ | ||||
| er model is used by protocols like the Session Initiation Protocol (SIP). [STAN | ||||
| DARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="3264"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC3264"/> | ||||
| </reference> | ||||
| <reference anchor="RFC3711" target="https://www.rfc-editor.org/info/rfc3 | ||||
| 711" quoteTitle="true" derivedAnchor="RFC3711"> | ||||
| <front> | ||||
| <title>The Secure Real-time Transport Protocol (SRTP)</title> | ||||
| <author initials="M." surname="Baugher" fullname="M. Baugher"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="D." surname="McGrew" fullname="D. McGrew"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="M." surname="Naslund" fullname="M. Naslund"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E." surname="Carrara" fullname="E. Carrara"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="K." surname="Norrman" fullname="K. Norrman"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2004" month="March"/> | ||||
| <abstract> | ||||
| <t indent="0">This document describes the Secure Real-time Transpo | ||||
| rt Protocol (SRTP), a profile of the Real-time Transport Protocol (RTP), which c | ||||
| an provide confidentiality, message authentication, and replay protection to the | ||||
| RTP traffic and to the control traffic for RTP, the Real-time Transport Control | ||||
| Protocol (RTCP). [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="3711"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC3711"/> | ||||
| </reference> | ||||
| <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3 | ||||
| 986" quoteTitle="true" derivedAnchor="RFC3986"> | ||||
| <front> | ||||
| <title>Uniform Resource Identifier (URI): Generic Syntax</title> | ||||
| <author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee | ||||
| "> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="R." surname="Fielding" fullname="R. Fielding"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="L." surname="Masinter" fullname="L. Masinter"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2005" month="January"/> | ||||
| <abstract> | ||||
| <t indent="0">A Uniform Resource Identifier (URI) is a compact seq | ||||
| uence of characters that identifies an abstract or physical resource. This spec | ||||
| ification defines the generic URI syntax and a process for resolving URI referen | ||||
| ces that might be in relative form, along with guidelines and security considera | ||||
| tions for the use of URIs on the Internet. The URI syntax defines a grammar tha | ||||
| t is a superset of all valid URIs, allowing an implementation to parse the commo | ||||
| n components of a URI reference without knowing the scheme-specific requirements | ||||
| of every possible identifier. This specification does not define a generative | ||||
| grammar for URIs; that task is performed by the individual specifications of eac | ||||
| h URI scheme. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="STD" value="66"/> | ||||
| <seriesInfo name="RFC" value="3986"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC3986"/> | ||||
| </reference> | ||||
| <reference anchor="RFC4566" target="https://www.rfc-editor.org/info/rfc4 | ||||
| 566" quoteTitle="true" derivedAnchor="RFC4566"> | ||||
| <front> | ||||
| <title>SDP: Session Description Protocol</title> | ||||
| <author initials="M." surname="Handley" fullname="M. Handley"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="V." surname="Jacobson" fullname="V. Jacobson"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="C." surname="Perkins" fullname="C. Perkins"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2006" month="July"/> | ||||
| <abstract> | ||||
| <t indent="0">This memo defines the Session Description Protocol ( | ||||
| SDP). SDP is intended for describing multimedia sessions for the purposes of se | ||||
| ssion announcement, session invitation, and other forms of multimedia session in | ||||
| itiation. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4566"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC4566"/> | ||||
| </reference> | ||||
| <reference anchor="RFC4568" target="https://www.rfc-editor.org/info/rfc4 | ||||
| 568" quoteTitle="true" derivedAnchor="RFC4568"> | ||||
| <front> | ||||
| <title>Session Description Protocol (SDP) Security Descriptions for | ||||
| Media Streams</title> | ||||
| <author initials="F." surname="Andreasen" fullname="F. Andreasen"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="M." surname="Baugher" fullname="M. Baugher"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="D." surname="Wing" fullname="D. Wing"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2006" month="July"/> | ||||
| <abstract> | ||||
| <t indent="0">This document defines a Session Description Protocol | ||||
| (SDP) cryptographic attribute for unicast media streams. The attribute describ | ||||
| es a cryptographic key and other parameters that serve to configure security for | ||||
| a unicast media stream in either a single message or a roundtrip exchange. The | ||||
| attribute can be used with a variety of SDP media transports, and this document | ||||
| defines how to use it for the Secure Real-time Transport Protocol (SRTP) unicas | ||||
| t media streams. The SDP crypto attribute requires the services of a data secur | ||||
| ity protocol to secure the SDP message. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4568"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC4568"/> | ||||
| </reference> | ||||
| <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4 | ||||
| 648" quoteTitle="true" derivedAnchor="RFC4648"> | ||||
| <front> | ||||
| <title>The Base16, Base32, and Base64 Data Encodings</title> | ||||
| <author initials="S." surname="Josefsson" fullname="S. Josefsson"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2006" month="October"/> | ||||
| <abstract> | ||||
| <t indent="0">This document describes the commonly used base 64, b | ||||
| ase 32, and base 16 encoding schemes. It also discusses the use of line-feeds i | ||||
| n encoded data, use of padding in encoded data, use of non-alphabet characters i | ||||
| n encoded data, use of different encoding alphabets, and canonical encodings. [ | ||||
| STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4648"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC4648"/> | ||||
| </reference> | ||||
| <reference anchor="RFC5763" target="https://www.rfc-editor.org/info/rfc5 | ||||
| 763" quoteTitle="true" derivedAnchor="RFC5763"> | ||||
| <front> | ||||
| <title>Framework for Establishing a Secure Real-time Transport Proto | ||||
| col (SRTP) Security Context Using Datagram Transport Layer Security (DTLS)</titl | ||||
| e> | ||||
| <author initials="J." surname="Fischl" fullname="J. Fischl"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="H." surname="Tschofenig" fullname="H. Tschofenig"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2010" month="May"/> | ||||
| <abstract> | ||||
| <t indent="0">This document specifies how to use the Session Initi | ||||
| ation Protocol (SIP) to establish a Secure Real-time Transport Protocol (SRTP) s | ||||
| ecurity context using the Datagram Transport Layer Security (DTLS) protocol. It | ||||
| describes a mechanism of transporting a fingerprint attribute in the Session De | ||||
| scription Protocol (SDP) that identifies the key that will be presented during t | ||||
| he DTLS handshake. The key exchange travels along the media path as opposed to | ||||
| the signaling path. The SIP Identity mechanism can be used to protect the integ | ||||
| rity of the fingerprint attribute from modification by intermediate proxies. [S | ||||
| TANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5763"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC5763"/> | ||||
| </reference> | ||||
| <reference anchor="RFC5764" target="https://www.rfc-editor.org/info/rfc5 | ||||
| 764" quoteTitle="true" derivedAnchor="RFC5764"> | ||||
| <front> | ||||
| <title>Datagram Transport Layer Security (DTLS) Extension to Establi | ||||
| sh Keys for the Secure Real-time Transport Protocol (SRTP)</title> | ||||
| <author initials="D." surname="McGrew" fullname="D. McGrew"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2010" month="May"/> | ||||
| <abstract> | ||||
| <t indent="0">This document describes a Datagram Transport Layer S | ||||
| ecurity (DTLS) extension to establish keys for Secure RTP (SRTP) and Secure RTP | ||||
| Control Protocol (SRTCP) flows. DTLS keying happens on the media path, independ | ||||
| ent of any out-of-band signalling channel present. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5764"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC5764"/> | ||||
| </reference> | ||||
| <reference anchor="RFC5890" target="https://www.rfc-editor.org/info/rfc5 | ||||
| 890" quoteTitle="true" derivedAnchor="RFC5890"> | ||||
| <front> | ||||
| <title>Internationalized Domain Names for Applications (IDNA): Defin | ||||
| itions and Document Framework</title> | ||||
| <author initials="J." surname="Klensin" fullname="J. Klensin"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2010" month="August"/> | ||||
| <abstract> | ||||
| <t indent="0">This document is one of a collection that, together, | ||||
| describe the protocol and usage context for a revision of Internationalized Dom | ||||
| ain Names for Applications (IDNA), superseding the earlier version. It describe | ||||
| s the document collection and provides definitions and other material that are c | ||||
| ommon to the set. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5890"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC5890"/> | ||||
| </reference> | ||||
| <reference anchor="RFC6347" target="https://www.rfc-editor.org/info/rfc6 | ||||
| 347" quoteTitle="true" derivedAnchor="RFC6347"> | ||||
| <front> | ||||
| <title>Datagram Transport Layer Security Version 1.2</title> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="N." surname="Modadugu" fullname="N. Modadugu"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2012" month="January"/> | ||||
| <abstract> | ||||
| <t indent="0">This document specifies version 1.2 of the Datagram | ||||
| Transport Layer Security (DTLS) protocol. The DTLS protocol provides communicat | ||||
| ions privacy for datagram protocols. The protocol allows client/server applicat | ||||
| ions to communicate in a way that is designed to prevent eavesdropping, tamperin | ||||
| g, or message forgery. The DTLS protocol is based on the Transport Layer Securi | ||||
| ty (TLS) protocol and provides equivalent security guarantees. Datagram semanti | ||||
| cs of the underlying transport are preserved by the DTLS protocol. This documen | ||||
| t updates DTLS 1.0 to work with TLS version 1.2. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="6347"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC6347"/> | ||||
| </reference> | ||||
| <reference anchor="RFC6454" target="https://www.rfc-editor.org/info/rfc6 | ||||
| 454" quoteTitle="true" derivedAnchor="RFC6454"> | ||||
| <front> | ||||
| <title>The Web Origin Concept</title> | ||||
| <author initials="A." surname="Barth" fullname="A. Barth"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2011" month="December"/> | ||||
| <abstract> | ||||
| <t indent="0">This document defines the concept of an "origin", wh | ||||
| ich is often used as the scope of authority or privilege by user agents. Typica | ||||
| lly, user agents isolate content retrieved from different origins to prevent mal | ||||
| icious web site operators from interfering with the operation of benign web site | ||||
| s. In addition to outlining the principles that underlie the concept of origin, | ||||
| this document details how to determine the origin of a URI and how to serialize | ||||
| an origin into a string. It also defines an HTTP header field, named "Origin", | ||||
| that indicates which origins are associated with an HTTP request. [STANDARDS- | ||||
| TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="6454"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC6454"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7022" target="https://www.rfc-editor.org/info/rfc7 | ||||
| 022" quoteTitle="true" derivedAnchor="RFC7022"> | ||||
| <front> | ||||
| <title>Guidelines for Choosing RTP Control Protocol (RTCP) Canonical | ||||
| Names (CNAMEs)</title> | ||||
| <author initials="A." surname="Begen" fullname="A. Begen"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="C." surname="Perkins" fullname="C. Perkins"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="D." surname="Wing" fullname="D. Wing"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2013" month="September"/> | ||||
| <abstract> | ||||
| <t indent="0">The RTP Control Protocol (RTCP) Canonical Name (CNAM | ||||
| E) is a persistent transport-level identifier for an RTP endpoint. While the Sy | ||||
| nchronization Source (SSRC) identifier of an RTP endpoint may change if a collis | ||||
| ion is detected or when the RTP application is restarted, its RTCP CNAME is mean | ||||
| t to stay unchanged, so that RTP endpoints can be uniquely identified and associ | ||||
| ated with their RTP media streams.</t> | ||||
| <t indent="0">For proper functionality, RTCP CNAMEs should be uniq | ||||
| ue within the participants of an RTP session. However, the existing guidelines | ||||
| for choosing the RTCP CNAME provided in the RTP standard (RFC 3550) are insuffic | ||||
| ient to achieve this uniqueness. RFC 6222 was published to update those guideli | ||||
| nes to allow endpoints to choose unique RTCP CNAMEs. Unfortunately, later inves | ||||
| tigations showed that some parts of the new algorithms were unnecessarily compli | ||||
| cated and/or ineffective. This document addresses these concerns and replaces R | ||||
| FC 6222.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7022"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7022"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7675" target="https://www.rfc-editor.org/info/rfc7 | ||||
| 675" quoteTitle="true" derivedAnchor="RFC7675"> | ||||
| <front> | ||||
| <title>Session Traversal Utilities for NAT (STUN) Usage for Consent | ||||
| Freshness</title> | ||||
| <author initials="M." surname="Perumal" fullname="M. Perumal"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="D." surname="Wing" fullname="D. Wing"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="R." surname="Ravindranath" fullname="R. Ravindrana | ||||
| th"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="T." surname="Reddy" fullname="T. Reddy"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="M." surname="Thomson" fullname="M. Thomson"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2015" month="October"/> | ||||
| <abstract> | ||||
| <t indent="0">To prevent WebRTC applications, such as browsers, fr | ||||
| om launching attacks by sending traffic to unwilling victims, periodic consent t | ||||
| o send needs to be obtained from remote endpoints.</t> | ||||
| <t indent="0">This document describes a consent mechanism using a | ||||
| new Session Traversal Utilities for NAT (STUN) usage.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7675"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7675"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7918" target="https://www.rfc-editor.org/info/rfc7 | ||||
| 918" quoteTitle="true" derivedAnchor="RFC7918"> | ||||
| <front> | ||||
| <title>Transport Layer Security (TLS) False Start</title> | ||||
| <author initials="A." surname="Langley" fullname="A. Langley"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="N." surname="Modadugu" fullname="N. Modadugu"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="B." surname="Moeller" fullname="B. Moeller"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2016" month="August"/> | ||||
| <abstract> | ||||
| <t indent="0">This document specifies an optional behavior of Tran | ||||
| sport Layer Security (TLS) client implementations, dubbed "False Start". It aff | ||||
| ects only protocol timing, not on-the-wire protocol data, and can be implemented | ||||
| unilaterally. A TLS False Start reduces handshake latency to one round trip.</ | ||||
| t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7918"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7918"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8122" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 122" quoteTitle="true" derivedAnchor="RFC8122"> | ||||
| <front> | ||||
| <title>Connection-Oriented Media Transport over the Transport Layer | ||||
| Security (TLS) Protocol in the Session Description Protocol (SDP)</title> | ||||
| <author initials="J." surname="Lennox" fullname="J. Lennox"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="C." surname="Holmberg" fullname="C. Holmberg"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2017" month="March"/> | ||||
| <abstract> | ||||
| <t indent="0">This document specifies how to establish secure conn | ||||
| ection-oriented media transport sessions over the Transport Layer Security (TLS) | ||||
| protocol using the Session Description Protocol (SDP). It defines the SDP prot | ||||
| ocol identifier, 'TCP/TLS'. It also defines the syntax and semantics for an SDP | ||||
| 'fingerprint' attribute that identifies the certificate that will be presented | ||||
| for the TLS session. This mechanism allows media transport over TLS connections | ||||
| to be established securely, so long as the integrity of session descriptions is | ||||
| assured.</t> | ||||
| <t indent="0">This document obsoletes RFC 4572 by clarifying the u | ||||
| sage of multiple fingerprints.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8122"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8122"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 174" quoteTitle="true" derivedAnchor="RFC8174"> | ||||
| <front> | ||||
| <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | ||||
| tle> | ||||
| <author initials="B." surname="Leiba" fullname="B. Leiba"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2017" month="May"/> | ||||
| <abstract> | ||||
| <t indent="0">RFC 2119 specifies common key words that may be used | ||||
| in protocol specifications. This document aims to reduce the ambiguity by cla | ||||
| rifying that only UPPERCASE usage of the key words have the defined special mea | ||||
| nings.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="8174"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 259" quoteTitle="true" derivedAnchor="RFC8259"> | ||||
| <front> | ||||
| <title>The JavaScript Object Notation (JSON) Data Interchange Format | ||||
| </title> | ||||
| <author initials="T." surname="Bray" fullname="T. Bray" role="editor | ||||
| "> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2017" month="December"/> | ||||
| <abstract> | ||||
| <t indent="0">JavaScript Object Notation (JSON) is a lightweight, | ||||
| text-based, language-independent data interchange format. It was derived from t | ||||
| he ECMAScript Programming Language Standard. JSON defines a small set of format | ||||
| ting rules for the portable representation of structured data.</t> | ||||
| <t indent="0">This document removes inconsistencies with other spe | ||||
| cifications of JSON, repairs specification errors, and offers experience-based i | ||||
| nteroperability guidance.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="STD" value="90"/> | ||||
| <seriesInfo name="RFC" value="8259"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8259"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8261" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 261" quoteTitle="true" derivedAnchor="RFC8261"> | ||||
| <front> | ||||
| <title>Datagram Transport Layer Security (DTLS) Encapsulation of SCT | ||||
| P Packets</title> | ||||
| <author initials="M." surname="Tuexen" fullname="M. Tuexen"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="R." surname="Stewart" fullname="R. Stewart"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="R." surname="Jesup" fullname="R. Jesup"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="S." surname="Loreto" fullname="S. Loreto"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2017" month="November"/> | ||||
| <abstract> | ||||
| <t indent="0">The Stream Control Transmission Protocol (SCTP) is a | ||||
| transport protocol originally defined to run on top of the network protocols IP | ||||
| v4 or IPv6. This document specifies how SCTP can be used on top of the Datagram | ||||
| Transport Layer Security (DTLS) protocol. Using the encapsulation method descr | ||||
| ibed in this document, SCTP is unaware of the protocols being used below DTLS; h | ||||
| ence, explicit IP addresses cannot be used in the SCTP control chunks. As a con | ||||
| sequence, the SCTP associations carried over DTLS can only be single-homed.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8261"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8261"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8445" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 445" quoteTitle="true" derivedAnchor="RFC8445"> | ||||
| <front> | ||||
| <title>Interactive Connectivity Establishment (ICE): A Protocol for | ||||
| Network Address Translator (NAT) Traversal</title> | ||||
| <author initials="A." surname="Keranen" fullname="A. Keranen"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="C." surname="Holmberg" fullname="C. Holmberg"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2018" month="July"/> | ||||
| <abstract> | ||||
| <t indent="0">This document describes a protocol for Network Addre | ||||
| ss Translator (NAT) traversal for UDP-based communication. This protocol is cal | ||||
| led Interactive Connectivity Establishment (ICE). ICE makes use of the Session | ||||
| Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using R | ||||
| elay NAT (TURN).</t> | ||||
| <t indent="0">This document obsoletes RFC 5245.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8445"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8445"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 446" quoteTitle="true" derivedAnchor="RFC8446"> | ||||
| <front> | ||||
| <title>The Transport Layer Security (TLS) Protocol Version 1.3</titl | ||||
| e> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2018" month="August"/> | ||||
| <abstract> | ||||
| <t indent="0">This document specifies version 1.3 of the Transport | ||||
| Layer Security (TLS) protocol. TLS allows client/server applications to commun | ||||
| icate over the Internet in a way that is designed to prevent eavesdropping, tamp | ||||
| ering, and message forgery.</t> | ||||
| <t indent="0">This document updates RFCs 5705 and 6066, and obsole | ||||
| tes RFCs 5077, 5246, and 6961. This document also specifies new requirements fo | ||||
| r TLS 1.2 implementations.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8446"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8446"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8615" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 615" quoteTitle="true" derivedAnchor="RFC8615"> | ||||
| <front> | ||||
| <title>Well-Known Uniform Resource Identifiers (URIs)</title> | ||||
| <author initials="M." surname="Nottingham" fullname="M. Nottingham"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2019" month="May"/> | ||||
| <abstract> | ||||
| <t indent="0">This memo defines a path prefix for "well-known loca | ||||
| tions", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.< | ||||
| /t> | ||||
| <t indent="0">In doing so, it obsoletes RFC 5785 and updates the U | ||||
| RI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 | ||||
| to track URI schemes that support well-known URIs in their registry.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8615"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8615"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8825" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 825" quoteTitle="true" derivedAnchor="RFC8825"> | ||||
| <front> | ||||
| <title>Overview: Real-Time Protocols for Browser-Based Applications< | ||||
| /title> | ||||
| <author initials="H." surname="Alvestrand" fullname="Harald T. Alves | ||||
| trand"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8825"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8825"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8826" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 826" quoteTitle="true" derivedAnchor="RFC8826"> | ||||
| <front> | ||||
| <title>Security Considerations for WebRTC</title> | ||||
| <author initials="E." surname="Rescorla" fullname="Eric Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8826"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8826"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8829" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 829" quoteTitle="true" derivedAnchor="RFC8829"> | ||||
| <front> | ||||
| <title>JavaScript Session Establishment Protocol (JSEP)</title> | ||||
| <author initials="J." surname="Uberti" fullname="Justin Uberti"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="C." surname="Jennings" fullname="Cullen Jennings"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E." surname="Rescorla" fullname="Eric Rescorla" ro | ||||
| le="editor"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8829"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8829"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8834" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 834" quoteTitle="true" derivedAnchor="RFC8834"> | ||||
| <front> | ||||
| <title>Media Transport and Use of RTP in WebRTC</title> | ||||
| <author initials="C." surname="Perkins" fullname="Colin Perkins"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="M." surname="Westerlund" fullname="Magnus Westerlu | ||||
| nd"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="J." surname="Ott" fullname="Jörg Ott"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8834"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8834"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8844" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 844" quoteTitle="true" derivedAnchor="RFC8844"> | ||||
| <front> | ||||
| <title>Unknown Key-Share Attacks on Uses of TLS with the Session Des | ||||
| cription Protocol (SDP)</title> | ||||
| <author initials="M" surname="Thomson" fullname="Martin Thomson"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E" surname="Rescorla" fullname="Eric Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8844"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8844"/> | ||||
| </reference> | ||||
| <reference anchor="webcrypto" target="https://www.w3.org/TR/2017/REC-Web | ||||
| CryptoAPI-20170126/" quoteTitle="true" derivedAnchor="webcrypto"> | ||||
| <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> | ||||
| <reference anchor="webrtc-api" target="https://www.w3.org/TR/webrtc/" qu | ||||
| oteTitle="true" derivedAnchor="webrtc-api"> | ||||
| <front> | ||||
| <title>WebRTC 1.0: Real-time Communication Between Browsers</title> | ||||
| <author initials="C." surname="Jennings" fullname="Cullen Jennings"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="H." surname="Boström" fullname="Henrik Boström"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="J-I." surname="Bruaroey" fullname="Jan-Ivar Bruaro | ||||
| ey"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date/> | ||||
| </front> | ||||
| <refcontent>W3C Proposed Recommendation</refcontent> | ||||
| </reference> | ||||
| </references> | ||||
| <references pn="section-11.2"> | ||||
| <name slugifiedName="name-informative-references">Informative References | ||||
| </name> | ||||
| <reference anchor="fetch" target="https://fetch.spec.whatwg.org/" quoteT | ||||
| itle="true" derivedAnchor="fetch"> | ||||
| <front> | ||||
| <title>Fetch</title> | ||||
| <author initials="A." surname="van Kesteren"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="RFC3261" target="https://www.rfc-editor.org/info/rfc3 | ||||
| 261" quoteTitle="true" derivedAnchor="RFC3261"> | ||||
| <front> | ||||
| <title>SIP: Session Initiation Protocol</title> | ||||
| <author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | ||||
| "> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="G." surname="Camarillo" fullname="G. Camarillo"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="A." surname="Johnston" fullname="A. Johnston"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="J." surname="Peterson" fullname="J. Peterson"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="R." surname="Sparks" fullname="R. Sparks"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="M." surname="Handley" fullname="M. Handley"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E." surname="Schooler" fullname="E. Schooler"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2002" month="June"/> | ||||
| <abstract> | ||||
| <t indent="0">This document describes Session Initiation Protocol | ||||
| (SIP), an application-layer control (signaling) protocol for creating, modifying | ||||
| , and terminating sessions with one or more participants. These sessions includ | ||||
| e Internet telephone calls, multimedia distribution, and multimedia conferences. | ||||
| [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="3261"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC3261"/> | ||||
| </reference> | ||||
| <reference anchor="RFC5705" target="https://www.rfc-editor.org/info/rfc5 | ||||
| 705" quoteTitle="true" derivedAnchor="RFC5705"> | ||||
| <front> | ||||
| <title>Keying Material Exporters for Transport Layer Security (TLS)< | ||||
| /title> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2010" month="March"/> | ||||
| <abstract> | ||||
| <t indent="0">A number of protocols wish to leverage Transport Lay | ||||
| er Security (TLS) to perform key establishment but then use some of the keying m | ||||
| aterial for their own purposes. This document describes a general mechanism for | ||||
| allowing that. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5705"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC5705"/> | ||||
| </reference> | ||||
| <reference anchor="RFC6120" target="https://www.rfc-editor.org/info/rfc6 | ||||
| 120" quoteTitle="true" derivedAnchor="RFC6120"> | ||||
| <front> | ||||
| <title>Extensible Messaging and Presence Protocol (XMPP): Core</titl | ||||
| e> | ||||
| <author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre | ||||
| "> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2011" month="March"/> | ||||
| <abstract> | ||||
| <t indent="0">The Extensible Messaging and Presence Protocol (XMPP | ||||
| ) is an application profile of the Extensible Markup Language (XML) that enables | ||||
| the near-real-time exchange of structured yet extensible data between any two o | ||||
| r more network entities. This document defines XMPP's core protocol methods: se | ||||
| tup and teardown of XML streams, channel encryption, authentication, error handl | ||||
| ing, and communication primitives for messaging, network availability ("presence | ||||
| "), and request-response interactions. This document obsoletes RFC 3920. [STAN | ||||
| DARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="6120"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC6120"/> | ||||
| </reference> | ||||
| <reference anchor="RFC6265" target="https://www.rfc-editor.org/info/rfc6 | ||||
| 265" quoteTitle="true" derivedAnchor="RFC6265"> | ||||
| <front> | ||||
| <title>HTTP State Management Mechanism</title> | ||||
| <author initials="A." surname="Barth" fullname="A. Barth"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2011" month="April"/> | ||||
| <abstract> | ||||
| <t indent="0">This document defines the HTTP Cookie and Set-Cookie | ||||
| header fields. These header fields can be used by HTTP servers to store state ( | ||||
| called cookies) at HTTP user agents, letting the servers maintain a stateful ses | ||||
| sion over the mostly stateless HTTP protocol. Although cookies have many histor | ||||
| ical infelicities that degrade their security and privacy, the Cookie and Set-Co | ||||
| okie header fields are widely used on the Internet. This document obsoletes RFC | ||||
| 2965. [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="6265"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC6265"/> | ||||
| </reference> | ||||
| <reference anchor="RFC6455" target="https://www.rfc-editor.org/info/rfc6 | ||||
| 455" quoteTitle="true" derivedAnchor="RFC6455"> | ||||
| <front> | ||||
| <title>The WebSocket Protocol</title> | ||||
| <author initials="I." surname="Fette" fullname="I. Fette"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="A." surname="Melnikov" fullname="A. Melnikov"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2011" month="December"/> | ||||
| <abstract> | ||||
| <t indent="0">The WebSocket Protocol enables two-way communication | ||||
| between a client running untrusted code in a controlled environment to a remote | ||||
| host that has opted-in to communications from that code. The security model us | ||||
| ed for this is the origin-based security model commonly used by web browsers. T | ||||
| he protocol consists of an opening handshake followed by basic message framing, | ||||
| layered over TCP. The goal of this technology is to provide a mechanism for bro | ||||
| wser-based applications that need two-way communication with servers that does n | ||||
| ot rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or < | ||||
| iframe>s and long polling). [STANDARDS-TRACK]</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="6455"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC6455"/> | ||||
| </reference> | ||||
| <reference anchor="RFC6943" target="https://www.rfc-editor.org/info/rfc6 | ||||
| 943" quoteTitle="true" derivedAnchor="RFC6943"> | ||||
| <front> | ||||
| <title>Issues in Identifier Comparison for Security Purposes</title> | ||||
| <author initials="D." surname="Thaler" fullname="D. Thaler" role="ed | ||||
| itor"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2013" month="May"/> | ||||
| <abstract> | ||||
| <t indent="0">Identifiers such as hostnames, URIs, IP addresses, a | ||||
| nd email addresses are often used in security contexts to identify security prin | ||||
| cipals and resources. In such contexts, an identifier presented via some protoc | ||||
| ol is often compared using some policy to make security decisions such as whethe | ||||
| r the security principal may access the resource, what level of authentication o | ||||
| r encryption is required, etc. If the parties involved in a security decision u | ||||
| se different algorithms to compare identifiers, then failure scenarios ranging f | ||||
| rom denial of service to elevation of privilege can result. This document provi | ||||
| des a discussion of these issues that designers should consider when defining id | ||||
| entifiers and protocols, and when constructing architectures that use multiple p | ||||
| rotocols.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="6943"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC6943"/> | ||||
| </reference> | ||||
| <reference anchor="RFC7617" target="https://www.rfc-editor.org/info/rfc7 | ||||
| 617" quoteTitle="true" derivedAnchor="RFC7617"> | ||||
| <front> | ||||
| <title>The 'Basic' HTTP Authentication Scheme</title> | ||||
| <author initials="J." surname="Reschke" fullname="J. Reschke"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2015" month="September"/> | ||||
| <abstract> | ||||
| <t indent="0">This document defines the "Basic" Hypertext Transfer | ||||
| Protocol (HTTP) authentication scheme, which transmits credentials as user-id/ | ||||
| password pairs, encoded using Base64.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7617"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7617"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8224" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 224" quoteTitle="true" derivedAnchor="RFC8224"> | ||||
| <front> | ||||
| <title>Authenticated Identity Management in the Session Initiation P | ||||
| rotocol (SIP)</title> | ||||
| <author initials="J." surname="Peterson" fullname="J. Peterson"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="C." surname="Jennings" fullname="C. Jennings"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="C." surname="Wendt" fullname="C. Wendt"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date year="2018" month="February"/> | ||||
| <abstract> | ||||
| <t indent="0">The baseline security mechanisms in the Session Init | ||||
| iation Protocol (SIP) are inadequate for cryptographically assuring the identity | ||||
| of the end users that originate SIP requests, especially in an interdomain cont | ||||
| ext. This document defines a mechanism for securely identifying originators of | ||||
| SIP requests. It does so by defining a SIP header field for conveying a signatu | ||||
| re used for validating the identity and for conveying a reference to the credent | ||||
| ials of the signer.</t> | ||||
| <t indent="0">This document obsoletes RFC 4474.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8224"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8224"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8828" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 828" quoteTitle="true" derivedAnchor="RFC8828"> | ||||
| <front> | ||||
| <title>WebRTC IP Address Handling Requirements</title> | ||||
| <author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <author initials="G" surname="Shieh" fullname="Guo-wei Shieh"> | ||||
| <organization showOnFrontPage="true"/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8828"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8828"/> | ||||
| </reference> | ||||
| <reference anchor="I-D.ietf-tls-dtls13" quoteTitle="true" target="https: | ||||
| //tools.ietf.org/html/draft-ietf-tls-dtls13-39" derivedAnchor="TLS-DTLS13"> | ||||
| <front> | ||||
| <title>The Datagram Transport Layer Security (DTLS) Protocol Version | ||||
| 1.3</title> | ||||
| <author initials="E." surname="Rescorla" fullname="Eric Rescorla"> | ||||
| <organization showOnFrontPage="true">RTFM, Inc.</organization> | ||||
| </author> | ||||
| <author initials="H." surname="Tschofenig" fullname="Hannes Tschofen | ||||
| ig"> | ||||
| <organization showOnFrontPage="true">Arm Limited</organization> | ||||
| </author> | ||||
| <author initials="N." surname="Modadugu" fullname="Nagendra Modadugu | ||||
| "> | ||||
| <organization showOnFrontPage="true">Google, Inc.</organization> | ||||
| </author> | ||||
| <date month="November" day="2" year="2020"/> | ||||
| <abstract> | ||||
| <t indent="0"> This document specifies Version 1.3 of the Datagr | ||||
| am Transport Layer | ||||
| Security (DTLS) protocol. DTLS 1.3 allows client/server applications | ||||
| to communicate over the Internet in a way that is designed to prevent | ||||
| eavesdropping, tampering, and message forgery. | ||||
| <references title="Normative References"> | The DTLS 1.3 protocol is intentionally based on the Transport Layer | |||
| &RFC2119; | Security (TLS) 1.3 protocol and provides equivalent security | |||
| &RFC2818; | guarantees with the exception of order protection/non-replayability. | |||
| &RFC3264; | Datagram semantics of the underlying transport are preserved by the | |||
| &RFC3711; | DTLS protocol. | |||
| &RFC3986; | ||||
| &RFC4566; | ||||
| &RFC4568; | ||||
| &RFC4648; | ||||
| &RFC5246; | ||||
| &RFC5763; | ||||
| &RFC5764; | ||||
| &RFC5785; | ||||
| &RFC5890; | ||||
| &RFC6347; | ||||
| &RFC6454; | ||||
| &RFC7022; | ||||
| &RFC7675; | ||||
| &RFC7918; | ||||
| &RFC8174; | ||||
| &RFC8122; | ||||
| &RFC8259; | ||||
| &RFC8261; | ||||
| &RFC8445; | ||||
| &I-D.ietf-rtcweb-overview; | ||||
| &I-D.ietf-rtcweb-security; | ||||
| &I-D.ietf-rtcweb-rtp-usage; | ||||
| &I-D.ietf-mmusic-sdp-uks; | ||||
| &I-D.ietf-rtcweb-jsep; | ||||
| <reference anchor="webcrypto"> | ||||
| <front> | ||||
| <title>Web Cryptography API</title> | ||||
| <author fullname="W3C editors" | ||||
| surname="Dahl, Sleevi"> | ||||
| <organization>W3C</organization> | ||||
| </author> | ||||
| <date day="25" month="June" year="2013" /> | ||||
| </front> | ||||
| <annotation>Available at | ||||
| http://www.w3.org/TR/WebCryptoAPI/</annotation> | ||||
| </reference> | ||||
| <reference anchor="webrtc-api"> | ||||
| <front> | ||||
| <title>WebRTC 1.0: Real-time Communication Between Browsers</title> | ||||
| <author fullname="W3C editors" | ||||
| surname="Bergkvist, Burnett, Jennings, Narayanan"> | ||||
| <organization>W3C</organization> | ||||
| </author> | ||||
| <date day="4" month="October" year="2011" /> | ||||
| </front> | ||||
| <annotation>Available at | ||||
| http://dev.w3.org/2011/webrtc/editor/webrtc.html</annotation> | ||||
| </reference> | ||||
| <reference anchor="FIPS186"> | ||||
| <front> | ||||
| <title>Digital Signature Standard (DSS)</title> | ||||
| <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 title="Informative References"> | ||||
| &RFC7617; | ||||
| &RFC3261; | ||||
| &RFC5705; | ||||
| &RFC6455; | ||||
| &RFC6265; | ||||
| &RFC6943; | ||||
| &RFC6120; | ||||
| <reference anchor="XmlHttpRequest"> | ||||
| <front> | ||||
| <title>XMLHttpRequest Level 2</title> | ||||
| <author initials="A." surname="van Kesteren"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date day="17" month="January" year="2012"/> | ||||
| </front> | ||||
| <format target="http://www.w3.org/TR/XMLHttpRequest/" type="TXT"/> | ||||
| </reference> | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="Internet-Draft" value="draft-ietf-tls-dtls13-39"/> | ||||
| <format type="TXT" target="https://www.ietf.org/internet-drafts/draft- | ||||
| ietf-tls-dtls13-39.txt"/> | ||||
| <refcontent>Work in Progress</refcontent> | ||||
| </reference> | ||||
| </references> | ||||
| </references> | </references> | |||
| <section numbered="false" toc="include" removeInRFC="false" pn="section-appe | ||||
| ndix.a"> | ||||
| <name slugifiedName="name-acknowledgements">Acknowledgements</name> | ||||
| <t indent="0" pn="section-appendix.a-1"> | ||||
| <contact fullname="Bernard Aboba"/>, <contact fullname="Harald A | ||||
| lvestrand"/>, <contact fullname="Richard Barnes"/>, <contact fullname="Dan Druta | ||||
| "/>, <contact fullname="Cullen Jennings"/>, <contact fullname="Hadriel K | ||||
| aplan"/>, <contact fullname="Matthew Kaufman"/>, <contact fullname="Jim McEacher | ||||
| n"/>, | ||||
| <contact fullname="Martin Thomson"/>, <contact fullname="Magnus | ||||
| Westerlund"/>. <contact fullname="Matthew Kaufman"/> provided the UI material i | ||||
| n | ||||
| <xref target="sec.proposal.comsec" format="default" sectionFormat="of" d | ||||
| erivedContent="Section 6.5"/>. <contact fullname="Christer Holmberg"/> provided | ||||
| the initial version of <xref target="sec.sdp-id-attr-oa" format="default | ||||
| " sectionFormat="of" derivedContent="Section 5.1"/>. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc | ||||
| ="include" pn="section-appendix.b"> | ||||
| <name slugifiedName="name-authors-address">Author's Address</name> | ||||
| <author fullname="Eric Rescorla" initials="E." surname="Rescorla"> | ||||
| <organization showOnFrontPage="true">Mozilla</organization> | ||||
| <address> | ||||
| <email>ekr@rtfm.com</email> | ||||
| </address> | ||||
| </author> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 332 change blocks. | ||||
| 1520 lines changed or deleted | 2818 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/ | ||||