- From: Yoav Nir <synp71@live.com>
- Date: Thu, 28 Nov 2013 09:51:49 +0200
- To: HTTP Group <ietf-http-wg@w3.org>
- Message-ID: <BLU0-SMTP386F65DD5AB7407022A4051B1EE0@phx.gbl>
Hi,
After receiving some feedback, I'm revising this proposal by removing
the CDN and CONNECT.
Assume there's a user, alice@example.com, who uses her computer at work
to download something from https://download.adobe.com. Her company hasa
next-generation firewall called sslproxy.example.com. Alice is aware of
this proxy, but has been told that the proxy is only used for detecting
malware and blocking time wasters like Farmville and OKBridge.
Specifically the IT people and her bosses do not have access to the
plaintext. This is not enforced in any technical way - but Alice trusts
the IT department to keep their word.
Another thing to note is that there are actually two components to the
mandatory proxy. There's the proxy, which deals in HTTP(S), and then
there's the firewall which prevents E2E communications. They may be
co-located, but then don't have to be.
Step #1 - Where the browser detects the proxy
=============================================
[If everything is pre-configured, this step may be skipped, but that
makes moving to another network where that particular proxy is not
present more difficult.]
The browser resolves download.adobe.com, and opens a connection to
download.adobe.com port 443. The firewall blocks this. I'm not sure it
it's preferable to block this with some ICMP or with a new TLS alert (so
the firewall completes the 3-way TCP handshake, receives the ClientHello
and only then sends the error), but I'm tending towards the latter. The
new TLS alert is called "mandatory proxy" and contains the URL of that
proxy: https://sslproxy.example.com:443
Step #2 - Connecting to the proxy
=================================
The browser consults local policy about whether such a proxy might be
acceptable, and if so, opens a new TLS connection to the proxy and
verifies the certificate. This allows adding some clever UX that shows
the user what device is on-path, and also allows pre-configuring the
trusted proxy based on name.
I realize that this is where security will be made or broken. It's
tempting to solve this with some message like this:
+-----------------------------------------------------------------------+
| Warning: an HTTPS proxy was detected on the path to |
| download.adobe.com. The proxy is identified as _sslproxy.example.com_ |
| |
| This proxy will be able to read all traffic, including any passwords, |
| credit card numbers, and personal information. Do not proceed unless |
| you trust this proxy. |
| |
| +-----------------------+ +--------------------------+ +--------+ |
| | Trust this proxy once | | Trust this proxy forever | | Cancel | |
| +-----------------------+ +--------------------------+ +--------+ |
+-----------------------------------------------------------------------+
In its favor, it's more clear-cut than certificate warnings that are
always vague because most certificate errors are misconfiguration rather
than a real attack. OTOH that "Trust this proxy forever" button is
really tempting, because it makes the Internet work, as opposed to it
being blocked. You can send the users off to the browser settings with a
complex task to perform. This will both give the user time to think if
it's really OK, and will make wifi providers for places like restaurants
and airports think twice before deploying this kind of thing.
Step #3 - Connecting to the real server
=======================================
The browser sends requests through the proxy (in HTTP/1 notation: "GET
https://download.adobe.com"). The proxy tries to connects and does
whatever verification it is configured to do. We might need some HTTP
error status codes to indicate SSL failure.
Step #4 - Path information
==========================
As there may be multiple proxies on path, requests and responses go
through the series of nodes. We should note that things like flow
control are hop-by-hop, so the SETTINGS frame is not forwarded, but is
hop-by-hop. We would also like to have some information for both client
and server. Here's my suggestion for this:
ClientInfo structure:
- certificate chain sent by the client (if any)
- ciphersuite used
- this)proxy certificate chain.
- subject (or SKID) of received server (or next proxy) certificate
ServerInfo structure:
- certificate chain sent by the server (or another proxy)
- ciphersuite used
- subject (or SKID) or (this) proxy certificate
Each proxy sends a ClientInfo structure to the server. This could be
done as a POST to a /.well-known URI or as a new special frame. I prefer
the latter, but I don't know how well that will sit with several proxies
trying to push the same resource to the server.
Each proxy also sends a ServerInfo structure to the client. Again, this
could be a pushed resource or a special frame. Same concern applies.
Step #5 - Conclusion
=====================
At the end of this, both client and server can construct the chain of
certificate chains and the ciphersuite used in each leg of the trip.
This allows each of them to make policy decisions about whether the
certificates on the path are all trusted, and whether the ciphersuites
are good enough. It also allows the user to show some nifty UI that
shows the series of proxies on the way.
An advantage for proxy vendors is that this allows the removal of two
limitations that MitM proxies currently have:
1. The missing EV indications - by sending the actual certificate chain
to the user, the browser could verify that an EV indication is
appropriate (subject to browser policy). It would be strange to have
both an indication of extended validation and an indication of an
HTTPS proxy, but sometimes weird things make sense.
2. Missing support for client authentication - by sending the client
certificate from the client-side proxy to the server, the server can
(at an application level) assign a user identity to the session. It
should be noted that this requires the server to trust the proxy for
this to work. It might be enough that the client trusts the proxy,
but it might not be.
TLS is not changed by this proposal except for the alert, but HTTPS is.
I'd love to hear more comments on this. If there's interest I could
write it up in a draft, but having been burned twice, I'd like to know
there's interest first.
Yoav
Attachments
- application/pkcs7-signature attachment: S/MIME Cryptographic Signature
Received on Thursday, 28 November 2013 07:52:19 UTC