Re: Report on preliminary decision on TLS 1.3 and client auth

Amos Jeffries <squid3@treenet.co.nz> Thu, 24 September 2015 02:07 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 A6EB51B3628 for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Wed, 23 Sep 2015 19:07:01 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -6.912
X-Spam-Level:
X-Spam-Status: No, score=-6.912 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, 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 hlmFsCSlRbJ4 for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Wed, 23 Sep 2015 19:06:57 -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 937B91B3621 for <httpbisa-archive-bis2Juki@lists.ietf.org>; Wed, 23 Sep 2015 19:06:57 -0700 (PDT)
Received: from lists by frink.w3.org with local (Exim 4.80) (envelope-from <ietf-http-wg-request@listhub.w3.org>) id 1ZevsZ-0003J3-Fa for ietf-http-wg-dist@listhub.w3.org; Thu, 24 Sep 2015 02:03:23 +0000
Resent-Date: Thu, 24 Sep 2015 02:03:23 +0000
Resent-Message-Id: <E1ZevsZ-0003J3-Fa@frink.w3.org>
Received: from maggie.w3.org ([128.30.52.39]) by frink.w3.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from <squid3@treenet.co.nz>) id 1ZevsS-0003IM-FW for ietf-http-wg@listhub.w3.org; Thu, 24 Sep 2015 02:03:16 +0000
Received: from 121-99-228-82.static.orcon.net.nz ([121.99.228.82] helo=treenet.co.nz) by maggie.w3.org with esmtp (Exim 4.80) (envelope-from <squid3@treenet.co.nz>) id 1ZevsQ-0004sd-74 for ietf-http-wg@w3.org; Thu, 24 Sep 2015 02:03:15 +0000
Received: from [192.168.20.251] (unknown [121.98.42.176]) by treenet.co.nz (Postfix) with ESMTP id D46ACE6EA9 for <ietf-http-wg@w3.org>; Thu, 24 Sep 2015 14:02:38 +1200 (NZST)
To: ietf-http-wg@w3.org
References: <CABkgnnWREq6X+chcvookChGAZGxkJ6Zs_7FGwz7Mbn12XMxewQ@mail.gmail.com>
From: Amos Jeffries <squid3@treenet.co.nz>
X-Enigmail-Draft-Status: N1110
Message-ID: <5603599F.8090303@treenet.co.nz>
Date: Thu, 24 Sep 2015 14:02:07 +1200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0
MIME-Version: 1.0
In-Reply-To: <CABkgnnWREq6X+chcvookChGAZGxkJ6Zs_7FGwz7Mbn12XMxewQ@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
Received-SPF: pass client-ip=121.99.228.82; envelope-from=squid3@treenet.co.nz; helo=treenet.co.nz
X-W3C-Hub-Spam-Status: No, score=-4.8
X-W3C-Hub-Spam-Report: AWL=-0.157, BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, TVD_RCVD_IP=0.001, W3C_AA=-1, W3C_WL=-1
X-W3C-Scan-Sig: maggie.w3.org 1ZevsQ-0004sd-74 adb3b6e358492784e7df1f00bd5ba9bb
X-Original-To: ietf-http-wg@w3.org
Subject: Re: Report on preliminary decision on TLS 1.3 and client auth
Archived-At: <http://www.w3.org/mid/5603599F.8090303@treenet.co.nz>
Resent-From: ietf-http-wg@w3.org
X-Mailing-List: <ietf-http-wg@w3.org> archive/latest/30267
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>

On 24/09/2015 5:16 a.m., Martin Thomson wrote:
> 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.
> 


Option 1 re-introduces all the same problems NTLM and Negotiate have
over HTTP in the presence of proxy and gateway intermediaries. By using
single-connectin authorization over a multiplexed connection environment.

It would either need to be restricted to Proxy-Authorization or some
complex logic used to determine whether Authorization or
Proxy-Authorization was the proper response header.

Lets not go there.


Option 2 risks the same mess if the AUTH frame is defined end-to-end.
But a per-hop frame would work nicely as long as it is clear to server
implementers that intermediaries may be the source of the certificate.
Not some "user".


An option 3 might be to use a SETTINGS instead of dedicated AUTH frame.
So that the per-hop nature is made extra clear. That would also be more
backward compatible with older h2 implementations and work in with
clearing dynamic compression contexts at the same time as authenticating.


Amos