Re: [TLS] Version negotiation, take two

"Short, Todd" <> Thu, 08 September 2016 18:27 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 9804D12B124 for <>; Thu, 8 Sep 2016 11:27:54 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -2.219
X-Spam-Status: No, score=-2.219 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, HTTPS_HTTP_MISMATCH=1.989, RCVD_IN_DNSWL_LOW=-0.7, RP_MATCHES_RCVD=-1.508, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: (amavisd-new); dkim=pass (1024-bit key)
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id SVo2RrUkZBV0 for <>; Thu, 8 Sep 2016 11:27:51 -0700 (PDT)
Received: from ( []) by (Postfix) with ESMTP id 9C73212B1F3 for <>; Thu, 8 Sep 2016 11:27:51 -0700 (PDT)
Received: from (localhost.localdomain []) by postfix.imss70 (Postfix) with ESMTP id 1F527200030; Thu, 8 Sep 2016 18:27:51 +0000 (GMT)
Received: from ( []) by (Postfix) with ESMTP id 08C6B20000A; Thu, 8 Sep 2016 18:27:51 +0000 (GMT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=a1; t=1473359271; bh=qcVN6OC80kWpC+rRyK4U3grw9DluCXFdmueZEajjK/A=; l=19233; h=From:To:CC:Date:References:In-Reply-To:From; b=CHnA8r2VfKlwaHqEkLGWuKnta8rlAuIEK6/X6CJOcuCFIQgo+o9/fVTLb6rmQ8n1F atJL6g8VqzKuGmFsfDUxW3Wozx9G15u2QlIp3mMsc5XRToJMrCkmN4UFMa7n5MtFZr Bv6W5TwnST+hqa2Ek3z5/Vv4TcVSG1DCPbtz15QY=
Received: from ( []) by (Postfix) with ESMTP id CEAF11E08C; Thu, 8 Sep 2016 18:27:50 +0000 (GMT)
Received: from ( by ( with Microsoft SMTP Server (TLS) id 15.0.1178.4; Thu, 8 Sep 2016 14:27:50 -0400
Received: from ([]) by ([]) with mapi id 15.00.1178.000; Thu, 8 Sep 2016 14:27:50 -0400
From: "Short, Todd" <>
To: David Benjamin <>
Thread-Topic: [TLS] Version negotiation, take two
Thread-Index: AQHSCetPoWAS2bwZUk+lZbEdB45rTaBwLKAA
Date: Thu, 8 Sep 2016 18:27:49 +0000
Message-ID: <>
References: <>
In-Reply-To: <>
Accept-Language: en-US
Content-Language: en-US
x-ms-exchange-messagesentrepresentingtype: 1
x-ms-exchange-transport-fromentityheader: Hosted
x-originating-ip: []
Content-Type: multipart/alternative; boundary="_000_C8322F1D47BD4B25A135632FECB05792akamaicom_"
MIME-Version: 1.0
Archived-At: <>
Cc: "" <>
Subject: Re: [TLS] Version negotiation, take two
X-Mailman-Version: 2.1.17
Precedence: list
List-Id: "This is the mailing list for the Transport Layer Security working group of the IETF." <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Thu, 08 Sep 2016 18:27:55 -0000

We already have a useless field in the record header; the record_version is fixed to { 3, 1 }; and this is not a coincidence.
I think it would be better to maintain a 1.2-compatible version negotiation for backwards compatibility, and have a more robust and expressive version negotiation option. Now would be the time to do it.
-Todd Short
// "One if by land, two if by sea, three if by the Internet."

On Sep 8, 2016, at 12:04 PM, David Benjamin <<>> wrote:

Hi folks,

I’d like to revisit the question of version negotiation.

EKR wrote up some text for moving version negotiation to an extension:<>

I would like us to adopt this proposal.

In Berlin, this really got framed as a pragmatic question: the current version negotiation has a lot of intolerance and so let’s work around that. So, understandably, this seemed like a “let’s adopt a hack forever” proposal. I think that framing is wrong. The intolerance situation is serious, but I think there’s also a strong argument that the current scheme isn’t very good.

The current scheme is very simple. The client advertises a maximum version and the server selects based on that. This is the only piece of TLS negotiation which works this way. Elsewhere (extensions, cipher suites, signature algorithms), one side offers a list and the other side picks out of it. I think it’s clear now that strategy is more robust: every time we’ve bumped version numbers, we’ve had intolerance problems and this time is no exception (see below). By contrast, we regularly introduce new cipher suites, extensions, etc., and while we do see the occasional failure, they are much rarer and typically within the level of breakage that clients can tolerate and deal with by reaching out to affected servers. Moreover, lists lend themselves to future-proofing via draft-davidben-tls-grease-00 in a way the current scheme does not.

An additional benefit is lists make it much easier to roll out prototype/draft versions. Currently, we are using a hack where the client offers {3, 4} but also includes a draft version number in an extension. This does work, but requires servers process that extension in perpetuity or at least until all draft version clients go away.  With a list, it’s trivial to offer a draft version by just including it. This is the strategy HTTP/2 used (via ALPN) and it worked well.

Despite all of the above, it probably wouldn’t be worth fixing version negotiation in 1.3 except for intolerance. Unfortunately, this fourth time, it’s the same story as before. A probe of Alexa top million sites with BoringSSL’s TLS 1.3 code (the Go version), shows 1.63% of TLS-capable hosts reject a TLS 1.3 ClientHello. Note these are top sites and traffic is top-heavy, so we can expect much higher usage-weighted numbers. Qualys SSL Pulse reports 3.6%:<>

(Ignore the drop in the graph. We’ve long fixed the ClientHello record-layer at {3, 1}. TLS 1.3 only codified existing practice here.) If instead we use a TLS 1.3 ClientHello with version TLS 1.2, the breakage drops to 0.017%. (Some of this is an NSS signature algorithms bug, fixed last year, which we hope to clear by deploying RSA-PSS in browsers early. The rest appears to be noise from transient errors which crop up in large tests.)

These numbers are *far* too high for clients to accept as damage, which means that they (at least browsers) will be forced to do fallback. This represents a security risk (cf. POODLE) as well as hides serious interop problems. The situation is even worse for non-browser clients, which may be unable to deploy at all (Ubuntu 12.04, despite shipping an OpenSSL release with TLS 1.2, had to disable it on the client.<> )

The major arguments against this change seem to be:

1. It’s inelegant to have two mechanisms.
2. We should fix broken servers

The first is true, but as with other changes, EKR’s PR replaces the 1.2 mechanism with one for 1.3, so we’ll just have one going forward. The second would be nice, but as a practical matter, I spend a lot of time trying to get those servers fixed and it doesn’t work very well here. Better is simply to move to a situation where once those servers upgrade they will be correctly behaving forever (instead of just handling 1.3 correctly and breaking with 1.4). This change does that.


TLS mailing list<>