Re: Client-Cert Header draft

Brian Campbell <> Mon, 20 April 2020 22:17 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id BE7893A1182 for <>; Mon, 20 Apr 2020 15:17:48 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -0.849
X-Spam-Status: No, score=-0.849 tagged_above=-999 required=5 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.25, HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: (amavisd-new); dkim=pass (2048-bit key)
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id ZQNsB4JDJ9ju for <>; Mon, 20 Apr 2020 15:17:45 -0700 (PDT)
Received: from ( []) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 4C4453A1178 for <>; Mon, 20 Apr 2020 15:17:45 -0700 (PDT)
Received: from lists by with local (Exim 4.92) (envelope-from <>) id 1jQegt-0003AR-6p for; Mon, 20 Apr 2020 22:14:59 +0000
Resent-Date: Mon, 20 Apr 2020 22:14:59 +0000
Resent-Message-Id: <>
Received: from ([]) by with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from <>) id 1jQegs-00039g-0l for; Mon, 20 Apr 2020 22:14:58 +0000
Received: from ([2a00:1450:4864:20::234]) by with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from <>) id 1jQego-00006R-Ta for; Mon, 20 Apr 2020 22:14:57 +0000
Received: by with SMTP id q19so11794609ljp.9 for <>; Mon, 20 Apr 2020 15:14:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=HcnJBdZhTsvh7s4OZJaCI4nlHBjvE3A+aSTItX6DfFg=; b=eEfqmvGspeKqaHgR11X7copGMMBYP/KDg/eJ+uwN0o9Nd/tCSWA3FfvV1zj8uyZTAM CfeKk0ItEGXs0Heqg0PuReCwwDyPvSzCUlicfZ3a9i8Y7OnY6pQtOfi34LZGm4jKag/P E4qY8z7dhR9wsJz+I6GSmBXkA8dU9zkVNpb/AnaY+BCIfr8mQBDbYKHFpdBX8AINiHNE YqxQHQoUPUfV1ODa9ZAkKV/4fJVsAzKbuvZttU7DtfHIi5TMUnfrLob9j3fDiNz0bHn6 lLLM3WrYfx0EhCiTTjfkC/7I0U7t53Csmxuak7uhoNpWybxDfOlnpkgM0uyIbNteAOgz y2Hg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=HcnJBdZhTsvh7s4OZJaCI4nlHBjvE3A+aSTItX6DfFg=; b=UIHwdvmnM9FWry6KkSMZUvmE2rptbi8ltwgVe6RWtHaQGMf9hAumVH+0OiuiXE6Dlp vC2T0StCrCU+8HcMKaSoUkS2qhTNjmYy1zKSCLMmR26bEVlEE9cTidDDgJEkflpX5ZxX ktizomyjKbbn1izOJoGsSLm7+LNLSSlta1mPIZB0OoTmuMFdtEl5QEGP5noKIjQtpp7v Rd0Na1IteLdVwlYCdinZ3bEIVZcUm5saG+5NFTfTcogUKHeZtYk7ObJapAFqTBZa+ljO 1bWc2cLwZSM5RfxgdAtfkOcJz0UIMXOsPRdrEW6Mb/xbmWntMOFYvQ+GWMnCeA7L/yC7 EpFg==
X-Gm-Message-State: AGi0PuZwtw/zgOZx3d5uSJvabsrv1CYFjEhlta5Hx/suE7OP51/Xq1jG n2U+6m+gjA/QX8MzHW3kjXQF/+uF9/Glg2it+hKaZS1QQ/AwW60GaaTvKSiOK7uqh0Um3pipdwm cqf4LYpWQq1+PEvoIi+HU
X-Google-Smtp-Source: APiQypLKn2cc3Ox4lAPK213Y3I21sJmrwpOKEv3pKT7A7JD6jDfgbKLVjdZSJgEm5L1d8vh7pes9DRvCFp3BfyB25dc=
X-Received: by 2002:a2e:860a:: with SMTP id a10mr11986494lji.20.1587420883040; Mon, 20 Apr 2020 15:14:43 -0700 (PDT)
MIME-Version: 1.0
References: <> <> <> <>
In-Reply-To: <>
From: Brian Campbell <>
Date: Mon, 20 Apr 2020 16:14:16 -0600
Message-ID: <>
To: David Benjamin <>
Cc: Lucas Pardue <>, Mike Bishop <>, HTTP Working Group <>
Content-Type: multipart/alternative; boundary="000000000000d7d4e405a3c039d2"
Received-SPF: pass client-ip=2a00:1450:4864:20::234;;
X-W3C-Hub-Spam-Status: No, score=-4.1
X-W3C-Hub-Spam-Report: BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, W3C_AA=-1, W3C_WL=-1
X-W3C-Scan-Sig: 1jQego-00006R-Ta 8b9cbd1779c161b01c122574d7b46b2c
Subject: Re: Client-Cert Header draft
Archived-At: <>
X-Mailing-List: <> archive/latest/37525
Precedence: list
List-Id: <>
List-Help: <>
List-Post: <>
List-Unsubscribe: <>

