rfc8672xml2.original.xml | rfc8672.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="utf-8"?> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.9 --> | |||
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.9 --> | <!-- converted to v3 (xml2rfc v2v3 conversion 2.31.0) --> | |||
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" | |||
]> | submissionType="independent" | |||
category="exp" | ||||
<?rfc rfcedstyle="yes"?> | ipr="trust200902" | |||
<?rfc toc="yes"?> | number="8672" | |||
<?rfc tocindent="yes"?> | docName="draft-sheffer-tls-pinning-ticket-12" | |||
<?rfc sortrefs="yes"?> | obsoletes="" | |||
<?rfc symrefs="yes"?> | updates="" | |||
<?rfc strict="yes"?> | xml:lang="en" | |||
<?rfc comments="yes"?> | tocInclude="true" | |||
<?rfc inline="yes"?> | sortRefs="true" | |||
<?rfc text-list-symbols="-o*+"?> | symRefs="true" | |||
version="3"> | ||||
<rfc ipr="trust200902" docName="draft-sheffer-tls-pinning-ticket-12" category="e | ||||
xp"> | ||||
<front> | <front> | |||
<title abbrev="Pinning Tickets">TLS Server Identity Pinning with Tickets</ti | <title abbrev="Pinning with Tickets">TLS Server Identity Pinning with Ticket | |||
tle> | s</title> | |||
<seriesInfo name="RFC" value="8672"/> | ||||
<author initials="Y." surname="Sheffer" fullname="Yaron Sheffer"> | <author initials="Y." surname="Sheffer" fullname="Yaron Sheffer"> | |||
<organization>Intuit</organization> | <organization>Intuit</organization> | |||
<address> | <address> | |||
<email>yaronf.ietf@gmail.com</email> | <email>yaronf.ietf@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="D." surname="Migault" fullname="Daniel Migault"> | <author initials="D." surname="Migault" fullname="Daniel Migault"> | |||
<organization>Ericsson</organization> | <organization>Ericsson</organization> | |||
<address> | <address> | |||
<email>daniel.migault@ericsson.com</email> | <email>daniel.migault@ericsson.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="October" year="2019"/> | ||||
<date year="2019" month="June" day="26"/> | ||||
<area>General</area> | <area>General</area> | |||
<keyword>public-key certificates, trust-on-first-use, TOFU</keyword> | ||||
<keyword>Internet-Draft</keyword> | ||||
<abstract> | <abstract> | |||
<t>Misissued public-key certificates can prevent TLS clients from appropri | ||||
<t>Misissued public-key certificates can prevent TLS clients from appropriately | ately | |||
authenticating the TLS server. Several alternatives | authenticating the TLS server. Several alternatives | |||
have been proposed to detect this situation and prevent a client from establishi ng | have been proposed to detect this situation and prevent a client from establishi ng | |||
a TLS session with a TLS end point authenticated with an illegitimate | a TLS session with a TLS end point authenticated with an illegitimate | |||
public-key certificate. These mechanisms are either not | public-key certificate. These mechanisms are either not | |||
widely deployed or limited to public web browsing.</t> | widely deployed or limited to public web browsing.</t> | |||
<t>This document proposes experimental extensions to TLS with opaque | ||||
<t>This document proposes experimental extensions to TLS with opaque | pinning tickets as a way to pin the server's identity. | |||
pinning tickets as a way to pin the server’s identity. | ||||
During an initial TLS session, | During an initial TLS session, | |||
the server provides an original encrypted pinning ticket. | the server provides an original encrypted pinning ticket. | |||
In subsequent TLS session establishment, upon receipt of the pinning ticket, | In subsequent TLS session establishment, upon receipt of the pinning ticket, | |||
the server proves its ability to decrypt the pinning ticket | the server proves its ability to decrypt the pinning ticket | |||
and thus the ownership of the pinning protection key. | and thus the ownership of the pinning protection key. | |||
The client can now safely conclude that the TLS session is established | The client can now safely conclude that the TLS session is established | |||
with the same TLS server as the original TLS session. | with the same TLS server as the original TLS session. | |||
One of the important properties of this proposal is that | One of the important properties of this proposal is that | |||
no manual management actions are required.</t> | no manual management actions are required.</t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="introduction" numbered="true" toc="default"> | ||||
<section anchor="introduction" title="Introduction"> | <name>Introduction</name> | |||
<t>Misissued public-key certificates can prevent TLS <xref target="RFC8446 | ||||
<t>Misissued public-key certificates can prevent TLS <xref target="RFC8446"/> cl | " format="default"/> clients from | |||
ients from | ||||
appropriately authenticating the TLS server. This is a significant | appropriately authenticating the TLS server. This is a significant | |||
risk in the context of the global public key infrastructure (PKI), | risk in the context of the global public key infrastructure (PKI), | |||
and similarly for large scale | and similarly for large-scale | |||
deployments of certificates within enterprises.</t> | deployments of certificates within enterprises.</t> | |||
<t>This document proposes experimental extensions to TLS with opaque | <t>This document proposes experimental extensions to TLS with opaque | |||
pinning tickets as a way to pin the server’s identity. The approach | pinning tickets as a way to pin the server's identity. The approach | |||
is intended to be easy to implement and deploy, and reuses some of | is intended to be easy to implement and deploy, and reuses some of | |||
the ideas behind TLS session resumption <xref target="RFC5077"/>.</t> | the ideas behind TLS session resumption <xref target="RFC5077" format="default"/ >.</t> | |||
<t>Ticket pinning is a second factor server authentication method and is | <t>Ticket pinning is a second-factor server authentication method and is | |||
not proposed as a substitute for the authentication method provided in | not proposed as a substitute for the authentication method provided in | |||
the TLS key exchange. More specifically, the client only uses the | the TLS key exchange. More specifically, the client only uses the | |||
pinning identity method after the TLS key exchange is successfully | pinning identity method after the TLS key exchange is successfully | |||
completed. In other words, the pinning identity method is only | completed. In other words, the pinning identity method is only | |||
performed over an authenticated TLS session. Note that Ticket Pinning | performed over an authenticated TLS session. Note that ticket pinning | |||
does not pin certificate information and therefore is truly an | does not pin certificate information and therefore is truly an | |||
independent second factor authentication.</t> | independent second-factor authentication.</t> | |||
<t>Ticket pinning is a trust-on-first-use (TOFU) mechanism, in that the | ||||
<t>Ticket pinning is a Trust On First Use (TOFU) mechanism, in that the | ||||
first server authentication is only based on PKI certificate validation, | first server authentication is only based on PKI certificate validation, | |||
but for any follow-on sessions, the client is further ensuring the | but for any follow-on sessions, the client is further ensuring the | |||
server’s identity based on the server’s ability to decrypt the ticket, | server's identity based on the server's ability to decrypt the ticket, | |||
in addition to normal PKI certificate authentication.</t> | in addition to normal PKI certificate authentication.</t> | |||
<t>During initial TLS session establishment, the client requests a pinning | ||||
<t>During initial TLS session establishment, the client requests a pinning | ||||
ticket from the server. Upon receiving the request the server generates | ticket from the server. Upon receiving the request the server generates | |||
a pinning secret which is expected to be unpredictable for peers other | a pinning secret that is expected to be unpredictable for peers other | |||
than the client or the server. In our case, the pinning secret is | than the client or the server. In our case, the pinning secret is | |||
generated from parameters exchanged during the TLS key exchange, so | generated from parameters exchanged during the TLS key exchange, so | |||
client and server can generate it locally and independently. The server | client and server can generate it locally and independently. The server | |||
constructs the pinning ticket with the necessary information to retrieve | constructs the pinning ticket with the necessary information to retrieve | |||
the pinning secret. The server then encrypts the ticket and returns the | the pinning secret. The server then encrypts the ticket and returns the | |||
pinning ticket to the client with an associated pinning lifetime.</t> | pinning ticket to the client with an associated pinning lifetime.</t> | |||
<t>The pinning lifetime value indicates for how long the server promises t | ||||
<t>The pinning lifetime value indicates for how long the server promises to | o | |||
retain the server-side ticket-encryption key, which allows it to | retain the server-side ticket-encryption key, which allows it to | |||
complete the protocol exchange correctly and prove its identity. The | complete the protocol exchange correctly and prove its identity. The | |||
server commitment (and ticket lifetime) is typically on the order of | server commitment (and ticket lifetime) is typically on the order of | |||
weeks.</t> | weeks.</t> | |||
<t>Once the key exchange is completed, and the server is deemed | ||||
<t>Once the key exchange is completed and the server is deemed | ||||
authenticated, the client generates locally the pinning secret and | authenticated, the client generates locally the pinning secret and | |||
caches the server’s identifiers to index the pinning secret as well as | caches the server's identifiers to index the pinning secret as well as | |||
the pinning ticket and its associated lifetime.</t> | the pinning ticket and its associated lifetime.</t> | |||
<t>When the client reestablishes a new TLS session with the server, it | ||||
<t>When the client re-establishes a new TLS session with the server, it | ||||
sends the pinning ticket to the server. Upon receiving it, the server | sends the pinning ticket to the server. Upon receiving it, the server | |||
returns a proof of knowledge of the pinning secret. Once the key | returns a proof of knowledge of the pinning secret. Once the key | |||
exchange is completed and the server has been authenticated, the client | exchange is completed, and the server has been authenticated, the client | |||
checks the pinning proof returned by the server using the client’s | checks the pinning proof returned by the server using the client's | |||
stored pinning secret. If the proof matches, the client can conclude | stored pinning secret. If the proof matches, the client can conclude | |||
that the server it is currently connecting to is in fact the correct | that the server to which it is currently connecting is, in fact, the correct | |||
server.</t> | server.</t> | |||
<t>This document only applies to TLS 1.3. | <t>This document only applies to TLS 1.3. | |||
We believe that the | We believe that the | |||
idea can also be back-fitted into earlier versions of the protocol, but | idea can also be retrofitted into earlier versions of the protocol, but | |||
this would require significant changes. | this would require significant changes. | |||
One example is that TLS 1.2 <xref target="RFC5246"/> and | One example is that TLS 1.2 <xref target="RFC5246" format="default"/> and | |||
earlier versions do not provide a generic facility of encrypted | earlier versions do not provide a generic facility of encrypted | |||
handshake extensions, such as is used here to transport the ticket.</t> | handshake extensions, such as is used here to transport the ticket.</t> | |||
<t>The main advantages of this protocol over earlier pinning solutions | ||||
<t>The main advantages of this protocol over earlier pinning solutions are:</t> | are the following:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>The protocol is at the TLS level, and as a result is not restricted | |||
<t>The protocol is at the TLS level, and as a result is not restricted to | to | |||
HTTP at the application level.</t> | HTTP at the application level.</li> | |||
<t>The protocol is robust to server IP, Certificate Authority (CA), | <li>The protocol is robust to changes in server IP address, | |||
and public key changes. The | certification authority (CA), and public key. The | |||
server is characterized by the ownership of the pinning protection key, | server is characterized by the ownership of the pinning protection key, | |||
which is never provided to the client. Server configuration parameters | which is never provided to the client. Server configuration parameters | |||
such as the CA and the public key may change without affecting the | such as the CA and the public key may change without affecting the | |||
pinning ticket protocol.</t> | pinning ticket protocol.</li> | |||
<t>Once a single parameter is configured (the ticket’s lifetime), operation | <li>Once a single parameter is configured (the ticket's lifetime), opera | |||
tion | ||||
is fully automated. The server administrator need not bother with the | is fully automated. The server administrator need not bother with the | |||
management of backup certificates or explicit pins.</t> | management of backup certificates or explicit pins.</li> | |||
<t>For server clusters, we reuse the existing <xref target="RFC5077"/> infrast | <li>For server clusters, we reuse the existing infrastructure <xref targ | |||
ructure | et="RFC5077" format="default"/> | |||
where it exists.</t> | where it exists.</li> | |||
<t>Pinning errors, presumably resulting from man-in-the-middle (MITM) attacks, | <li>Pinning errors, presumably resulting from man-in-the-middle (MITM) a | |||
ttacks, | ||||
can be detected | can be detected | |||
both by the client and the server. This allows for server-side detection | both by the client and the server. This allows for server-side detection | |||
of MITM attacks using large-scale analytics, and with no need to rely on | of MITM attacks using large-scale analytics, and with no need to rely on | |||
clients to explicitly report the error.</t> | clients to explicitly report the error.</li> | |||
</list></t> | </ul> | |||
<t>A note on terminology: unlike other solutions in this space, we do not | ||||
<t>A note on terminology: unlike other solutions in this space, we do not | do "certificate pinning" (or "public key pinning"), since the protocol | |||
do “certificate pinning” (or “public key pinning”), since the protocol | is oblivious to the server's certificate. We prefer the term "server | |||
is oblivious to the server’s certificate. We prefer the term “server | identity pinning" for this new solution. In our solution, the server | |||
identity pinning” for this new solution. In our solution, the server | ||||
proves its identity by generating a proof that it can read and decrypt | proves its identity by generating a proof that it can read and decrypt | |||
an encrypted ticket. As a result, the identity proof relies on proof of | an encrypted ticket. As a result, the identity proof relies on proof of | |||
ownership of the pinning protection key. However, this key is never | ownership of the pinning protection key. However, this key is never | |||
exchanged with the client or known by it, and so cannot itself be | exchanged with the client or known by it, and so cannot itself be | |||
pinned.</t> | pinned.</t> | |||
<section anchor="conventions-used-in-this-document" numbered="true" toc="d | ||||
<section anchor="conventions-used-in-this-document" title="Conventions used in t | efault"> | |||
his document"> | <name>Conventions Used in This Document</name> | |||
<t> | ||||
<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
“MAY”, and “OPTIONAL” in this document are to be interpreted as | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
only when, they | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
appear in all capitals, as shown here.</t> | be interpreted as | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | ||||
</section> | when, and only when, they appear in all capitals, as shown here. | |||
<section anchor="scope-of-experimentation" title="Scope of Experimentation"> | </t> | |||
</section> | ||||
<t>This document describes an experimental extension to the TLS protocol. | <section anchor="scope-of-experimentation" numbered="true" toc="default"> | |||
<name>Scope of Experimentation</name> | ||||
<t>This document describes an experimental extension to the TLS protocol | ||||
. | ||||
This section defines constraints on this experiment and how it can yield useful information, potentially resulting in a standard.</t> | This section defines constraints on this experiment and how it can yield useful information, potentially resulting in a standard.</t> | |||
<t>The protocol is designed so that if the server does not support it, t | ||||
<t>The protocol is designed so that if the server does not support it, the clien | he client and server fall back to a normal TLS exchange, | |||
t and server fall back to a normal TLS exchange, | ||||
with the exception of a single PinningTicket extension being initially sent by t he client. | with the exception of a single PinningTicket extension being initially sent by t he client. | |||
In addition, the protocol is designed to only strengthen the validation of the s erver’s identity (“second factor”). | In addition, the protocol is designed only to strengthen the validation of the s erver's identity ("second factor"). | |||
As a result, implementation or even protocol errors should not result in | As a result, implementation or even protocol errors should not result in | |||
weakened security compared to the normal TLS exchange. | weakened security compared to the normal TLS exchange. | |||
Given these two points, experimentation can be run on the open Internet between consenting client and server implementations.</t> | Given these two points, experimentation can be run on the open Internet between consenting client and server implementations.</t> | |||
<t>The goal of the experiment is to prove that:</t> | ||||
<t>The goal of the experiment is to prove that:</t> | <ul spacing="normal"> | |||
<li>Non-supporting clients and servers are unaffected.</li> | ||||
<t><list style="symbols"> | <li>Connectivity between supporting clients and servers is retained un | |||
<t>Non-supporting clients and servers are unaffected.</t> | der normal circumstances, | |||
<t>Connectivity between supporting clients and servers is retained under norma | whether the client connects to the server frequently (relative to the ticket's l | |||
l circumstances, | ifetime) or very rarely.</li> | |||
whether the client connects to the server frequently (relative to the ticket’s l | <li>Enterprise middleboxes do not interrupt such connectivity.</li> | |||
ifetime) or very rarely.</t> | <li>Misissued certificates and rogue TLS-aware middleboxes do result i | |||
<t>Enterprise middleboxes do not interrupt such connectivity.</t> | n broken connectivity, | |||
<t>Misissued certificates and rogue TLS-aware middleboxes do result in broken | ||||
connectivity, | ||||
and these cases are detected on the client and/or server side. Clients and serve rs can be recovered | and these cases are detected on the client and/or server side. Clients and serve rs can be recovered | |||
even after such events and the normal connectivity restored.</t> | even after such events and the normal connectivity restored.</li> | |||
</list></t> | </ul> | |||
<t>Following two years of successful deployment, the authors will publis | ||||
<t>Following two years of successful deployment, the authors will publish a docu | h a document that summarizes | |||
ment that summarizes | the experiment's findings and will resubmit the protocol for | |||
the experiment’s findings and will resubmit the protocol for | ||||
consideration as a Proposed Standard.</t> | consideration as a Proposed Standard.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="protocol-overview" numbered="true" toc="default"> | |||
<section anchor="protocol-overview" title="Protocol Overview"> | <name>Protocol Overview</name> | |||
<t>The protocol consists of two phases: the first time a particular client | ||||
<t>The protocol consists of two phases: the first time a particular client | ||||
connects to a server, and subsequent connections.</t> | connects to a server, and subsequent connections.</t> | |||
<t>This protocol supports full TLS handshakes, as well as 0-RTT handshakes | ||||
<t>This protocol supports full TLS handshakes, as well as 0-RTT handshakes. | . | |||
Below we present it in the context of a full handshake, but behavior in | Below we present it in the context of a full handshake, but behavior in | |||
0-RTT handshakes should be identical.</t> | 0-RTT handshakes should be identical.</t> | |||
<t>The document presents some similarities with the ticket resumption | ||||
<t>The document presents some similarities with the ticket resumption | mechanism described in <xref target="RFC5077" format="default"/>. However the sc | |||
mechanism described in <xref target="RFC5077"/>. However the scope of this docum | ope of this document | |||
ent | differs from session resumption mechanisms implemented with <xref target="RFC507 | |||
differs from session resumption mechanisms implemented with <xref target="RFC507 | 7" format="default"/> | |||
7"/> | ||||
or with other mechanisms. Specifically, the pinning ticket does not | or with other mechanisms. Specifically, the pinning ticket does not | |||
carry any state associated with a TLS session and thus cannot be used | carry any state associated with a TLS session and thus cannot be used | |||
for session resumption, or to authenticate the client. Instead, the | for session resumption or client authentication. Instead, the | |||
pinning ticket only contains the encrypted pinning secret. | pinning ticket only contains the encrypted pinning secret. | |||
The pinning ticket is used by the server to prove | The pinning ticket is used by the server to prove | |||
its ability to decrypt it, which implies ownership of the pinning | its ability to decrypt it, which implies ownership of the pinning | |||
protection key.</t> | protection key.</t> | |||
<t><xref target="RFC5077" format="default"/> has been obsoleted | ||||
<t><xref target="RFC5077"/> has been obsoleted by <xref target="RFC8446"/> and t | by <xref target="RFC8446" format="default"/>, and ticket resumption is | |||
icket resumption is | now defined by <xref target="RFC8446" sectionFormat="of" section="2.2" format=" | |||
now defined by Sec. 2.2 of <xref target="RFC8446"/>. This document references | default"/>. This document references | |||
<xref target="RFC5077"/> as an informational document since it contains a more | <xref target="RFC5077" format="default"/> as an informational document since it | |||
thorough discussion of stateless ticket resumption and because | contains a more | |||
thorough discussion of stateless ticket resumption, and because | ||||
ticket resumption benefits | ticket resumption benefits | |||
from significant operational experience with TLS 1.2 that is still | from significant operational experience with TLS 1.2 that is still | |||
widely deployed at the time of writing this document. This experience | widely deployed at the time of writing. This experience, | |||
as well as deployment can easily be re-used for identity pinning.</t> | as well as deployment experience, can easily be re-used for identity pinning.</t | |||
> | ||||
<t>With TLS 1.3, session resumption is based on a preshared key (PSK). | <t>With TLS 1.3, session resumption is based on a Pre-Shared Key (PSK). | |||
This is orthogonal to this protocol. With TLS 1.3, a TLS session can be | This is orthogonal to this protocol. With TLS 1.3, a TLS session can be | |||
established using PKI and a pinning ticket, and later resumed with PSK.</t> | established using PKI and a pinning ticket, and later resumed with PSK.</t> | |||
<t>However, the protocol described in this document addresses the problem | ||||
<t>However, the protocol described in this document addresses the problem | ||||
of misissued certificates. Thus, it is not expected to be used outside a | of misissued certificates. Thus, it is not expected to be used outside a | |||
certificate-based TLS key exchange, such as in PSK. As a result, PSK | certificate-based TLS key exchange, such as in PSK. As a result, PSK | |||
handshakes MUST NOT include the extension defined here.</t> | handshakes <bcp14>MUST NOT</bcp14> include the extension defined here.</t> | |||
<section anchor="initial-connection" numbered="true" toc="default"> | ||||
<section anchor="initial-connection" title="Initial Connection"> | <name>Initial Connection</name> | |||
<t>When a client first connects to a server, it requests a pinning ticke | ||||
<t>When a client first connects to a server, it requests a pinning ticket | t | |||
by sending an empty PinningTicket extension, and receives it as part of | by sending an empty PinningTicket extension, and receives it as part of | |||
the server’s first response, in the returned PinningTicket extension.</t> | the server's first response, in the returned PinningTicket extension.</t> | |||
<artwork name="" type="ascii-art" align="left" alt=""><![CDATA[ | ||||
<figure><artwork><![CDATA[ | ||||
Client Server | Client Server | |||
ClientHello | ClientHello | |||
+ key_share | + key_share | |||
+ signature_algorithms | + signature_algorithms | |||
+ PinningTicket --------> | + PinningTicket --------> | |||
ServerHello | ServerHello | |||
+ key_share | + key_share | |||
{EncryptedExtensions | {EncryptedExtensions | |||
+ PinningTicket} | + PinningTicket} | |||
skipping to change at line 279 ¶ | skipping to change at line 250 ¶ | |||
[Application Data] <-------> [Application Data] | [Application Data] <-------> [Application Data] | |||
* Indicates optional or situation-dependent | * Indicates optional or situation-dependent | |||
messages that are not always sent. | messages that are not always sent. | |||
{} Indicates messages protected using keys | {} Indicates messages protected using keys | |||
derived from the ephemeral secret. | derived from the ephemeral secret. | |||
[] Indicates messages protected using keys | [] Indicates messages protected using keys | |||
derived from the master secret. | derived from the master secret. | |||
]]></artwork></figure> | ]]></artwork> | |||
<t>If a client supports the PinningTicket extension and does not have an | ||||
<t>If a client supports the PinningTicket extension and does not have any | y | |||
pinning ticket associated with the server, the exchange is considered as | pinning ticket associated with the server, the exchange is considered as | |||
an initial connection. Other reasons the client may not have a pinning | an initial connection. Other reasons the client may not have a pinning | |||
ticket include the client having flushed its pinning ticket store, or | ticket include the client having flushed its pinning ticket store, or | |||
the committed lifetime of the pinning ticket having expired.</t> | the committed lifetime of the pinning ticket having expired.</t> | |||
<t>Upon receipt of the PinningTicket extension, the server computes a | ||||
<t>Upon receipt of the PinningTicket extension, the server computes a | pinning secret (<xref target="pinning-secret" format="default"/>) and sends the | |||
pinning secret (<xref target="pinning-secret"/>), and sends the pinning ticket | pinning ticket | |||
(<xref target="pinning-ticket"/>) encrypted with the pinning protection key | (<xref target="pinning-ticket" format="default"/>) encrypted with the pinning pr | |||
(<xref target="pinning-ticket-key"/>). The pinning ticket is associated with a | otection key | |||
(<xref target="pinning-ticket-key" format="default"/>). The pinning ticket is a | ||||
ssociated with a | ||||
lifetime value by which the server assumes the responsibility of | lifetime value by which the server assumes the responsibility of | |||
retaining the pinning protection key and being able to decrypt incoming | retaining the pinning protection key and being able to decrypt incoming | |||
pinning tickets during the period indicated by the committed lifetime.</t> | pinning tickets during the period indicated by the committed lifetime.</t> | |||
<t>Once the pinning ticket has been generated, the server returns the | ||||
<t>Once the pinning ticket has been generated, the server returns the | ||||
pinning ticket and the committed lifetime in a PinningTicket extension | pinning ticket and the committed lifetime in a PinningTicket extension | |||
embedded in the EncryptedExtensions message. We note that a | embedded in the EncryptedExtensions message. We note that a | |||
PinningTicket extension MUST NOT be sent as part of a HelloRetryRequest.</t> | PinningTicket extension <bcp14>MUST NOT</bcp14> be sent as part of a HelloRetryR | |||
equest.</t> | ||||
<t>Upon receiving the pinning ticket, the client MUST NOT accept it until | <t>Upon receiving the pinning ticket, the client <bcp14>MUST NOT</bcp14> | |||
accept it until | ||||
the key exchange is completed and the server authenticated. If the key | the key exchange is completed and the server authenticated. If the key | |||
exchange is not completed successfully, the client MUST ignore the | exchange is not completed successfully, the client <bcp14>MUST</bcp14> ignore th e | |||
received pinning ticket. Otherwise, the client computes the pinning | received pinning ticket. Otherwise, the client computes the pinning | |||
secret and SHOULD cache the pinning secret and the pinning ticket for | secret and <bcp14>SHOULD</bcp14> cache the pinning secret and the pinning ticket | |||
the duration indicated by the pinning ticket lifetime. The client SHOULD | for | |||
the duration indicated by the pinning ticket lifetime. The client <bcp14>SHOULD< | ||||
/bcp14> | ||||
clean up the cached values at the end of the indicated lifetime.</t> | clean up the cached values at the end of the indicated lifetime.</t> | |||
</section> | ||||
</section> | <section anchor="subsequent-connections" numbered="true" toc="default"> | |||
<section anchor="subsequent-connections" title="Subsequent Connections"> | <name>Subsequent Connections</name> | |||
<t>When the client initiates a connection to a server it has previously | ||||
<t>When the client initiates a connection to a server it has previously | seen (see <xref target="indexing" format="default"/> on identifying servers), it | |||
seen (see <xref target="indexing"/> on identifying servers), it SHOULD send the | <bcp14>SHOULD</bcp14> send the | |||
pinning ticket for that server. The pinning ticket, pinning secret and | pinning ticket for that server. The pinning ticket, pinning secret, and | |||
pinning ticket lifetime computed during the establishment of the | pinning ticket lifetime computed during the establishment of the | |||
previous TLS session are designated in this document as the “original” | previous TLS session are designated in this document as the "original" | |||
ones, to distinguish them from a new ticket that may be generated during | ones, to distinguish them from a new ticket that may be generated during | |||
the current session.</t> | the current session.</t> | |||
<t>The server <bcp14>MUST</bcp14> extract the original pinning_secret va | ||||
<t>The server MUST extract the original pinning_secret value from the | lue from the | |||
ticket and MUST respond with a PinningTicket extension, which includes:</t> | ticket and <bcp14>MUST</bcp14> respond with a PinningTicket extension, which inc | |||
ludes:</t> | ||||
<t><list style="symbols"> | <ul spacing="normal"> | |||
<t>A proof that the server can understand the ticket that was sent by the | <li>A proof that the server can understand the ticket that was sent by | |||
client; this proof also binds the pinning ticket to the server’s | the | |||
client; this proof also binds the pinning ticket to the server's | ||||
(current) public key, as well as the ongoing TLS session. The proof is | (current) public key, as well as the ongoing TLS session. The proof is | |||
mandatory and MUST be included if a pinning ticket was sent by the client.</t> | mandatory and <bcp14>MUST</bcp14> be included if a pinning ticket was sent by th | |||
<t>A fresh pinning ticket. The main reason for refreshing the ticket on | e client.</li> | |||
<li>A fresh pinning ticket. The main reason for refreshing the ticket | ||||
on | ||||
each connection is privacy: to avoid the ticket serving as a fixed | each connection is privacy: to avoid the ticket serving as a fixed | |||
client identifier. While a fresh pinning ticket might be of zero length, | client identifier. While a fresh pinning ticket might be of zero length, | |||
it is RECOMMENDED to include a fresh ticket with a non zero length with each | it is <bcp14>RECOMMENDED</bcp14> to include a fresh ticket with a nonzero length | |||
response.</t> | with each | |||
</list></t> | response.</li> | |||
</ul> | ||||
<t>If the server cannot validate the received ticket, that might indicate | <t>If the server cannot validate the received ticket, that might indicat | |||
an earlier MITM attack on this client. The server MUST then abort the | e | |||
connection with a handshake_failure alert, and SHOULD log this failure.</t> | an earlier MITM attack on this client. The server <bcp14>MUST</bcp14> then abort | |||
the | ||||
<t>The client MUST verify the proof, and if it fails to do so, MUST issue a | connection with a handshake_failure alert and <bcp14>SHOULD</bcp14> log this fai | |||
lure.</t> | ||||
<t>The client <bcp14>MUST</bcp14> verify the proof, and if it fails to d | ||||
o so, | ||||
the client <bcp14>MUST</bcp14> issue a | ||||
handshake_failure alert and abort the connection (see also | handshake_failure alert and abort the connection (see also | |||
<xref target="client_error"/>). It is important that the client does not attemp | <xref target="client_error" format="default"/>). It is important that the clien | |||
t to | t does not attempt to | |||
“fall back” by omitting the PinningTicket extension.</t> | "fall back" by omitting the PinningTicket extension.</t> | |||
<t>When the connection is successfully set up, i.e., after the Finished | ||||
<t>When the connection is successfully set up, i.e. after the Finished | message is verified, the client <bcp14>SHOULD</bcp14> store the new ticket along | |||
message is verified, the client SHOULD store the new ticket along with | with | |||
the corresponding pinning_secret, replacing the original ticket.</t> | the corresponding pinning_secret, replacing the original ticket.</t> | |||
<t>Although this is an extension, if the client already has a ticket for | ||||
<t>Although this is an extension, if the client already has a ticket for a | a | |||
server, the client MUST interpret a missing PinningTicket extension in | server, the client <bcp14>MUST</bcp14> interpret a missing PinningTicket extensi | |||
the server’s response as an attack, because of the server’s prior | on in | |||
commitment to respect the ticket. The client MUST abort the connection | the server's response as an attack, because of the server's prior | |||
in this case. See also <xref target="ramp_down"/> on ramping down support for t | commitment to respect the ticket. The client <bcp14>MUST</bcp14> abort the conne | |||
his | ction | |||
in this case. See also <xref target="ramp_down" format="default"/> on ramping d | ||||
own support for this | ||||
extension.</t> | extension.</t> | |||
</section> | ||||
<section anchor="indexing" numbered="true" toc="default"> | ||||
<name>Indexing the Pins</name> | ||||
</section> | <t>Each pin is associated with a set of identifiers that include, among | |||
<section anchor="indexing" title="Indexing the Pins"> | others, hostname, protocol (TLS or DTLS), and port | |||
<t>Each pin is associated with a set of identifiers which include among | ||||
others host name, protocol (TLS or DTLS) and port | ||||
number. In other words, the pin for port TCP/443 may be different from | number. In other words, the pin for port TCP/443 may be different from | |||
that for DTLS or from the pin for port TCP/8443. These identifiers are | that for DTLS, or from the pin for port TCP/8443. These identifiers are | |||
expected to be relevant to characterize the identity of the server as | expected to be relevant to characterize the identity of the server as | |||
well as the establishing TLS session. When a host name is used, it MUST be | well as the establishing TLS session. When a hostname is used, it <bcp14>MUST</b cp14> be | |||
the value sent inside the Server Name Indication (SNI) extension. This | the value sent inside the Server Name Indication (SNI) extension. This | |||
definition is similar to a Web Origin <xref target="RFC6454"/>, but does not ass ume | definition is similar to the concept of a Web Origin <xref target="RFC6454" form at="default"/>, but does not assume | |||
the existence of a URL.</t> | the existence of a URL.</t> | |||
<t>The purpose of ticket pinning is to pin the server identity. As a | ||||
<t>The purpose of ticket pinning is to pin the server identity. As a | result, any information orthogonal to the server's identity <bcp14>MUST NOT</bcp | |||
result, any information orthogonal to the server’s identity MUST NOT be | 14> be | |||
considered in indexing. More particularly, IP addresses are ephemeral | considered in indexing. More particularly, IP addresses are ephemeral | |||
and forbidden in SNI and therefore pins MUST NOT be associated with IP | and forbidden in SNI, and therefore pins <bcp14>MUST NOT</bcp14> be associated w ith IP | |||
addresses. Similarly, CA names or public keys associated with server | addresses. Similarly, CA names or public keys associated with server | |||
MUST NOT be used for indexing as they may change over time.</t> | <bcp14>MUST NOT</bcp14> be used for indexing as they may change over time.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="message-definitions" numbered="true" toc="default"> | |||
<section anchor="message-definitions" title="Message Definitions"> | <name>Message Definitions</name> | |||
<t>This section defines the format of the PinningTicket extension. | ||||
<t>This section defines the format of the PinningTicket extension. | We follow the message notation of <xref target="RFC8446" format="default"/>.</t> | |||
We follow the message notation of <xref target="RFC8446"/>.</t> | <sourcecode name="" type="c"><![CDATA[ | |||
<figure><artwork><![CDATA[ | ||||
opaque pinning_ticket<0..2^16-1>; | opaque pinning_ticket<0..2^16-1>; | |||
opaque pinning_proof<0..2^8-1>; | opaque pinning_proof<0..2^8-1>; | |||
struct { | struct { | |||
select (Role) { | select (Role) { | |||
case client: | case client: | |||
pinning_ticket ticket<0..2^16-1>; //omitted on 1st connection | pinning_ticket ticket<0..2^16-1>; //omitted on 1st connection | |||
case server: | case server: | |||
pinning_proof proof<0..2^8-1>; //no proof on 1st connection | pinning_proof proof<0..2^8-1>; //no proof on 1st connection | |||
pinning_ticket ticket<0..2^16-1>; //omitted on ramp down | pinning_ticket ticket<0..2^16-1>; //omitted on ramp down | |||
uint32 lifetime; | uint32 lifetime; | |||
} | } | |||
} PinningTicketExtension; | } PinningTicketExtension; | |||
]]></artwork></figure> | ]]></sourcecode> | |||
<dl newline="false" spacing="normal" indent="10"> | ||||
<t><list style="hanging"> | <dt>ticket</dt> | |||
<t hangText='ticket'> | <dd> | |||
a pinning ticket sent by the client or returned by the server. The | a pinning ticket sent by the client or returned by the server. The | |||
ticket is opaque to the client. The extension MUST contain exactly 0 or | ticket is opaque to the client. The extension <bcp14>MUST</bcp14> contain exactl | |||
1 tickets.</t> | y 0 or | |||
<t hangText='proof'> | 1 tickets.</dd> | |||
<dt>proof</dt> | ||||
<dd> | ||||
a demonstration by the server that it understands the received ticket | a demonstration by the server that it understands the received ticket | |||
and therefore that it is in possession of the secret that was used to | and therefore that it is in possession of the secret that was used to | |||
generate it originally. The extension MUST contain exactly 0 or 1 | generate it originally. The extension <bcp14>MUST</bcp14> contain exactly 0 or | |||
proofs.</t> | 1 | |||
<t hangText='lifetime'> | proofs.</dd> | |||
<dt>lifetime</dt> | ||||
<dd> | ||||
the duration (in seconds) that the server commits to accept offered | the duration (in seconds) that the server commits to accept offered | |||
tickets in the future.</t> | tickets in the future.</dd> | |||
</list></t> | </dl> | |||
</section> | ||||
</section> | <section anchor="crypto" numbered="true" toc="default"> | |||
<section anchor="crypto" title="Cryptographic Operations"> | <name>Cryptographic Operations</name> | |||
<t>This section provides details on the cryptographic operations performed | ||||
<t>This section provides details on the cryptographic operations performed | ||||
by the protocol peers.</t> | by the protocol peers.</t> | |||
<section anchor="pinning-secret" numbered="true" toc="default"> | ||||
<section anchor="pinning-secret" title="Pinning Secret"> | <name>Pinning Secret</name> | |||
<t>The pinning secret is generated locally by the client and the server, | ||||
<t>The pinning secret is generated locally by the client and the server | ||||
which means they must use the same inputs to generate it. This value | which means they must use the same inputs to generate it. This value | |||
must be generated before the ServerHello message is sent, as the server | must be generated before the ServerHello message is sent, as the server | |||
includes the corresponding pinning ticket in the same flight as the | includes the corresponding pinning ticket in the same flight as the | |||
ServerHello message. In addition, the pinning secret must be | ServerHello message. In addition, the pinning secret must be | |||
unpredictable to any party other than the client and the server.</t> | unpredictable to any party other than the client and the server.</t> | |||
<t>The pinning secret is derived using the Derive-Secret function provid | ||||
<t>The pinning secret is derived using the Derive-Secret function provided | ed | |||
by TLS 1.3, described in Section “Key Schedule” of <xref target="RFC8446"/>.</t> | by TLS 1.3, described in <xref target="RFC8446" sectionFormat="of" section="7.1" | |||
format="default"/>.</t> | ||||
<figure><artwork><![CDATA[ | <sourcecode name="" type="c"><![CDATA[ | |||
pinning secret = Derive-Secret(Handshake Secret, "pinning secret", | pinning secret = Derive-Secret(Handshake Secret, "pinning secret", | |||
ClientHello...ServerHello) | ClientHello...ServerHello) | |||
]]></artwork></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | <section anchor="pinning-ticket" numbered="true" toc="default"> | |||
<section anchor="pinning-ticket" title="Pinning Ticket"> | <name>Pinning Ticket</name> | |||
<t>The pinning ticket contains the pinning secret. The pinning ticket is | ||||
<t>The pinning ticket contains the pinning secret. The pinning ticket is | provided by the client to the server, which decrypts it in order to | |||
provided by the client to the server which decrypts it in order to | ||||
extract the pinning secret and responds with a pinning proof. As a | extract the pinning secret and responds with a pinning proof. As a | |||
result, the characteristics of the pinning ticket are:</t> | result, the characteristics of the pinning ticket are:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>Pinning tickets <bcp14>MUST</bcp14> be encrypted and integrity-pro | |||
<t>Pinning tickets MUST be encrypted and integrity-protected using strong | tected using strong | |||
cryptographic algorithms.</t> | cryptographic algorithms.</li> | |||
<t>Pinning tickets MUST be protected with a long-term pinning protection | <li>Pinning tickets <bcp14>MUST</bcp14> be protected with a long-term | |||
key.</t> | pinning protection | |||
<t>Pinning tickets MUST include a pinning protection key ID or serial | key.</li> | |||
number as to enable the pinning protection key to be refreshed.</t> | <li>Pinning tickets <bcp14>MUST</bcp14> include a pinning protection k | |||
<t>The pinning ticket MAY include other information, in addition to the | ey ID or serial | |||
number as to enable the pinning protection key to be refreshed.</li> | ||||
<li>The pinning ticket <bcp14>MAY</bcp14> include other information, i | ||||
n addition to the | ||||
pinning secret. When additional information is included, a careful | pinning secret. When additional information is included, a careful | |||
review needs to be performed to evaluate its impact on privacy.</t> | review needs to be performed to evaluate its impact on privacy.</li> | |||
</list></t> | </ul> | |||
<t>The pinning ticket’s format is not specified by this document, but we | ||||
RECOMMEND a format similar to the one proposed by <xref target="RFC5077"/>.</t> | ||||
</section> | ||||
<section anchor="pinning-ticket-key" title="Pinning Protection Key"> | ||||
<t>The pinning protection key is only used by the server and so remains | <t>The pinning ticket's format is not specified by this document, but | |||
server implementation specific. <xref target="RFC5077"/> recommends the use of t | a format similar to the one proposed by <xref target="RFC5077" format="default"/ | |||
wo | > | |||
keys, but when using AEAD algorithms only a single key is required.</t> | is <bcp14>RECOMMENDED</bcp14>.</t> | |||
</section> | ||||
<section anchor="pinning-ticket-key" numbered="true" toc="default"> | ||||
<name>Pinning Protection Key</name> | ||||
<t>The pinning protection key is used only by the server and so remains | ||||
server implementation specific. <xref target="RFC5077" format="default"/> recomm | ||||
ends the use of two | ||||
keys, but when using Authenticated Encryption with Associated Data (AEAD) algori | ||||
thms, | ||||
only a single key is required.</t> | ||||
<t>When a single server terminates TLS for multiple virtual servers using | <t>When a single server terminates TLS for multiple virtual servers usin | |||
the Server Name Indication (SNI) mechanism, we strongly RECOMMEND to use | g | |||
the SNI mechanism, it is strongly <bcp14>RECOMMENDED</bcp14> that the server use | ||||
a separate protection key for each one of them, in order to allow | a separate protection key for each one of them, in order to allow | |||
migrating virtual servers between different servers while keeping | migrating virtual servers between different servers while keeping | |||
pinning active.</t> | pinning active.</t> | |||
<t>As noted in <xref target="cluster" format="default"/>, if the server | ||||
<t>As noted in <xref target="cluster"/>, if the server is actually a cluster of | is actually a cluster of | |||
machines, the protection key MUST be synchronized between all the nodes | machines, the protection key <bcp14>MUST</bcp14> be synchronized between all the | |||
that accept TLS connections to the same server name. When <xref target="RFC5077 | nodes | |||
"/> | that accept TLS connections to the same server name. When <xref target="RFC5077 | |||
" format="default"/> | ||||
is deployed, an easy way to do it is to derive the protection key from | is deployed, an easy way to do it is to derive the protection key from | |||
the session-ticket protection key, which is already synchronized. For | the session-ticket protection key, which is already synchronized. For | |||
example:</t> | example:</t> | |||
<sourcecode name="" type="c"><![CDATA[ | ||||
<figure><artwork><![CDATA[ | ||||
pinning_protection_key = HKDF-Expand(resumption_protection_key, | pinning_protection_key = HKDF-Expand(resumption_protection_key, | |||
"pinning protection", L) | "pinning protection", L) | |||
]]></artwork></figure> | ]]></sourcecode> | |||
<t>Where resumption_protection_key is the ticket protection key defined | ||||
<t>Where resumption_protection_key is the ticket protection key defined in | in | |||
<xref target="RFC5077"/>. Both resumption_protection_key and pinning_protection_ | <xref target="RFC5077" format="default"/>. Both resumption_protection_key and pi | |||
key | nning_protection_key | |||
are only used by the server.</t> | are only used by the server.</t> | |||
<t>The above solution attempts to minimize code changes related to management of the resumption_protection_key. | <t>The above solution attempts to minimize code changes related to manag ement of the resumption_protection_key. | |||
The drawback is that this key would be used both to directly encrypt session tic kets and to derive | The drawback is that this key would be used both to directly encrypt session tic kets and to derive | |||
the pinning_protection_key, and such mixed usage of a single key is not in line with cryptographic best practices. | the pinning_protection_key, and such mixed usage of a single key is not in line with cryptographic best practices. | |||
Where possible, we RECOMMEND to have the resumption_protection_key and pinning_p | Where possible, it is <bcp14>RECOMMENDED</bcp14> that the resumption_protection_ | |||
rotection_key as two, | key | |||
unrelated keys that are separately shared among the relevant servers.</t> | be unrelated to the pinning_protection_key and that they are separately | |||
shared among the relevant servers.</t> | ||||
</section> | </section> | |||
<section anchor="pinning-proof" title="Pinning Proof"> | <section anchor="pinning-proof" numbered="true" toc="default"> | |||
<name>Pinning Proof</name> | ||||
<t>The pinning proof is sent by the server to demonstrate that it has been | <t>The pinning proof is sent by the server to demonstrate that it has be | |||
able to decrypt the pinning ticket and retrieve the pinning secret. The | en | |||
able to decrypt the pinning ticket and to retrieve the pinning secret. The | ||||
proof must be unpredictable and must not be replayed. Similarly to the | proof must be unpredictable and must not be replayed. Similarly to the | |||
pinning ticket, the pinning proof is sent by the server in the | pinning ticket, the pinning proof is sent by the server in the | |||
ServerHello message. In addition, it must not be possible for a MITM | ServerHello message. In addition, it must not be possible for a MITM | |||
server with a fake certificate to obtain a pinning proof from the | server with a fake certificate to obtain a pinning proof from the | |||
original server.</t> | original server.</t> | |||
<t>In order to address these requirements, the pinning proof is bound to | ||||
<t>In order to address these requirements, the pinning proof is bound to | ||||
the TLS session as well as the public key of the server:</t> | the TLS session as well as the public key of the server:</t> | |||
<sourcecode name="" type="c"><![CDATA[ | ||||
<figure><artwork><![CDATA[ | pinning_proof_secret=Derive-Secret(Handshake Secret, | |||
pinning_proof_secret=Derive-Secret(Handshake Secret, "pinning proof 1", | "pinning proof 1", ClientHello...ServerHello) | |||
ClientHello...ServerHello) | ||||
proof = HMAC(original_pinning_secret, "pinning proof 2" + | proof = HMAC(original_pinning_secret, "pinning proof 2" + | |||
pinning_proof_secret + Hash(server_public_key)) | pinning_proof_secret + Hash(server_public_key)) | |||
]]></artwork></figure> | ]]></sourcecode> | |||
<t>where HMAC <xref target="RFC2104" format="default"/> uses the Hash al | ||||
<t>where HMAC <xref target="RFC2104"/> uses the Hash algorithm that was negotiat | gorithm that was negotiated in | |||
ed in | the handshake, and the same hash is also used over the server's public | |||
the handshake, and the same hash is also used over the server’s public | ||||
key. The original_pinning_secret value refers to the secret value | key. The original_pinning_secret value refers to the secret value | |||
extracted from the ticket sent by the client, to distinguish it from a | extracted from the ticket sent by the client, to distinguish it from a | |||
new pinning secret value that is possibly computed in the current | new pinning secret value that is possibly computed in the current | |||
exchange. The server_public_key value is the DER representation of | exchange. The server_public_key value is the DER representation of | |||
the public key, specifically the SubjectPublicKeyInfo structure as-is.</t> | the public key, specifically the SubjectPublicKeyInfo structure as-is.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="operational-considerations" numbered="true" toc="default"> | |||
<section anchor="operational-considerations" title="Operational Considerations"> | <name>Operational Considerations</name> | |||
<t>The main motivation behind the current protocol is to enable identity | ||||
<t>The main motivation behind the current protocol is to enable identity | ||||
pinning without the need for manual operations. Manual operations are | pinning without the need for manual operations. Manual operations are | |||
susceptible to human error and in the case of public key pinning, can | susceptible to human error, and in the case of public key pinning, can | |||
easily result in “server bricking”: the server becoming inaccessible to | easily result in "server bricking": the server becoming inaccessible to | |||
some or all of its users. To achieve this goal operations described in | some or all of its users. To achieve this goal, operations described in | |||
identity pinning are only performed within the current TLS session, and | identity pinning are only performed within the current TLS session, and | |||
there is no dependence on any TLS configuration parameters such as CA | there is no dependence on any TLS configuration parameters such as CA | |||
identity or public keys. As a result, configuration changes are | identity or public keys. As a result, configuration changes are | |||
unlikely to lead to desynchronized state between the client and the | unlikely to lead to desynchronized state between the client and the | |||
server.</t> | server.</t> | |||
<section anchor="cluster" numbered="true" toc="default"> | ||||
<section anchor="cluster" title="Protection Key Synchronization"> | <name>Protection Key Synchronization</name> | |||
<t>The only operational requirement when deploying this protocol is that | ||||
<t>The only operational requirement when deploying this protocol is that if | , if | |||
the server is part of a cluster, protection keys (the keys used to | the server is part of a cluster, protection keys (the keys used to | |||
encrypt tickets) MUST be synchronized between all cluster members. The | encrypt tickets) <bcp14>MUST</bcp14> be synchronized between all cluster members . The | |||
protocol is designed so that if resumption ticket protection keys | protocol is designed so that if resumption ticket protection keys | |||
<xref target="RFC5077"/> are already synchronized between cluster members, nothi ng | <xref target="RFC5077" format="default"/> are already synchronized between clust er members, nothing | |||
more needs to be done.</t> | more needs to be done.</t> | |||
<t>Moreover, synchronization does not need to be instantaneous, e.g., | ||||
<t>Moreover, synchronization does not need to be instantaneous, e.g. | ||||
protection keys can be distributed a few minutes or hours in advance of | protection keys can be distributed a few minutes or hours in advance of | |||
their rollover. In such scenarios, each cluster member MUST be able to | their rollover. In such scenarios, each cluster member <bcp14>MUST</bcp14> be ab le to | |||
accept tickets protected with a new version of the protection key, even | accept tickets protected with a new version of the protection key, even | |||
while it is still using an old version to generate keys. This ensures | while it is still using an old version to generate keys. This ensures | |||
that a client that receives a “new” ticket does not next hit a cluster | that, when a client receives a "new" ticket, it does not next hit a cluster | |||
member that still rejects this ticket.</t> | member that still rejects this ticket.</t> | |||
<t>Misconfiguration can lead to the server's clock being off by a large | ||||
<t>Misconfiguration can lead to the server’s clock being off by a large | amount of time. Consider a case where a server's clock is misconfigured, | |||
amount of time. Consider a case where a server’s clock is misconfigured, | ||||
for example, to be 1 year in | for example, to be 1 year in | |||
the future, and the system is allowed to delete expired keys automatically. | the future, and the system is allowed to delete expired keys automatically. | |||
The server will then delete many outstanding keys because they are now | The server will then delete many outstanding keys because they are now | |||
long expired and will end up rejecting valid tickets that are stored | long expired and will end up rejecting valid tickets that are stored | |||
by clients. Such a scenario could make the server | by clients. Such a scenario could make the server | |||
inaccessible to a large number of clients.</t> | inaccessible to a large number of clients.</t> | |||
<t>The decision to delete a key should at least consider | ||||
<t>The decision to delete a key should at least consider | ||||
the largest value of the ticket lifetime as well as the expected time | the largest value of the ticket lifetime as well as the expected time | |||
desynchronisation between the servers of the cluster and the time | desynchronization between the servers of the cluster and the time | |||
difference for distributing the new key among the different servers in | difference for distributing the new key among the different servers in | |||
the cluster.</t> | the cluster.</t> | |||
</section> | ||||
</section> | <section anchor="ticket-lifetime" numbered="true" toc="default"> | |||
<section anchor="ticket-lifetime" title="Ticket Lifetime"> | <name>Ticket Lifetime</name> | |||
<t>The lifetime of the ticket is a commitment by the server to retain th | ||||
<t>The lifetime of the ticket is a commitment by the server to retain the | e | |||
ticket’s corresponding protection key for this duration, so that the | ticket's corresponding protection key for this duration, so that the | |||
server can prove to the client that it knows the secret embedded in the | server can prove to the client that it knows the secret embedded in the | |||
ticket. For production systems, the lifetime SHOULD be between 7 and 31 | ticket. For production systems, the lifetime <bcp14>SHOULD</bcp14> be between 7 and 31 | |||
days.</t> | days.</t> | |||
</section> | ||||
</section> | <section anchor="certificate-renewal" numbered="true" toc="default"> | |||
<section anchor="certificate-renewal" title="Certificate Renewal"> | <name>Certificate Renewal</name> | |||
<t>The protocol ensures that the client will continue speaking to the | ||||
<t>The protocol ensures that the client will continue speaking to the | correct server even when the server's certificate is renewed. In this | |||
correct server even when the server’s certificate is renewed. In this | sense, pinning is not associated with certificates, which is the reason we | |||
sense, pinning is not associated with certificates which is the reason we | designate the protocol described in this document as "server identity | |||
designate the protocol described in this document as “server identity | pinning".</t> | |||
pinning”.</t> | <t>Note that this property is not impacted by the use of the server's | |||
public key in the pinning proof because the scope of the public key | ||||
<t>Note that this property is not impacted by the use of the server’s | ||||
public key in the pinning proof, because the scope of the public key | ||||
used is only the current TLS session.</t> | used is only the current TLS session.</t> | |||
</section> | ||||
</section> | <section anchor="certificate-revocation" numbered="true" toc="default"> | |||
<section anchor="certificate-revocation" title="Certificate Revocation"> | <name>Certificate Revocation</name> | |||
<t>The protocol is orthogonal to certificate validation in the sense tha | ||||
<t>The protocol is orthogonal to certificate validation in the sense that, | t, | |||
if the server’s certificate has been revoked or is invalid for some | if the server's certificate has been revoked or is invalid for some | |||
other reason, the client MUST refuse to connect to it regardless of any | other reason, the client <bcp14>MUST</bcp14> refuse to connect to it regardless | |||
of any | ||||
ticket-related behavior.</t> | ticket-related behavior.</t> | |||
</section> | ||||
</section> | <section anchor="ramp_down" numbered="true" toc="default"> | |||
<section anchor="ramp_down" title="Disabling Pinning"> | <name>Disabling Pinning</name> | |||
<t>A server implementing this protocol <bcp14>MUST</bcp14> have a "ramp | ||||
<t>A server implementing this protocol MUST have a “ramp down” mode of | down" mode of | |||
operation where:</t> | operation where:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>The server continues to accept valid pinning tickets and responds | |||
<t>The server continues to accept valid pinning tickets and responds | correctly with a proof.</li> | |||
correctly with a proof.</t> | <li>The server does not send back a new pinning ticket.</li> | |||
<t>The server does not send back a new pinning ticket.</t> | </ul> | |||
</list></t> | <t>After a while, no clients will hold valid tickets, and the | |||
<t>After a while no clients will hold valid tickets any more and the | ||||
feature may be disabled. Note that clients that do not receive a new | feature may be disabled. Note that clients that do not receive a new | |||
pinning ticket do not necessarily need to remove the original ticket. | pinning ticket do not necessarily need to remove the original ticket. | |||
Instead, the client may keep on using the ticket until its lifetime | Instead, the client may keep using the ticket until its lifetime | |||
expires. However, as detailed in section <xref target="privacy"/>, re-use of a | expires. However, as detailed in <xref target="privacy" format="default"/>, re-u | |||
se of a | ||||
ticket by the client may result in privacy concerns as the ticket value | ticket by the client may result in privacy concerns as the ticket value | |||
may be used to correlate TLS sessions.</t> | may be used to correlate TLS sessions.</t> | |||
<t>Issuing a new pinning ticket with a shorter lifetime would only delay | ||||
<t>Issuing a new pinning ticket with a shorter lifetime would only delay | ||||
the ramp down process, as the shorter lifetime can only affect clients | the ramp down process, as the shorter lifetime can only affect clients | |||
that actually initiated a new connection. Other clients would still see | that actually initiated a new connection. Other clients would still see | |||
the original lifetime for their pinning tickets.</t> | the original lifetime for their pinning tickets.</t> | |||
</section> | ||||
</section> | <section anchor="server-compromise" numbered="true" toc="default"> | |||
<section anchor="server-compromise" title="Server Compromise"> | <name>Server Compromise</name> | |||
<t>If a server compromise is detected, the pinning protection key <bcp14 | ||||
<t>If a server compromise is detected, the pinning protection key MUST be | >MUST</bcp14> be | |||
rotated immediately, but the server MUST still accept valid tickets that | rotated immediately, but the server <bcp14>MUST</bcp14> still accept valid ticke | |||
ts that | ||||
use the old, compromised key. Clients that still hold old pinning | use the old, compromised key. Clients that still hold old pinning | |||
tickets will remain vulnerable to MITM attacks, but those that connect | tickets will remain vulnerable to MITM attacks, but those that connect | |||
to the correct server will immediately receive new tickets protected | to the correct server will immediately receive new tickets protected | |||
with the newly generated pinning protection key.</t> | with the newly generated pinning protection key.</t> | |||
<t>The same procedure applies if the pinning protection key is compromis | ||||
<t>The same procedure applies if the pinning protection key is compromised | ed | |||
directly, e.g. if a backup copy is inadvertently made public.</t> | directly, e.g., if a backup copy is inadvertently made public.</t> | |||
</section> | ||||
</section> | <section anchor="disaster-recovery" numbered="true" toc="default"> | |||
<section anchor="disaster-recovery" title="Disaster Recovery"> | <name>Disaster Recovery</name> | |||
<t>All web servers in production need to be backed up, so that they can | ||||
<t>All web servers in production need to be backed up, so that they can be | be | |||
recovered if a disaster (including a malicious activity) ever wipes them | recovered if a disaster (including a malicious activity) ever wipes them | |||
out. Backup often includes the certificate and its private key, which | out. Backup often includes the certificate and its private key, which | |||
must be backed up securely. The pinning secret, including earlier | must be backed up securely. The pinning secret, including earlier | |||
versions that are still being accepted, must be backed up regularly. | versions that are still being accepted, must be backed up regularly. | |||
However since it is only used as an authentication second factor, it | However since it is only used as an authentication second factor, it | |||
does not require the same level of confidentiality as the server’s | does not require the same level of confidentiality as the server's | |||
private key.</t> | private key.</t> | |||
<t>Readers should note that <xref target="RFC5077" format="default"/> se | ||||
<t>Readers should note that <xref target="RFC5077"/> session resumption keys are | ssion resumption keys are more | |||
more | security sensitive and should normally not be backed up, but rather | |||
security sensitive, and should normally not be backed up but rather | ||||
treated as ephemeral keys. Even when servers derive pinning secrets from | treated as ephemeral keys. Even when servers derive pinning secrets from | |||
resumption keys (<xref target="pinning-secret"/>), they MUST NOT back up resumpt ion | resumption keys (<xref target="pinning-secret" format="default"/>), they <bcp14> MUST NOT</bcp14> back up resumption | |||
keys.</t> | keys.</t> | |||
</section> | ||||
</section> | ||||
</section> | <section anchor="security-considerations" numbered="true" toc="default"> | |||
</section> | <name>Security Considerations</name> | |||
<section anchor="implementation-status" title="Implementation Status"> | <t>This section reviews several security aspects related to the proposed | |||
<t>Note to RFC Editor: please remove this section before publication, | ||||
including the reference to <xref target="RFC7942"/>.</t> | ||||
<t>This section records the status of known implementations of the protocol | ||||
defined by this specification at the time of posting of this | ||||
Internet-Draft, and is based on a proposal described in <xref target="RFC7942">< | ||||
/xref>. The | ||||
description of implementations in this section is intended to assist the | ||||
IETF in its decision processes in progressing drafts to RFCs. Please | ||||
note that the listing of any individual implementation here does not | ||||
imply endorsement by the IETF. Furthermore, no effort has been spent to | ||||
verify the information presented here that was supplied by IETF | ||||
contributors. This is not intended as, and must not be construed to be, | ||||
a catalog of available implementations or their features. Readers are | ||||
advised to note that other implementations may exist.</t> | ||||
<t>According to RFC 7942, “this will allow reviewers and working groups to | ||||
assign due consideration to documents that have the benefit of running | ||||
code, which may serve as evidence of valuable experimentation and | ||||
feedback that have made the implemented protocols more mature. It is up | ||||
to the individual working groups to use this information as they see | ||||
fit”.</t> | ||||
<section anchor="mint-fork" title="Mint Fork"> | ||||
<section anchor="overview" title="Overview"> | ||||
<t>A fork of the Mint TLS 1.3 implementation, developed by Yaron Sheffer | ||||
and available at https://github.com/yaronf/mint.</t> | ||||
</section> | ||||
<section anchor="description" title="Description"> | ||||
<t>This is a fork of the TLS 1.3 implementation, and includes client and | ||||
server code. In addition to the actual protocol, several utilities are | ||||
provided allowing to manage pinning protection keys on the server side, | ||||
and pinning tickets on the client side.</t> | ||||
</section> | ||||
<section anchor="level-of-maturity" title="Level of Maturity"> | ||||
<t>This is a prototype.</t> | ||||
</section> | ||||
<section anchor="coverage" title="Coverage"> | ||||
<t>The entire protocol is implemented.</t> | ||||
</section> | ||||
<section anchor="version-compatibility" title="Version Compatibility"> | ||||
<t>The implementation is compatible with draft-sheffer-tls-pinning-ticket-02.</t | ||||
> | ||||
</section> | ||||
<section anchor="licensing" title="Licensing"> | ||||
<t>Mint itself and this fork are available under an MIT license.</t> | ||||
</section> | ||||
<section anchor="contact-information" title="Contact Information"> | ||||
<t>See author details below.</t> | ||||
</section> | ||||
</section> | ||||
</section> | ||||
<section anchor="security-considerations" title="Security Considerations"> | ||||
<t>This section reviews several security aspects related to the proposed | ||||
extension.</t> | extension.</t> | |||
<section anchor="trust-on-first-use-tofu-and-mitm-attacks" numbered="true" | ||||
<section anchor="trust-on-first-use-tofu-and-mitm-attacks" title="Trust on First | toc="default"> | |||
Use (TOFU) and MITM Attacks"> | <name>Trust-on-First-Use (TOFU) and MITM Attacks</name> | |||
<t>This protocol is a trust-on-first-use protocol. If a client initially | ||||
<t>This protocol is a “trust on first use” protocol. If a client initially | connects to the "right" server, it will be protected against MITM | |||
connects to the “right” server, it will be protected against MITM | ||||
attackers for the lifetime of each received ticket. If it connects | attackers for the lifetime of each received ticket. If it connects | |||
regularly (depending of course on the server-selected lifetime), it will | regularly (depending, of course, on the server-selected lifetime), it will | |||
stay constantly protected against fake certificates.</t> | stay constantly protected against fake certificates.</t> | |||
<t>However if it initially connects to an attacker, subsequent connectio | ||||
<t>However if it initially connects to an attacker, subsequent connections | ns | |||
to the “right” server will fail. Server operators might want to advise | to the "right" server will fail. Server operators might want to advise | |||
clients on how to remove corrupted pins, once such large scale attacks | clients on how to remove corrupted pins, once such large-scale attacks | |||
are detected and remediated.</t> | are detected and remediated.</t> | |||
<t>The protocol is designed so that it is not vulnerable to an active MI | ||||
<t>The protocol is designed so that it is not vulnerable to an active MITM | TM | |||
attacker who has real-time access to the original server. The pinning | attacker who has real-time access to the original server. The pinning | |||
proof includes a hash of the server’s public key, to ensure the client | proof includes a hash of the server's public key to ensure the client | |||
that the proof was in fact generated by the server with which it is | that the proof was in fact generated by the server with which it is | |||
initiating the connection.</t> | initiating the connection.</t> | |||
</section> | ||||
</section> | <section anchor="pervasive-monitoring" numbered="true" toc="default"> | |||
<section anchor="pervasive-monitoring" title="Pervasive Monitoring"> | <name>Pervasive Monitoring</name> | |||
<t>Some organizations, and even some countries, perform pervasive monito | ||||
<t>Some organizations, and even some countries perform pervasive monitoring | ring | |||
on their constituents <xref target="RFC7258"/>. This often takes the form of | on their constituents <xref target="RFC7258" format="default"/>. This often take | |||
s the form of | ||||
always-active SSL proxies. Because of the TOFU property, this protocol | always-active SSL proxies. Because of the TOFU property, this protocol | |||
does not provide any security in such cases.</t> | does not provide any security in such cases.</t> | |||
<t>Pervasive monitoring may also result in privacy concerns detailed in | ||||
<t>Pervasive monitoring may also result in privacy concerns detailed in | <xref target="privacy" format="default"/>.</t> | |||
section <xref target="privacy"/>.</t> | </section> | |||
<section anchor="server_error" numbered="true" toc="default"> | ||||
</section> | <name>Server-Side Error Detection</name> | |||
<section anchor="server_error" title="Server-Side Error Detection"> | <t>Uniquely, this protocol allows the server to detect clients that pres | |||
ent | ||||
<t>Uniquely, this protocol allows the server to detect clients that present | ||||
incorrect tickets and therefore can be assumed to be victims of a MITM | incorrect tickets and therefore can be assumed to be victims of a MITM | |||
attack. Server operators can use such cases as indications of ongoing | attack. Server operators can use such cases as indications of ongoing | |||
attacks, similarly to fake certificate attacks that took place in a few | attacks, similarly to fake certificate attacks that took place in a few | |||
countries in the past.</t> | countries in the past.</t> | |||
</section> | ||||
</section> | <section anchor="client_policy" numbered="true" toc="default"> | |||
<section anchor="client_policy" title="Client Policy and SSL Proxies"> | <name>Client Policy and SSL Proxies</name> | |||
<t>Like it or not, some clients are normally deployed behind an SSL prox | ||||
<t>Like it or not, some clients are normally deployed behind an SSL proxy. | y. | |||
Similarly to <xref target="RFC7469"/>, it is acceptable to allow pinning to be | Similar to <xref target="RFC7469" format="default"/>, it is acceptable to allow | |||
pinning to be | ||||
disabled for some hosts according to local policy. For example, | disabled for some hosts according to local policy. For example, | |||
a User Agent (UA) MAY | a User Agent (UA) <bcp14>MAY</bcp14> | |||
disable pinning for hosts whose validated certificate chain terminates | disable pinning for hosts whose validated certificate chain terminates | |||
at a user-defined trust anchor, rather than a trust anchor built-in to | at a user-defined trust anchor, rather than a trust anchor built into | |||
the UA (or underlying platform). Moreover, a client MAY accept an empty | the UA (or underlying platform). Moreover, a client <bcp14>MAY</bcp14> accept an | |||
empty | ||||
PinningTicket extension from such hosts as a valid response.</t> | PinningTicket extension from such hosts as a valid response.</t> | |||
</section> | ||||
<section anchor="client_error" numbered="true" toc="default"> | ||||
<name>Client-Side Error Behavior</name> | ||||
</section> | <t>When a client receives a malformed or empty PinningTicket extension f | |||
<section anchor="client_error" title="Client-Side Error Behavior"> | rom | |||
a pinned server, it <bcp14>MUST</bcp14> abort the handshake. If the client | ||||
<t>When a client receives a malformed or empty PinningTicket extension from | retries the request, it <bcp14>MUST NOT</bcp14> omit the | |||
a pinned server, it MUST abort the handshake and MUST NOT retry with no | PinningTicket in the retry message. Doing otherwise would expose the client to | |||
PinningTicket in the request. Doing otherwise would expose the client to | trivial fallback attacks, similar to those described in <xref target="RFC7507" f | |||
trivial fallback attacks, similar to those described in <xref target="RFC7507"/> | ormat="default"/>.</t> | |||
.</t> | <t>However, this rule can negatively impact clients that move from | |||
behind SSL proxies into the open Internet, and vice versa, if the advice | ||||
<t>This rule can however have negative affects on clients that move from | in <xref target="client_policy" format="default"/> is not followed. Therefore, | |||
behind SSL proxies into the open Internet and vice versa, if the advice | it is <bcp14>RECOMMENDED</bcp14> that | |||
in <xref target="client_policy"/> is not followed. Therefore, we RECOMMEND that | ||||
browser and library vendors provide a documented way to remove stored | browser and library vendors provide a documented way to remove stored | |||
pins.</t> | pins.</t> | |||
</section> | ||||
</section> | <section anchor="stolen-and-forged-tickets" numbered="true" toc="default"> | |||
<section anchor="stolen-and-forged-tickets" title="Stolen and Forged Tickets"> | <name>Stolen and Forged Tickets</name> | |||
<t>An attacker gains no benefit from stealing pinning tickets, even in c | ||||
<t>Stealing pinning tickets even in conjunction with other pinning | onjunction with other pinning | |||
parameters, such as the associated pinning secret, provides no benefit | parameters such as the associated pinning secret, since pinning tickets are used | |||
to the attacker since pinning tickets are used to secure the client | to secure the client | |||
rather than the server. Similarly, it is useless to forge a ticket for | rather than the server. Similarly, it is useless to forge a ticket for | |||
a particular server.</t> | a particular server.</t> | |||
</section> | ||||
<section anchor="privacy" numbered="true" toc="default"> | ||||
<name>Client Privacy</name> | ||||
</section> | <t>This protocol is designed so that an external attacker cannot link | |||
<section anchor="privacy" title="Client Privacy"> | different requests to a single client, provided the client | |||
<t>This protocol is designed so that an external attacker cannot correlate | ||||
between different requests of a single client, provided the client | ||||
requests and receives a fresh ticket upon each connection. This may be | requests and receives a fresh ticket upon each connection. This may be | |||
of concern particularly during ramp-down, if the server does not provide | of concern particularly during ramp down, if the server does not provide | |||
any new ticket and the client re-uses the same ticket. To reduce or avoid such | a new ticket, and the client reuses the same ticket. To reduce or avoid such | |||
privacy concerns, it is RECOMMENDED for the server to issue a fresh ticket with | privacy concerns, it is <bcp14>RECOMMENDED</bcp14> for the server to issue a fre | |||
a | sh ticket with a | |||
reduced life time. This would at least reduce the time period under | reduced lifetime. This would at least reduce the time period in which | |||
which TLS session of the client are correlated. The server MAY also | the TLS sessions of the client can be linked. The server <bcp14>MAY</bcp14> also | |||
issue tickets with a zero second lifetime until it is confident all | issue tickets with a zero-second lifetime until it is confident all | |||
tickets are expired.</t> | tickets are expired.</t> | |||
<t>On the other hand, the server to which the client is connecting can | ||||
<t>On the other hand, the server to which the client is connecting can | ||||
easily track the client. This may be an issue when the client expects | easily track the client. This may be an issue when the client expects | |||
to connect to the server (e.g., a mail server) with multiple identities. | to connect to the server (e.g., a mail server) with multiple identities. | |||
Implementations SHOULD allow the user to opt out of pinning, either in | Implementations <bcp14>SHOULD</bcp14> allow the user to opt out of pinning, eith er in | |||
general or for particular servers.</t> | general or for particular servers.</t> | |||
<t>This document does not define the exact content of tickets. | ||||
<t>This document does not define the exact content of tickets. | ||||
Including client-specific information in tickets would raise privacy concerns | Including client-specific information in tickets would raise privacy concerns | |||
and is NOT RECOMMENDED.</t> | and is <bcp14>NOT RECOMMENDED</bcp14>.</t> | |||
</section> | ||||
</section> | <section anchor="ticket-protection-key-management" numbered="true" toc="de | |||
<section anchor="ticket-protection-key-management" title="Ticket Protection Key | fault"> | |||
Management"> | <name>Ticket Protection Key Management</name> | |||
<t>While the ticket format is not mandated by this document, we RECOMMEND | <t>While the ticket format is not mandated by this document, protecti | |||
using authenticated encryption to protect it. Some of the algorithms | ng | |||
commonly used for authenticated encryption, e.g. GCM, are highly | the ticket using authenticated encryption is <bcp14>RECOMMENDED</bcp14>. Some of | |||
the algorithms | ||||
commonly used for authenticated encryption, e.g., Galois/Counter Mode (GCM), are | ||||
highly | ||||
vulnerable to nonce reuse, and this problem is magnified in a cluster | vulnerable to nonce reuse, and this problem is magnified in a cluster | |||
setting. Therefore implementations that choose AES-GCM or any AEAD | setting. Therefore, implementations that choose AES-GCM or any AEAD | |||
equivalent MUST adopt | equivalent <bcp14>MUST</bcp14> adopt | |||
one of these three alternatives:</t> | one of these three alternatives:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>Partition the nonce namespace between cluster members and use mono | |||
<t>Partition the nonce namespace between cluster members and use monotonic | tonic | |||
counters on each member, e.g. by setting the nonce to the concatenation | counters on each member, e.g., by setting the nonce to the concatenation | |||
of the cluster member ID and an incremental counter.</t> | of the cluster member ID and an incremental counter.</li> | |||
<t>Generate random nonces but avoid the so-called birthday bound, i.e. | <li>Generate random nonces but avoid the so-called birthday bound, i.e | |||
., | ||||
never generate more than the maximum allowed number of encrypted | never generate more than the maximum allowed number of encrypted | |||
tickets (2**64 for AES-128-GCM) for the same ticket | tickets (2**64 for AES-128-GCM) for the same ticket | |||
pinning protection Key.</t> | pinning protection key.</li> | |||
<t>An alternative design which has been attributed to Karthik Bhargavan is | <li>An alternative design that has been attributed to Karthik Bhargava | |||
as follows. Start with a 128-bit master key “K_master” and then for | n is | |||
as follows. Start with a 128-bit master key K_master and then for | ||||
each encryption, generate a 256-bit random nonce and compute: K = | each encryption, generate a 256-bit random nonce and compute: K = | |||
HKDF(K_master, Nonce || “key”), then N = HKDF(K_master, Nonce || | HKDF(K_master, Nonce || "key"), then N = HKDF(K_master, Nonce || | |||
“nonce”). Use these values to encrypt the ticket, AES-GCM(K, N, | "nonce"). Use these values to encrypt the ticket, AES-GCM(K, N, | |||
data). This nonce should then be stored and transmitted with the | data). This nonce should then be stored and transmitted with the | |||
ticket.</t> | ticket.</li> | |||
</list></t> | </ul> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="iana-considerations" numbered="true" toc="default"> | |||
<section anchor="iana-considerations" title="IANA Considerations"> | <name>IANA Considerations</name> | |||
<t>The IANA has allocated a TicketPinning extension value in the "TLS | ||||
<t>IANA is requested to allocate a TicketPinning extension value in the TLS | ExtensionType Values" registry.</t> | |||
ExtensionType Registry.</t> | <t><xref target="RFC8447" format="default"/> defines the procedure, requir | |||
ements, and the necessary | ||||
<t><xref target="RFC8447"/> defines the procedure and requirements and the neces | information for the IANA to update the "TLS ExtensionType Values" | |||
sary | registry <xref target="TLS-EXT" format="default"/>. The registration procedure | |||
information for the IANA to update the “TLS ExtensionType Values” | is "Specification Required" <xref target="RFC8126"/>.</t> | |||
registry <xref target="TLS-EXT"/>.</t> | ||||
<t>According to <xref target="RFC8447"/> the update of the “TLS ExtensionType Va | ||||
lues” | ||||
registry is “Specification Required” <xref target="RFC8126"/> which is fulfilled | ||||
by | ||||
the current document, when it is published as an RFC.</t> | ||||
<t>The TicketPinning Extension is not limited to Private use and as such | ||||
the TicketPinning Extension Value is expected to have its first byte in | ||||
the range 0-254.</t> | ||||
<t>The TicketPinning Extension Name is expected to be ticket_pinning.</t> | ||||
<t>The TicketPinning Extension Recommended value should be set to “No” with | ||||
the publication of the current document as “Experimental”.</t> | ||||
<t>The TicketPinning Extension TLS.13 column should be set to CH, EE to | ||||
indicate that the TicketPinning Extension is present in ClientHello and | ||||
EncryptedExtensions messages.</t> | ||||
</section> | ||||
<section anchor="acknowledgements" title="Acknowledgements"> | ||||
<t>The original idea behind this proposal was published in <xref target="Oreo"/> | ||||
by | ||||
Moti Yung, Benny Pinkas and Omer Berkman. The current protocol is | ||||
but a distant relative of the original Oreo protocol, and any errors | ||||
are the responsibility of the authors of this document alone.</t> | ||||
<t>We would like to thank Adrian Farrel, Dave Garrett, | ||||
Daniel Kahn Gillmor, | ||||
Alexey Melnikov, | ||||
Yoav Nir, | ||||
Eric Rescorla, Benjamin Kaduk and Rich Salz for their comments on this document. | ||||
Special thanks to Craig Francis for contributing the HPKP deployment | ||||
script, and to Ralph Holz for several fruitful discussions.</t> | ||||
</section> | ||||
<t>The TicketPinning extension is registered as follows. (The extension is | ||||
not | ||||
limited to Private Use, and as such has its first byte in the range | ||||
0-254.)</t> | ||||
<dl> | ||||
<dt>Value:</dt><dd>32</dd> | ||||
<dt>Name:</dt><dd>ticket_pinning</dd> | ||||
<dt>Recommended:</dt><dd>No</dd> | ||||
<dt>TLS 1.3:</dt><dd>CH, EE (to indicate that the extension is present | ||||
in ClientHello and EncryptedExtensions messages)</dd> | ||||
</dl> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="I-D.perrin-tls-tack" to="TLS-TACK"/> | ||||
<references> | ||||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2119.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8126.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8446.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8447.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8174.xml"/> | ||||
</references> | ||||
<references> | ||||
<references title='Normative References'> | <name>Informative References</name> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
<reference anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'> | ence.RFC.2104.xml"/> | |||
<front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
<title>Key words for use in RFCs to Indicate Requirement Levels</title> | ence.RFC.5077.xml"/> | |||
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></ | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
author> | ence.RFC.5246.xml"/> | |||
<date year='1997' month='March' /> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
<abstract><t>In many standards track documents several words are used to signify | ence.RFC.6454.xml"/> | |||
the requirements in the specification. These words are often capitalized. This | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
document defines these words as they should be interpreted in IETF documents. | ence.RFC.6962.xml"/> | |||
This document specifies an Internet Best Current Practices for the Internet Comm | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
unity, and requests discussion and suggestions for improvements.</t></abstract> | ence.RFC.7258.xml"/> | |||
</front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
<seriesInfo name='BCP' value='14'/> | ence.RFC.7469.xml"/> | |||
<seriesInfo name='RFC' value='2119'/> | <xi:include | |||
<seriesInfo name='DOI' value='10.17487/RFC2119'/> | href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC. | |||
</reference> | 7507.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
<reference anchor="RFC8126" target='https://www.rfc-editor.org/info/rfc8126'> | ence.RFC.8555.xml"/> | |||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs</title> | ||||
<author initials='M.' surname='Cotton' fullname='M. Cotton'><organization /></au | ||||
thor> | ||||
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></auth | ||||
or> | ||||
<author initials='T.' surname='Narten' fullname='T. Narten'><organization /></au | ||||
thor> | ||||
<date year='2017' month='June' /> | ||||
<abstract><t>Many protocols make use of points of extensibility that use constan | ||||
ts to identify various protocol parameters. To ensure that the values in these | ||||
fields do not have conflicting uses and to promote interoperability, their alloc | ||||
ations are often coordinated by a central record keeper. For IETF protocols, th | ||||
at role is filled by the Internet Assigned Numbers Authority (IANA).</t><t>To ma | ||||
ke assignments in a given registry prudently, guidance describing the conditions | ||||
under which new values should be assigned, as well as when and how modification | ||||
s to existing values can be made, is needed. This document defines a framework | ||||
for the documentation of these guidelines by specification authors, in order to | ||||
assure that the provided guidance for the IANA Considerations is clear and addre | ||||
sses the various issues that are likely in the operation of a registry.</t><t>Th | ||||
is is the third edition of this document; it obsoletes RFC 5226.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='26'/> | ||||
<seriesInfo name='RFC' value='8126'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8126'/> | ||||
</reference> | ||||
<reference anchor="RFC8446" target='https://www.rfc-editor.org/info/rfc8446'> | ||||
<front> | ||||
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title> | ||||
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /> | ||||
</author> | ||||
<date year='2018' month='August' /> | ||||
<abstract><t>This document specifies version 1.3 of the Transport Layer Security | ||||
(TLS) protocol. TLS allows client/server applications to communicate over the | ||||
Internet in a way that is designed to prevent eavesdropping, tampering, and mess | ||||
age forgery.</t><t>This document updates RFCs 5705 and 6066, and obsoletes RFCs | ||||
5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 | ||||
implementations.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8446'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8446'/> | ||||
</reference> | ||||
<reference anchor="RFC8447" target='https://www.rfc-editor.org/info/rfc8447'> | ||||
<front> | ||||
<title>IANA Registry Updates for TLS and DTLS</title> | ||||
<author initials='J.' surname='Salowey' fullname='J. Salowey'><organization /></ | ||||
author> | ||||
<author initials='S.' surname='Turner' fullname='S. Turner'><organization /></au | ||||
thor> | ||||
<date year='2018' month='August' /> | ||||
<abstract><t>This document describes a number of changes to TLS and DTLS IANA re | ||||
gistries that range from adding notes to the registry all the way to changing th | ||||
e registration policy. These changes were mostly motivated by WG review of the | ||||
TLS- and DTLS-related registries undertaken as part of the TLS 1.3 development p | ||||
rocess.</t><t>This document updates the following RFCs: 3749, 5077, 4680, 5246, | ||||
5705, 5878, 6520, and 7301.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8447'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8447'/> | ||||
</reference> | ||||
<reference anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'> | ||||
<front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | ||||
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></auth | ||||
or> | ||||
<date year='2017' month='May' /> | ||||
<abstract><t>RFC 2119 specifies common key words that may be used in protocol s | ||||
pecifications. This document aims to reduce the ambiguity by clarifying that on | ||||
ly UPPERCASE usage of the key words have the defined special meanings.</t></abs | ||||
tract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='14'/> | ||||
<seriesInfo name='RFC' value='8174'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8174'/> | ||||
</reference> | ||||
</references> | ||||
<references title='Informative References'> | ||||
<reference anchor="RFC2104" target='https://www.rfc-editor.org/info/rfc2104'> | ||||
<front> | ||||
<title>HMAC: Keyed-Hashing for Message Authentication</title> | ||||
<author initials='H.' surname='Krawczyk' fullname='H. Krawczyk'><organization /> | ||||
</author> | ||||
<author initials='M.' surname='Bellare' fullname='M. Bellare'><organization /></ | ||||
author> | ||||
<author initials='R.' surname='Canetti' fullname='R. Canetti'><organization /></ | ||||
author> | ||||
<date year='1997' month='February' /> | ||||
<abstract><t>This document describes HMAC, a mechanism for message authenticatio | ||||
n using cryptographic hash functions. HMAC can be used with any iterative crypto | ||||
graphic hash function, e.g., MD5, SHA-1, in combination with a secret shared key | ||||
. The cryptographic strength of HMAC depends on the properties of the underlyin | ||||
g hash function. This memo provides information for the Internet community. Th | ||||
is memo does not specify an Internet standard of any kind</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='2104'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC2104'/> | ||||
</reference> | ||||
<reference anchor="RFC5077" target='https://www.rfc-editor.org/info/rfc5077'> | ||||
<front> | ||||
<title>Transport Layer Security (TLS) Session Resumption without Server-Side Sta | ||||
te</title> | ||||
<author initials='J.' surname='Salowey' fullname='J. Salowey'><organization /></ | ||||
author> | ||||
<author initials='H.' surname='Zhou' fullname='H. Zhou'><organization /></author | ||||
> | ||||
<author initials='P.' surname='Eronen' fullname='P. Eronen'><organization /></au | ||||
thor> | ||||
<author initials='H.' surname='Tschofenig' fullname='H. Tschofenig'><organizatio | ||||
n /></author> | ||||
<date year='2008' month='January' /> | ||||
<abstract><t>This document describes a mechanism that enables the Transport Laye | ||||
r Security (TLS) server to resume sessions and avoid keeping per-client session | ||||
state. The TLS server encapsulates the session state into a ticket and forwards | ||||
it to the client. The client can subsequently resume a session using the obtai | ||||
ned ticket. This document obsoletes RFC 4507. [STANDARDS-TRACK]</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='5077'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC5077'/> | ||||
</reference> | ||||
<reference anchor="RFC5246" target='https://www.rfc-editor.org/info/rfc5246'> | ||||
<front> | ||||
<title>The Transport Layer Security (TLS) Protocol Version 1.2</title> | ||||
<author initials='T.' surname='Dierks' fullname='T. Dierks'><organization /></au | ||||
thor> | ||||
<author initials='E.' surname='Rescorla' fullname='E. Rescorla'><organization /> | ||||
</author> | ||||
<date year='2008' month='August' /> | ||||
<abstract><t>This document specifies Version 1.2 of the Transport Layer Security | ||||
(TLS) protocol. The TLS protocol provides communications security over the Int | ||||
ernet. The protocol allows client/server applications to communicate in a way t | ||||
hat is designed to prevent eavesdropping, tampering, or message forgery. [STAND | ||||
ARDS-TRACK]</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='5246'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC5246'/> | ||||
</reference> | ||||
<reference anchor="RFC6454" target='https://www.rfc-editor.org/info/rfc6454'> | ||||
<front> | ||||
<title>The Web Origin Concept</title> | ||||
<author initials='A.' surname='Barth' fullname='A. Barth'><organization /></auth | ||||
or> | ||||
<date year='2011' month='December' /> | ||||
<abstract><t>This document defines the concept of an "origin", which i | ||||
s often used as the scope of authority or privilege by user agents. Typically, | ||||
user agents isolate content retrieved from different origins to prevent maliciou | ||||
s web site operators from interfering with the operation of benign web sites. I | ||||
n 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 o | ||||
rigin into a string. It also defines an HTTP header field, named "Origin&q | ||||
uot;, that indicates which origins are associated with an HTTP request. [STAND | ||||
ARDS-TRACK]</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='6454'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC6454'/> | ||||
</reference> | ||||
<reference anchor="RFC6962" target='https://www.rfc-editor.org/info/rfc6962'> | ||||
<front> | ||||
<title>Certificate Transparency</title> | ||||
<author initials='B.' surname='Laurie' fullname='B. Laurie'><organization /></au | ||||
thor> | ||||
<author initials='A.' surname='Langley' fullname='A. Langley'><organization /></ | ||||
author> | ||||
<author initials='E.' surname='Kasper' fullname='E. Kasper'><organization /></au | ||||
thor> | ||||
<date year='2013' month='June' /> | ||||
<abstract><t>This document describes an experimental protocol for publicly loggi | ||||
ng the existence of Transport Layer Security (TLS) certificates as they are issu | ||||
ed or observed, in a manner that allows anyone to audit certificate authority (C | ||||
A) activity and notice the issuance of suspect certificates as well as to audit | ||||
the certificate logs themselves. The intent is that eventually clients would re | ||||
fuse to honor certificates that do not appear in a log, effectively forcing CAs | ||||
to add all issued certificates to the logs.</t><t>Logs are network services that | ||||
implement the protocol operations for submissions and queries that are defined | ||||
in this document.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='6962'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC6962'/> | ||||
</reference> | ||||
<reference anchor="RFC7258" target='https://www.rfc-editor.org/info/rfc7258'> | ||||
<front> | ||||
<title>Pervasive Monitoring Is an Attack</title> | ||||
<author initials='S.' surname='Farrell' fullname='S. Farrell'><organization /></ | ||||
author> | ||||
<author initials='H.' surname='Tschofenig' fullname='H. Tschofenig'><organizatio | ||||
n /></author> | ||||
<date year='2014' month='May' /> | ||||
<abstract><t>Pervasive monitoring is a technical attack that should be mitigated | ||||
in the design of IETF protocols, where possible.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='188'/> | ||||
<seriesInfo name='RFC' value='7258'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7258'/> | ||||
</reference> | ||||
<reference anchor="RFC7469" target='https://www.rfc-editor.org/info/rfc7469'> | ||||
<front> | ||||
<title>Public Key Pinning Extension for HTTP</title> | ||||
<author initials='C.' surname='Evans' fullname='C. Evans'><organization /></auth | ||||
or> | ||||
<author initials='C.' surname='Palmer' fullname='C. Palmer'><organization /></au | ||||
thor> | ||||
<author initials='R.' surname='Sleevi' fullname='R. Sleevi'><organization /></au | ||||
thor> | ||||
<date year='2015' month='April' /> | ||||
<abstract><t>This document defines a new HTTP header that allows web host operat | ||||
ors to instruct user agents to remember ("pin") the hosts' cryptograph | ||||
ic identities over a period of time. During that time, user agents (UAs) will r | ||||
equire that the host presents a certificate chain including at least one Subject | ||||
Public Key Info structure whose fingerprint matches one of the pinned fingerpri | ||||
nts for that host. By effectively reducing the number of trusted authorities wh | ||||
o can authenticate the domain during the lifetime of the pin, pinning may reduce | ||||
the incidence of man-in-the-middle attacks due to compromised Certification Aut | ||||
horities.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7469'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7469'/> | ||||
</reference> | ||||
<reference anchor="RFC7507" target='https://www.rfc-editor.org/info/rfc7507'> | ||||
<front> | ||||
<title>TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol | ||||
Downgrade Attacks</title> | ||||
<author initials='B.' surname='Moeller' fullname='B. Moeller'><organization /></ | ||||
author> | ||||
<author initials='A.' surname='Langley' fullname='A. Langley'><organization /></ | ||||
author> | ||||
<date year='2015' month='April' /> | ||||
<abstract><t>This document defines a Signaling Cipher Suite Value (SCSV) that pr | ||||
events protocol downgrade attacks on the Transport Layer Security (TLS) and Data | ||||
gram Transport Layer Security (DTLS) protocols. It updates RFCs 2246, 4346, 434 | ||||
7, 5246, and 6347. Server update considerations are included.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7507'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7507'/> | ||||
</reference> | ||||
<reference anchor="RFC7942" target='https://www.rfc-editor.org/info/rfc7942'> | ||||
<front> | ||||
<title>Improving Awareness of Running Code: The Implementation Status Section</t | ||||
itle> | ||||
<author initials='Y.' surname='Sheffer' fullname='Y. Sheffer'><organization /></ | ||||
author> | ||||
<author initials='A.' surname='Farrel' fullname='A. Farrel'><organization /></au | ||||
thor> | ||||
<date year='2016' month='July' /> | ||||
<abstract><t>This document describes a simple process that allows authors of Int | ||||
ernet-Drafts to record the status of known implementations by including an Imple | ||||
mentation Status section. This will allow reviewers and working groups to assig | ||||
n due consideration to documents that have the benefit of running code, which ma | ||||
y serve as evidence of valuable experimentation and feedback that have made the | ||||
implemented protocols more mature.</t><t>This process is not mandatory. Authors | ||||
of Internet-Drafts are encouraged to consider using the process for their docum | ||||
ents, and working groups are invited to think about applying the process to all | ||||
of their protocol specifications. This document obsoletes RFC 6982, advancing i | ||||
t to a Best Current Practice.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='205'/> | ||||
<seriesInfo name='RFC' value='7942'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7942'/> | ||||
</reference> | ||||
<reference anchor="I-D.perrin-tls-tack"> | ||||
<front> | ||||
<title>Trust Assertions for Certificate Keys</title> | ||||
<author initials='M' surname='Marlinspike' fullname='Moxie Marlinspike'> | ||||
<organization /> | ||||
</author> | ||||
<date month='January' day='7' year='2013' /> | ||||
<abstract><t>This document defines a TLS Extension that enables a TLS server to | ||||
support "pinning" to a self-chosen signing key. A client contacting a pinned ho | ||||
st will require the server to present a signature from the signing key over the | ||||
TLS server's public key.</t></abstract> | ||||
</front> | <!-- draft-ietf-draft-perrin-tls-tack-02 expired --> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
I-D.draft-perrin-tls-tack-02.xml"/> | ||||
<seriesInfo name='Internet-Draft' value='draft-perrin-tls-tack-02' /> | <reference anchor="Oreo"> | |||
<format type='TXT' | <front> | |||
target='http://www.ietf.org/internet-drafts/draft-perrin-tls-tack-02.txt | <title>Firm Grip Handshakes: A Tool for Bidirectional Vouching</titl | |||
' /> | e> | |||
</reference> | <author initials="O." surname="Berkman"> | |||
<organization/> | ||||
</author> | ||||
<author initials="B." surname="Pinkas"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="M." surname="Yung"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2012"/> | ||||
</front> | ||||
<seriesInfo name="Cryptology and Network Security" value="pp. 142-15 | ||||
7"/> | ||||
</reference> | ||||
<reference anchor="Oreo" > | <reference anchor="Netcraft" | |||
<front> | target="https://news.netcraft.com/archives/2016/03/30/http-pu | |||
<title>Firm Grip Handshakes: A Tool for Bidirectional Vouching</title> | blic-key-pinning-youre-doing-it-wrong.html"> | |||
<author initials="O." surname="Berkman"> | <front> | |||
<organization></organization> | <title>HTTP Public Key Pinning: You're doing it wrong!</title> | |||
</author> | <author initials="P." surname="Mutton" fullname="Paul Mutton"> | |||
<author initials="B." surname="Pinkas"> | <organization/> | |||
<organization></organization> | </author> | |||
</author> | <date year="2016" month="March"/> | |||
<author initials="M." surname="Yung"> | </front> | |||
<organization></organization> | </reference> | |||
</author> | ||||
<date year="2012"/> | ||||
</front> | ||||
<seriesInfo name="Cryptology and Network Security, pp. 142-157" value=""/> | ||||
</reference> | ||||
<reference anchor="Netcraft" target="http://news.netcraft.com/archives/2016/03/3 | ||||
0/http-public-key-pinning-youre-doing-it-wrong.html"> | ||||
<front> | ||||
<title>HTTP Public Key Pinning: You're doing it wrong!</title> | ||||
<author initials="P." surname="Mutton" fullname="Paul Mutton"> | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2016" month="March"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="TLS-EXT" target="https://www.iana.org/assignments/tls-extensi | ||||
ontype-values/tls-extensiontype-values.xhtml#tls-extensiontype-values-1"> | ||||
<front> | ||||
<title>TLS Extension Type Value</title> | ||||
<author initials="." surname="IANA"> | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2018"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="TLS-EXT" | ||||
target="https://www.iana.org/assignments/tls-extensiontype-va | ||||
lues/"> | ||||
<front> | ||||
<title>TLS Extension Type Value</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<section anchor="previous-work" numbered="true" toc="default"> | ||||
<section anchor="previous-work" title="Previous Work"> | <name>Previous Work</name> | |||
<t>The global PKI system relies on the trust of a CA issuing certificates. | ||||
<t>The global PKI system relies on the trust of a CA issuing certificates. | ||||
As a result, a corrupted trusted CA may issue a certificate for any | As a result, a corrupted trusted CA may issue a certificate for any | |||
organization without the organization’s approval (a misissued or “fake” | organization without the organization's approval (a misissued or "fake" | |||
certificate), and use the certificate to impersonate the organization. | certificate), and use the certificate to impersonate the organization. | |||
There are many attempts to resolve these weaknesses, including | There are many attempts to resolve these weaknesses, including the | |||
Certificate Transparency (CT) <xref target="RFC6962"/>, HTTP Public Key Pinning | Certificate Transparency (CT) protocol <xref target="RFC6962" format="default"/> | |||
(HPKP) <xref target="RFC7469"/>, and TACK <xref target="I-D.perrin-tls-tack"/>.< | , | |||
/t> | HTTP Public Key Pinning (HPKP) <xref target="RFC7469" format="default"/>, | |||
and Trust Assertions for Certificate Keys (TACK) <xref target="I-D.perrin-tls-ta | ||||
<t>CT requires | ck" format="default"/>.</t> | |||
<t>CT requires | ||||
cooperation of a large portion of the hundreds of extant certificate | cooperation of a large portion of the hundreds of extant certificate | |||
authorities (CAs) before it can be used “for real”, in enforcing mode. | authorities (CAs) before it can be used "for real", in enforcing mode. | |||
It is noted that the relevant industry forum (CA/Browser Forum) is | It is noted that the relevant industry forum (CA/Browser Forum) is | |||
indeed pushing for such extensive adoption. However the public nature of CT | indeed pushing for such extensive adoption. However the public nature of CT | |||
often makes it inappropriate for enterprise use, because many organizations | often makes it inappropriate for enterprise use because many organizations | |||
are not willing to expose their internal infrastructure publicly.</t> | are not willing to expose their internal infrastructure publicly.</t> | |||
<t>TACK has some similarities | ||||
<t>TACK has some similarities | to the current proposal, but work on it seems to have stalled. <xref target="ta | |||
to the current proposal, but work on it seems to have stalled. <xref target="ta | ck" format="default"/> | |||
ck"/> | ||||
compares our proposal to TACK.</t> | compares our proposal to TACK.</t> | |||
<t>HPKP is an IETF standard, but so far has proven hard to deploy. HPKP | ||||
<t>HPKP is an IETF standard, but so far has proven hard to deploy. HPKP | ||||
pins (fixes) a public key, one of the public keys listed in the | pins (fixes) a public key, one of the public keys listed in the | |||
certificate chain. As a result, HPKP needs to be coordinated with the | certificate chain. As a result, HPKP needs to be coordinated with the | |||
certificate management process. Certificate management impacts HPKP and | certificate management process. Certificate management impacts HPKP and | |||
thus increases the probability of HPKP failures. This risk is made even | thus increases the probability of HPKP failures. This risk is made even | |||
higher given the fact that, even though work has been done at the ACME | higher given the fact that, even though work has been done in the | |||
WG to automate certificate management, in many or even most cases, | Automated Certificate Management Environment (ACME) | |||
working group to automate certificate management, in many or even most cases, | ||||
certificates are still managed manually. As a result, HPKP cannot be | certificates are still managed manually. As a result, HPKP cannot be | |||
completely automated resulting in error-prone manual configuration. Such | completely automated, resulting in error-prone manual configuration. Such | |||
errors could prevent the web server from being accessed by some clients. | errors could prevent the web server from being accessed by some clients. | |||
In addition, HPKP uses a HTTP header which makes this solution HTTPS | In addition, HPKP uses an HTTP header, which makes this solution HTTPS | |||
specific and not generic to TLS. On the other hand, the current document | specific and not generic to TLS. On the other hand, the current document | |||
provides a solution that is independent of the server’s certificate | provides a solution that is independent of the server's certificate | |||
management and that can be entirely and easily automated. <xref target="hpkp"/> | management, and that can be entirely and easily automated. <xref target="hpkp" f | |||
ormat="default"/> | ||||
compares HPKP to the current document in more detail.</t> | compares HPKP to the current document in more detail.</t> | |||
<t>The ticket pinning proposal augments these mechanisms with a much easie | ||||
<t>The ticket pinning proposal augments these mechanisms with a much easier | r | |||
to implement and deploy solution for server identity pinning, by reusing | to implement and deploy solution for server identity pinning, by reusing | |||
some of the ideas behind TLS session resumption.</t> | some of the ideas behind TLS session resumption.</t> | |||
<t>This section compares ticket pinning to two earlier proposals, HPKP and | ||||
<t>This section compares ticket pinning to two earlier proposals, HPKP and TACK. | TACK.</t> | |||
</t> | <section anchor="hpkp" numbered="true" toc="default"> | |||
<name>Comparison: HPKP</name> | ||||
<section anchor="hpkp" title="Comparison: HPKP"> | <t>The current IETF standard for pinning the identity of web servers is | |||
HPKP <xref target="RFC7469" format="default"/>.</t> | ||||
<t>The current IETF standard for pinning the identity of web servers is the | <t>The main differences between HPKP and the current document are the | |||
Public Key Pinning Extension for HTTP, or HPKP <xref target="RFC7469"/>.</t> | ||||
<t>The main differences between HPKP and the current document are the | ||||
following:</t> | following:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>HPKP limits its scope to HTTPS, while the current document conside | |||
<t>HPKP limits its scope to HTTPS, while the current document considers all | rs all | |||
application above TLS.</t> | application above TLS.</li> | |||
<t>HPKP pins the public key of the server (or another public key along the | <li>HPKP pins the public key of the server (or another public key alon | |||
certificate chain) and as such is highly dependent on the management of | g the | |||
certificate chain), and as such, is highly dependent on the management of | ||||
certificates. Such dependency increases the potential error surface, | certificates. Such dependency increases the potential error surface, | |||
especially as certificate management is not yet largely automated. The | especially as certificate management is not yet largely automated. The | |||
current proposal, on the other hand, is independent of certificate | current proposal, on the other hand, is independent of certificate | |||
management.</t> | management.</li> | |||
<t>HPKP pins public keys which are public and used for the standard TLS | <li>HPKP pins public keys that are public and used for the standard TL | |||
S | ||||
authentication. Identity pinning relies on the ownership of the pinning | authentication. Identity pinning relies on the ownership of the pinning | |||
key which is not disclosed to the public and not involved in the | key, which is not disclosed to the public and not involved in the | |||
standard TLS authentication. As a result, identity pinning is a | standard TLS authentication. As a result, identity pinning is a | |||
completely independent second factor authentication mechanism.</t> | completely independent, second-factor authentication mechanism.</li> | |||
<t>HPKP relies on a backup key to recover the misissuance of a key. We | <li>HPKP relies on a backup key to recover the misissuance of a key. | |||
We | ||||
believe such backup mechanisms add excessive complexity and cost. | believe such backup mechanisms add excessive complexity and cost. | |||
Reliability of the current mechanism is primarily based on its being | Reliability of the current mechanism is primarily based on its being | |||
highly automated.</t> | highly automated.</li> | |||
<t>HPKP relies on the client to report errors to the report-uri. The | <li>HPKP relies on the client to report errors to the report-uri. The | |||
current document does not need any out-of band mechanism, and the server is | current document does not need any out-of-band mechanism, and the server is | |||
informed automatically. This provides an easier and more reliable health | informed automatically. This provides an easier and more reliable health | |||
monitoring.</t> | monitoring.</li> | |||
</list></t> | </ul> | |||
<t>On the other hand, HPKP shares the following aspects with identity pi | ||||
<t>On the other hand, HPKP shares the following aspects with identity pinning:</ | nning:</t> | |||
t> | <ul spacing="normal"> | |||
<li>Both mechanisms provide hard failure. With HPKP, only the client | ||||
<t><list style="symbols"> | is | |||
<t>Both mechanisms provide hard failure. With HPKP only the client is | ||||
aware of the failure, while with the current proposal both client and | aware of the failure, while with the current proposal both client and | |||
server are informed of the failure. This provides room for further | server are informed of the failure. This provides room for further | |||
mechanisms to automatically recover such failures.</t> | mechanisms to automatically recover from such failures.</li> | |||
<t>Both mechanisms are subject to a server compromise in which users are | <li>Both mechanisms are subject to a server compromise in which users | |||
provided with an invalid ticket (e.g. a random one) or HTTP Header, with | are | |||
a very long lifetime. For identity pinning, this lifetime SHOULD NOT be | provided with an invalid ticket (e.g., a random one) or HTTP header with | |||
a very long lifetime. For identity pinning, this lifetime <bcp14>SHOULD NOT</bcp | ||||
14> be | ||||
longer than 31 days. In both cases, clients will not be able to | longer than 31 days. In both cases, clients will not be able to | |||
reconnect the server during this lifetime. With the current proposal, | reconnect the server during this lifetime. With the current proposal, | |||
an attacker needs to compromise the TLS layer, while with HPKP, the | an attacker needs to compromise the TLS layer, while with HPKP, the | |||
attacker needs to compromise the HTTP server. Arguably, the TLS-level | attacker needs to compromise the HTTP server. Arguably, the TLS-level | |||
compromise is typically more difficult for the attacker.</t> | compromise is typically more difficult for the attacker.</li> | |||
</list></t> | </ul> | |||
<t>Unfortunately HPKP has not seen wide deployment yet. As of March 201 | ||||
<t>Unfortunately HPKP has not seen wide deployment yet. As of March 2016, | 6, | |||
the number of servers using HPKP was less than 3000 <xref target="Netcraft"/>. | the number of servers using HPKP was less than 3000 <xref target="Netcraft" form | |||
This | at="default"/>. This | |||
may simply be due to inertia, but we believe the main reason is the | may simply be due to inertia, but we believe the main reason is the | |||
interactions between HPKP and manual certificate management which is | interactions between HPKP and manual certificate management that is | |||
needed to implement HPKP for enterprise servers. The penalty for making | needed to implement HPKP for enterprise servers. The penalty for making | |||
mistakes (e.g. being too early or too late to deploy new pins) is having | mistakes (e.g., being too early or too late to deploy new pins) is that | |||
the server become unusable for some of the clients.</t> | the server becomes unusable for some of the clients.</t> | |||
<t>To demonstrate this point, we present a list of the steps involved in | ||||
deploying HPKP on a security-sensitive web server.</t> | ||||
<ol spacing="normal" type="1"> | ||||
<li> | ||||
<t>Generate two public/private key pairs on a computer that is not t | ||||
he | ||||
live server. The second one is the "backup1" key pair. </t> | ||||
<sourcecode type="bash"> | ||||
openssl genrsa -out "example.com.key" 2048; | ||||
<t>To demonstrate this point, we present a list of the steps involved in | openssl genrsa -out "example.com.backup1.key" 2048; | |||
deploying HPKP on a security-sensitive Web server.</t> | </sourcecode> | |||
</li> | ||||
<t><list style="numbers"> | <li> | |||
<t>Generate two public/private key-pairs on a computer that is not the | <t>Generate hashes for both of the public keys. These will be used i | |||
Live server. The second one is the “backup1” key-pair. <vspace blankLines='1'/> | n | |||
<spanx style="verb">openssl genrsa -out "example.com.key" 2048;</spanx> <vspace | the HPKP header: </t> | |||
blankLines='1'/> | <sourcecode type="bash"> | |||
<spanx style="verb">openssl genrsa -out "example.com.backup1.key" 2048;</spanx>< | openssl rsa -in "example.com.key" -outform der -pubout | \ | |||
/t> | openssl dgst -sha256 -binary | openssl enc -base64 | |||
<t>Generate hashes for both of the public keys. These will be used in | ||||
the HPKP header: <vspace blankLines='1'/> | openssl rsa -in "example.com.backup1.key" -outform der \ | |||
<spanx style="verb">openssl rsa -in "example.com.key" -outform der -pubout | ope | -pubout | openssl dgst -sha256 -binary | openssl enc -base64 | |||
nssl dgst -sha256 -binary | openssl enc -base64</spanx> <vspace blankLines='1'/ | </sourcecode> | |||
> | </li> | |||
<spanx style="verb">openssl rsa -in "example.com.backup1.key" -outform der -pubo | <li> | |||
ut | openssl dgst -sha256 -binary | openssl enc -base64</spanx></t> | <t>Generate a single CSR (Certificate Signing Request) for the first | |||
<t>Generate a single CSR (Certificate Signing Request) for the first | key pair, where you include the domain name in the CN (Common Name) | |||
key-pair, where you include the domain name in the CN (Common Name) | field: </t> | |||
field: <vspace blankLines='1'/> | <sourcecode type="bash"> | |||
<spanx style="verb">openssl req -new -subj "/C=GB/ST=Area/L=Town/O=Company/CN=ex | openssl req -new -subj "/C=GB/ST=Area/L=Town/O=Org/ \ | |||
ample.com" | CN=example.com" -key "example.com.key" -out "example.com.csr"; | |||
-key "example.com.key" -out "example.com.csr";</spanx></t> | </sourcecode> | |||
<t>Send this CSR to the CA (Certificate Authority), and go though the | </li> | |||
dance to prove you own the domain. The CA will give you back a single | <li>Send this CSR to the CA and go though the | |||
certificate that will typically expire within a year or two.</t> | dance to prove you own the domain. The CA will give you a single | |||
<t>On the Live server, upload and setup the first key-pair (and its | certificate that will typically expire within a year or two.</li> | |||
certificate). At this point you can add the “Public-Key-Pins” header, | <li> | |||
using the two hashes you created in step 2. <vspace blankLines='1'/> | <t>On the live server, upload and set up the first key pair and its | |||
Note that only the first key-pair has been uploaded to the server so far.</t> | certificate. At this point, you can add the "Public-Key-Pins" header, | |||
<t>Store the second (backup1) key-pair somewhere safe, probably | using the two hashes you created in step 2. </t> | |||
somewhere encrypted like a password manager. It won’t expire, as it’s | <t> | |||
just a key-pair, it just needs to be ready for when you need to get your | Note that only the first key pair has been uploaded to the server so far.</t> | |||
next certificate.</t> | </li> | |||
<t>Time passes… probably just under a year (if waiting for a | <li>Store the second (backup1) key pair somewhere safe, probably | |||
somewhere encrypted like a password manager. It won't expire, as it's | ||||
just a key pair; it just needs to be ready for when you need to get your | ||||
next certificate.</li> | ||||
<li>Time passes -- probably just under a year (if waiting for a | ||||
certificate to expire), or maybe sooner if you find that your server has | certificate to expire), or maybe sooner if you find that your server has | |||
been compromised and you need to replace the key-pair and certificate.</t> | been compromised, and you need to replace the key pair and certificate.</li> | |||
<t>Create a new CSR (Certificate Signing Request) using the “backup1” | <li>Create a new CSR using the "backup1" | |||
key-pair, and get a new certificate from your CA.</t> | key pair, and get a new certificate from your CA.</li> | |||
<t>Generate a new backup key-pair (backup2), get its hash, and store it | <li>Generate a new backup key pair (backup2), get its hash, and store | |||
in a safe place (again, not on the Live server).</t> | it | |||
<t>Replace your old certificate and old key-pair, and update the | in a safe place (again, not on the live server).</li> | |||
“Public-Key-Pins” header to remove the old hash, and add the new | <li>Replace your old certificate and old key pair, update the | |||
“backup2” key-pair.</t> | "Public-Key-Pins" header to remove the old hash, and add the new | |||
</list></t> | "backup2" key pair.</li> | |||
</ol> | ||||
<t>Note that in the above steps, both the certificate issuance as well as | <t>Note that in the above steps, both the certificate issuance as well a s | |||
the storage of the backup key pair involve manual steps. Even with an | the storage of the backup key pair involve manual steps. Even with an | |||
automated CA that runs the ACME protocol, key backup would be a | automated CA that runs the ACME protocol <xref target="RFC8555"/>, key backup wo uld be a | |||
challenge to automate.</t> | challenge to automate.</t> | |||
</section> | ||||
</section> | <section anchor="tack" numbered="true" toc="default"> | |||
<section anchor="tack" title="Comparison: TACK"> | <name>Comparison: TACK</name> | |||
<t>Compared with HPKP, TACK <xref target="I-D.perrin-tls-tack" format="d | ||||
<t>Compared with HPKP, TACK <xref target="I-D.perrin-tls-tack"/> is a lot more s | efault"/> is more similar | |||
imilar | ||||
to the current document. It can even be argued that this document is a | to the current document. It can even be argued that this document is a | |||
symmetric-cryptography variant of TACK. That said, there are still a | symmetric-cryptography variant of TACK. That said, there are still a | |||
few significant differences:</t> | few significant differences:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>Probably the most important difference is that with TACK, validati | |||
<t>Probably the most important difference is that with TACK, validation of | on of | |||
the server certificate is no longer required, and in fact TACK specifies | the server certificate is no longer required, and in fact TACK specifies | |||
it as a “MAY” requirement (Sec. 5.3). With ticket pinning, certificate | it as a "<bcp14>MAY</bcp14>" requirement (<xref target="I-D.perrin-tls-tack" sec | |||
validation by the client remains a MUST requirement, and the ticket acts | tionFormat="comma" section="5.3" format="default"/>). With ticket pinning, cert | |||
ificate | ||||
validation by the client remains a <bcp14>MUST</bcp14> requirement, and the tick | ||||
et acts | ||||
only as a second factor. If the pinning secret is compromised, the | only as a second factor. If the pinning secret is compromised, the | |||
server’s security is not immediately at risk.</t> | server's security is not immediately at risk.</li> | |||
<t>Both TACK and the current document are mostly orthogonal to the server | <li>Both TACK and the current document are mostly orthogonal to the se | |||
rver | ||||
certificate as far as their life cycle, and so both can be deployed with | certificate as far as their life cycle, and so both can be deployed with | |||
no manual steps.</t> | no manual steps.</li> | |||
<t>TACK uses ECDSA to sign the server’s public key. This allows | <li>TACK uses Elliptic Curve Digital Signature Algorithm | |||
(ECDSA) to sign the server's public key. This allows | ||||
cooperating clients to share server assertions between themselves. This | cooperating clients to share server assertions between themselves. This | |||
is an optional TACK feature, and one that cannot be done with pinning | is an optional TACK feature, and one that cannot be done with pinning | |||
tickets.</t> | tickets.</li> | |||
<t>TACK allows multiple servers to share its public keys. Such sharing is | <li>TACK allows multiple servers to share its public keys. Such sharin | |||
disallowed by the current document.</t> | g is | |||
<t>TACK does not allow the server to track a particular client, and so | disallowed by the current document.</li> | |||
has better privacy properties than the current document.</t> | <li>TACK does not allow the server to track a particular client, and s | |||
<t>TACK has an interesting way to determine the pin’s lifetime, setting | o | |||
has better privacy properties than the current document.</li> | ||||
<li>TACK has an interesting way to determine the pin's lifetime, setti | ||||
ng | ||||
it to the time period since the pin was first observed, with a hard | it to the time period since the pin was first observed, with a hard | |||
upper bound of 30 days. The current document makes the lifetime explicit, | upper bound of 30 days. The current document makes the lifetime explicit, | |||
which may be more flexible to deploy. For example, Web sites which are | which may be more flexible to deploy. For example, web sites that are | |||
only visited rarely by users may opt for a longer period than other | only visited rarely by users may opt for a longer period than other | |||
sites that expect users to visit on a daily basis.</t> | sites that expect users to visit on a daily basis.</li> | |||
</list></t> | </ul> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
<section anchor="document-history" title="Document History"> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-12" title="draft-sheffer-tls-p | ||||
inning-ticket-12"> | ||||
<t><list style="symbols"> | ||||
<t>IETF-Conflict Review comments.</t> | ||||
<t>IANA: removed request for a specific extension value.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-11" title="draft-sheffer-tls-p | ||||
inning-ticket-11"> | ||||
<t><list style="symbols"> | ||||
<t>Comments by Ben Kaduk. Specifically, changed the derivation of the pinning | ||||
proof | ||||
to make it more in line with the TLS 1.3 key schedule.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-10" title="draft-sheffer-tls-p | ||||
inning-ticket-10"> | ||||
<t><list style="symbols"> | ||||
<t>ISE comments by Adrian Farrel, the ISE.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-09" title="draft-sheffer-tls-p | ||||
inning-ticket-09"> | ||||
<t><list style="symbols"> | ||||
<t>ISE comments by Yoav Nir.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-08" title="draft-sheffer-tls-p | ||||
inning-ticket-08"> | ||||
<t><list style="symbols"> | ||||
<t>ISE comments by Rich Salz.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-07" title="draft-sheffer-tls-p | ||||
inning-ticket-07"> | ||||
<t><list style="symbols"> | ||||
<t>Refer to published RFCs.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-06" title="draft-sheffer-tls-p | ||||
inning-ticket-06"> | ||||
<t><list style="symbols"> | ||||
<t>IANA Considerations in preparation for Experimental publication.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-05" title="draft-sheffer-tls-p | ||||
inning-ticket-05"> | ||||
<t><list style="symbols"> | ||||
<t>Multiple comments from Eric Rescorla.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-04" title="draft-sheffer-tls-p | ||||
inning-ticket-04"> | ||||
<t><list style="symbols"> | ||||
<t>Editorial changes.</t> | ||||
<t>Two-phase rotation of protection key.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-03" title="draft-sheffer-tls-p | ||||
inning-ticket-03"> | ||||
<t><list style="symbols"> | ||||
<t>Deleted redundant length fields in the extension’s formal definition.</t> | ||||
<t>Modified cryptographic operations to align with the current state of TLS 1. | ||||
3.</t> | ||||
<t>Numerous textual improvements.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-02" title="draft-sheffer-tls-p | ||||
inning-ticket-02"> | ||||
<t><list style="symbols"> | ||||
<t>Added an Implementation Status section.</t> | ||||
<t>Added lengths into the extension structure.</t> | ||||
<t>Changed the computation of the pinning proof to be more robust.</t> | ||||
<t>Clarified requirements on the length of the pinning_secret.</t> | ||||
<t>Revamped the HPKP section to be more in line with current practices, and ad | ||||
ded recent | ||||
statistics on HPKP deployment.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-01" title="draft-sheffer-tls-p | ||||
inning-ticket-01"> | ||||
<t><list style="symbols"> | ||||
<t>Corrected the notation for variable-sized vectors.</t> | ||||
<t>Added a section on disaster recovery and backup.</t> | ||||
<t>Added a section on privacy.</t> | ||||
<t>Clarified the assumptions behind the HPKP procedure in the comparison secti | ||||
on.</t> | ||||
<t>Added a definition of pin indexing (origin).</t> | ||||
<t>Adjusted to the latest TLS 1.3 notation.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="draft-sheffer-tls-pinning-ticket-00" title="draft-sheffer-tls-p | ||||
inning-ticket-00"> | ||||
<t>Initial version.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="acknowledgments" numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>The original idea behind this proposal was published in <xref target="O | ||||
reo" format="default"/> by | ||||
Moti Yung, Benny Pinkas, and Omer Berkman. The current protocol is | ||||
but a distant relative of the original Oreo protocol, and any errors | ||||
are the responsibility of the authors of this document alone.</t> | ||||
<t>We would like to thank Adrian Farrel, Dave Garrett, | ||||
Daniel Kahn Gillmor, | ||||
Alexey Melnikov, | ||||
Yoav Nir, | ||||
Eric Rescorla, Benjamin Kaduk, and Rich Salz for their comments on this document | ||||
. | ||||
Special thanks to Craig Francis for contributing the HPKP deployment | ||||
script, and to Ralph Holz for several fruitful discussions.</t> | ||||
</section> | ||||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
H4sIAMyOE10AA8V963IbV3bu//0UHeiHSQ8ASZQs25o4FYqSLJWtyxHpcVxx | ||||
jtIAGkQPG91Id4MURuN3Oc9ynuysb132pQFKmlSqjmoSE0D3vq69rt9aezKZ | ||||
uL7sq+JxdvHzeXZetNdFm71cFDV9u8velnVd1pfZTdmvsotyflX0nctns7a4 | ||||
fux/tO8XzbzO19TSos2X/aRbFctl0U76qpts5NFJz49O7p+4ed4Xl027e5wV | ||||
HzZuu1nQ5+6xa2ZdUxX8pys37eOsb7ddf3Lv3vf3TlzeFvnj7MeiLtq8cjdN | ||||
e3XZNtvNY3dV7OjT4nH2su6LtqYenmIIznV9Xi/e51VT07B2Rec25WOXZe1y | ||||
Xiy6flfpt1nWN/Poz7LGAtgXXdP2bbHs/OfdOvnYt+XcPzxv1mt61/9a1lVZ | ||||
h26KD/2kKjtand161lT02KT5+k/O5dt+1bQY24T+D6/RT79Ns3NZRP5OFve3 | ||||
vG3q5Pumvczr8m95XzY1L8G27PmHYp2X1eNstMMry2lZ9Mt/vcR3UxrlKO3r | ||||
6TR7VV7m26qP+npK7RZV8kPa2TOaetc1ddLdgt+aruWtfy30GenU1U27prev | ||||
C0z23fOzk/v3v9c/v7t/8sj+fPgw+vNbUEO93Hvz3kP985t7335rf574Nx89 | ||||
/MYeePT9oxP989uTb76zPx8+sr6/pSbsz+8f8rMvJ0+nm6Jty5ppuM/nV/j6 | ||||
TVs0j3nCenBGz8t2nf3YlpvsBZFbt8qviH6z0+yiaaqMRp09KRdlW8yxZnmV | ||||
/aXZzld0GkbcCAj/cXZyj84EPgZCwL+JbM6bafakaK/WeZ1+/2SKQ3iVd+nX | ||||
r6bZb9v6kr/saPmLDov3ODtrd5u+qZrLXUbjzF4XPc4QHfr5tqXTPs42m2l2 | ||||
/+HJ5P4339LL9Pscx+jx3sAm2p9QyVva5uzVtu+VDmxZXlxcvM3ebmdVOc9+ | ||||
KjwzIRJutl+1RbZowD3KPrsh8rz8p3g5XuXtfJU9uDfGwjySVvP2sqBjtur7 | ||||
zeO7d+vippvWOkKQ1l28QsTR3cUrd+89uPvg3l08PNnwECbEJDwf2jXbtpjw | ||||
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 | ||||
</rfc> | </rfc> | |||
End of changes. 184 change blocks. | ||||
1633 lines changed or deleted | 799 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |