Report on preliminary decision on TLS 1.3 and client auth

Martin Thomson <martin.thomson@gmail.com> Wed, 23 September 2015 17:24 UTC

Return-Path: <ietf-http-wg-request+bounce-httpbisa-archive-bis2juki=lists.ie@listhub.w3.org>
X-Original-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Delivered-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 686D21A8706 for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Wed, 23 Sep 2015 10:24:35 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -7.011
X-Spam-Level:
X-Spam-Status: No, score=-7.011 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_HI=-5, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0ebHyFKD2L6P for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Wed, 23 Sep 2015 10:24:33 -0700 (PDT)
Received: from frink.w3.org (frink.w3.org [128.30.52.56]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 5247C1A872E for <httpbisa-archive-bis2Juki@lists.ietf.org>; Wed, 23 Sep 2015 10:20:51 -0700 (PDT)
Received: from lists by frink.w3.org with local (Exim 4.80) (envelope-from <ietf-http-wg-request@listhub.w3.org>) id 1ZenfR-0006mg-4H for ietf-http-wg-dist@listhub.w3.org; Wed, 23 Sep 2015 17:17:17 +0000
Resent-Date: Wed, 23 Sep 2015 17:17:17 +0000
Resent-Message-Id: <E1ZenfR-0006mg-4H@frink.w3.org>
Received: from lisa.w3.org ([128.30.52.41]) by frink.w3.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from <martin.thomson@gmail.com>) id 1ZenfK-0006lu-DF for ietf-http-wg@listhub.w3.org; Wed, 23 Sep 2015 17:17:10 +0000
Received: from mail-yk0-f173.google.com ([209.85.160.173]) by lisa.w3.org with esmtps (TLS1.2:RSA_ARCFOUR_SHA1:128) (Exim 4.80) (envelope-from <martin.thomson@gmail.com>) id 1ZenfI-0005o1-Mf for ietf-http-wg@w3.org; Wed, 23 Sep 2015 17:17:10 +0000
Received: by ykdz138 with SMTP id z138so48317122ykd.2 for <ietf-http-wg@w3.org>; Wed, 23 Sep 2015 10:16:42 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=zuJyQuqF4gwKla/gaJB/hLq2edlzIvj65RCLIkN5q28=; b=aNXcRwn4ZI3GBCWdeI0lMu/LcIfMQcALQpyJryR/ao/Kv6tj0aWlWa4d0eEoANfvXG 6kOr0aR173it3rKirR/1uJensepsZTDcCmQCTOMU5OLRwxZNxaekmoG1N+Jh35OwcA7t Zd3izgL+BePeWf3/a6dbMan6P9XpUs6gTgmh/t+7wiHk2T/bT2W6lnGObj86Vf8+jzCA rDuJCzPXzsBx/hedoJG7yXe4QIqRDf50NoXMd8n2iJFZCqljUSaPJF5ageMpImOmGGlX pjpGK5VnW6WzMpZ5SSX7Eo4q5+tNcDNYEhBYfPDLd0VXtDAuvpy//gaspkQCGmJbNqJl FPkA==
MIME-Version: 1.0
X-Received: by 10.13.221.197 with SMTP id g188mr28040506ywe.52.1443028602311; Wed, 23 Sep 2015 10:16:42 -0700 (PDT)
Received: by 10.129.133.130 with HTTP; Wed, 23 Sep 2015 10:16:42 -0700 (PDT)
Date: Wed, 23 Sep 2015 10:16:42 -0700
Message-ID: <CABkgnnWREq6X+chcvookChGAZGxkJ6Zs_7FGwz7Mbn12XMxewQ@mail.gmail.com>
From: Martin Thomson <martin.thomson@gmail.com>
To: HTTP Working Group <ietf-http-wg@w3.org>
Content-Type: multipart/alternative; boundary="94eb2c0763423ddd0005206d471a"
Received-SPF: pass client-ip=209.85.160.173; envelope-from=martin.thomson@gmail.com; helo=mail-yk0-f173.google.com
X-W3C-Hub-Spam-Status: No, score=-7.9
X-W3C-Hub-Spam-Report: AWL=1.842, BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_PASS=-0.001, W3C_AA=-1, W3C_DB=-1, W3C_IRA=-1, W3C_IRR=-3, W3C_WL=-1
X-W3C-Scan-Sig: lisa.w3.org 1ZenfI-0005o1-Mf c1e74075b1961296814996584769d018
X-Original-To: ietf-http-wg@w3.org
Subject: Report on preliminary decision on TLS 1.3 and client auth
Archived-At: <http://www.w3.org/mid/CABkgnnWREq6X+chcvookChGAZGxkJ6Zs_7FGwz7Mbn12XMxewQ@mail.gmail.com>
Resent-From: ietf-http-wg@w3.org
X-Mailing-List: <ietf-http-wg@w3.org> archive/latest/30263
X-Loop: ietf-http-wg@w3.org
Resent-Sender: ietf-http-wg-request@w3.org
Precedence: list
List-Id: <ietf-http-wg.w3.org>
List-Help: <http://www.w3.org/Mail/>
List-Post: <mailto:ietf-http-wg@w3.org>
List-Unsubscribe: <mailto:ietf-http-wg-request@w3.org?subject=unsubscribe>