Very true that connection-level authentication doesn't always play well
with HTTP. But the intended scope of this draft isn't trying to address
that. It's only trying to bring some commonality to what's typically done
in practice now. I would think an HTTP 403 or even application level
controls on content is what's happening now regardless. The approach in
this draft does mean that authorization errors aren't going to be conveyed
back to the client at the connection level but, as you point out, doing so
is differently odd. So much so that I don't think the draft needs to do
anything to facilitate it.

On Fri, Apr 17, 2020 at 3:12 PM David Benjamin <>

> This draft isn't sufficient to properly move the access checks out of the
> TLS terminator. More care is needed here. There is a "distaste for client
> certificates from some quarters" for a reason.
> In general, connection-level authentication does not play well with HTTP.
> Server identities are generally public, so there is no complex policy
> around when to release them. Client identities are generally user
> identities and thus sensitive, with local policies, usually involving user
> prompts and selections. That interacts badly with client certificates. It
> just barely works today, but moving individual components without thought
> as to the overall picture will break it.
> In particular, client HTTP stacks necessarily cache client certificate
> decisions. Without caching, the user is potentially prompted on every HTTP
> request, but a user session involves many HTTP requests. Additionally, the
> decision is inherently cached by way of connection reuse and session
> resumption optimizations. Short of forcing a full TLS handshake on every
> HTTP request, clients could not prompt on every HTTP request if they wanted
> to. That means the HTTP stacks need an explicit signal, or no amount of
> reloads will allow the user to select a different identity.
> Currently, the only signal for a bad client certificate is a fatal TLS
> alert. If the access checks are moved, bad client certificate signals will
> come out of the origin server, which cannot generate those. This draft may
> need to define a suitable HTTP 4xx code to correspond with TLS client
> certificate authentication. Of course, existing clients won't know to
> process that, but perhaps the origin server should translate to a TLS
> alert? But then the response is never delivered, which may be differently
> odd. Then one must consider the interaction with HTTP/2, which multiplexes
> streams and potentially multiple origins together.
> There may be further problems here that I haven't thought through. The
> suggestion of this enabling finer-grained access control worries me.
> On Fri, Apr 17, 2020 at 3:29 PM Lucas Pardue <>
> wrote:
>> +1 to everything Mike said
>> On Fri, 17 Apr 2020, 20:24 Mike Bishop, <> wrote:
>>> Despite the distaste for client certificates from some quarters, they
>>> are still both used and useful.  I’m certainly interested in seeing this
>>> progress.
>>> In today’s situation, the intermediary checks that the cert matches the
>>> rules it has been given to authenticate clients, and only forwards the
>>> requests from valid clients.  Arguably, the origin is offloading less trust
>>> in this draft’s model – the intermediary is responsible for validating that
>>> the client possesses the claimed certificate, but might leave the origin to
>>> decide what scope of access the certificate actually grants.  That allows
>>> finer-grained access control, but also allows greater ability to send
>>> requests back to the origin.  It also opens the door for intermediaries
>>> which don’t support this header to accidentally forward requests containing
>>> it.  Requiring intermediaries to drop it doesn’t get you much, since only
>>> those intermediaries aware of the spec will comply by dropping the header.
>>> To help address these, I’d like to see this mix in something that the
>>> intermediary holds and the client doesn’t, such as an exporter from its TLS
>>> connection to the server.
>>> But all that is refinement – the core concept here is beneficial, and
>>> I’d like to see more engagement here.
>>> *From:* Brian Campbell <>
>>> *Sent:* Wednesday, April 15, 2020 5:01 PM
>>> *To:* HTTP Working Group <>
>>> *Subject:* Client-Cert Header draft
>>> Hello HTTP Working Group,
>>> I've somewhat inadvertently found myself working on this draft
>>> which aspires to define a "Client-Cert" HTTP header field that allows a TLS
>>> terminating reverse proxy to convey information about the client
>>> certificate of a mutually-authenticated TLS connection to an origin server
>>> in a common and predictable manner.
>>> I presented the concept
>>> <>
>>> at the recent virtual IETF 107 secdispatch meeting
>>> <>
>>> and the outcome from that was basically that there seems to be some
>>> interest in pursuing the work and the suggestion that the conversation be
>>> taken to the HTTPbis WG (and also keep TLS WG involved - presumably if the
>>> work progresses). And that's what brings me here. I also hope to get a
>>> little bit of time at one of the upcoming virtual interims to
>>> present/discuss the draft.
>>> Thanks,
>>> Brian
>>> *CONFIDENTIALITY NOTICE: This email may contain confidential and
>>> privileged material for the sole use of the intended recipient(s). Any
>>> review, use, distribution or disclosure by others is strictly prohibited..
>>> If you have received this communication in error, please notify the sender
>>> immediately by e-mail and delete the message and any file attachments from
>>> your computer. Thank you.*

_CONFIDENTIALITY NOTICE: This email may contain confidential and privileged 
material for the sole use of the intended recipient(s). Any review, use, 
distribution or disclosure by others is strictly prohibited.  If you have 
received this communication in error, please notify the sender immediately 
by e-mail and delete the message and any file attachments from your 
computer. Thank you._