The minutes of the TLS interim have been posted. Some decisions regard
client authentication were made.

https://www.ietf.org/proceedings/interim/2015/09/21/tls/minutes/minutes-interim-2015-tls-3

Here is a summary of the applicable pieces, plus what I options it provides
HTTP/2...

(Caveat here: aspects of this could change if new information is presented,
but it seems unlikely that there will be changes that will affect the core
decisions.)
The big change is that a server can request client authentication at any
time. A server may also make multiple such requests. Those multiple
requests could even be concurrent.

The security claims associated with client authentication require more
analysis before we can be certain, but the basic idea is that
authentication merely provides the proof that a server needs to regard the
entire session to be authentic. In other words, client authentication will
apply retroactively. This could allow a request sent prior to
authentication to be considered authenticated. This is a property that is
implicitly relied on for the existing renegotiation cases and one that we
might want to exploit.

Each certificate request includes an identifier that allows it to be
correlated with the certificate that is produced in response. This also
allows for correlating with application context. This is what I think that
we can use to fix HTTP/2.

Clients cannot spontaneously authenticate, which invalidates the designs I
have proposed, however, the basic structure is the basis for the first
option that I will suggest.


Option 1 uses a new authentication scheme. A request that causes a server
to require a client certificate is responded to with a 4xx response
containing a ClientCertificate challenge. That challenge includes an
identifier.  The server also sends - at the TLS layer - a
CertificateRequest containing the same identifier, allowing the client to
correlate it's HTTP request with the server's CertificateRequest.

Client@HTTP/2:
HEADERS
  :method = GET ...

Server@HTTP/2:
HEADERS
  :status = 401
  authorization = ClientCertificate req="option 1"

Server@TLS:
CertificateRequest { id: "option 1" }

Client@TLS:
Certificate+CertificateVerify { id: "option 1", certificates... }

Client@HTTP/2:
HEADERS
  :method = GET ...

Server@HTTP/2:
HEADERS
  :status = 200


Option 2 aims to more closely replicate the experience we get from
renegotiation in HTTP/1.1 + TLS <= 1.2.  Rather than rejecting the request,
the server sends an HTTP/2 frame on the stream to indicate to the client to
expect a CertificateRequest. That frame includes the identifier.

Client@HTTP/2:
HEADERS
  :method = GET ...

Server@HTTP/2:
EXPECT_AUTH
  id = option 2

Server@TLS:
CertificateRequest { id: "option 2" }

Client@TLS:
Certificate+CertificateVerify { id: "option 2", certificates... }

Server@HTTP/2:
HEADERS
  :status = 200

In this case, the server probably wants to know that the client is willing
to respond to these requests, otherwise it will want to use
HTTP_1_1_REQUIRED or 421.  So a companion setting to enable this is a good
idea (the semantics of the setting that Microsoft use for renegotiation is
pretty much exactly what we'd need).

I think that the first option has some architectural advantages, but that
is all.  The latter more closely replicates what people do today and for
that reason, I think that it is the best option.


As for how to implement this same basic mechanism in TLS 1.2, I have an
idea that will work for either option, but it's a bit disgusting, so I'll
save that for a follow-up email.