I'm reading Jarmoc's Black Hat presentation on SSL/TLS Interception Proxies and Transitive Trust. I have a few questions on some of the key management practices.
In the paper, Jarmoc states:
To act as the server for the client-side SSL session, an interception proxy must have access to the private key that corresponds to the certificate it’s presenting. Because the server endpoint’s private key is unavailable, the interception proxy must generate a new certificate and key pair to use for this session.
Jarmoc does not explain the reasoning behind his statement "the interception proxy must generate a new certificate and key pair to use for the session." And he does not define a "session" per se.
Question: according to Jarmoc's description below, is it fair to read a "session" is the [encrypted] point-to-point connection between the user and the proxy (and conversely, the proxy and the real server)?
... interception proxies insert themselves in the flow of traffic and terminate the client’s request. The interception proxy makes a second request on behalf of the client to the server. This behavior causes what was an end-to-end session to instead be two separate, but related, point-to-point sessions. The goal is to allow access to the plain-text session contents while transferring between the two encrypted sessions.
Or should I read the "session" to have the end-to-end meaning?
Can "multiple connections from a single user" (user-to-proxy flow) and "connections from multiple users" (proxy-to-server flow) be multiplexed into a single session?
Question: Why must an interception proxy generate a new key pair and certificate for each session?
Here are the use cases I was running through, and I don't see the benefit of distinct keys and certificates:
two distinct users each visit example.com.
a single user visits example.com, closes the browser, and then visits example.com again.
Supplying the same certificate and the same public key for example.com is the way things work without an interception proxy. How does a distinct certificate and public key for each visitor and visit improve the landscape?
I've experienced the latter, and I can tell you there's nothing "stealthy" about the practice (especially when the web page has lots of external links). CertPatrol threw so many warning dialogs that the browser became unusable.
Question: what is wrong with certifying a single private key (for say, 7 or 30 days), and then issuing all server certificates using the single key?
Generating keys on the fly is expensive and can lead to a DoS under load. Since the practice can destroy availability, I don't see the benefit.
It does not matter if there's 1 private key or 10,000 private keys. A host compromise/key compromise at the proxy means key egress. It does not matter if there's 1 of them or 10,000 of them. Again, I don't see the benefit.
If anything more than a 1:1 relationship is bad, then why is the practice used in intermediate signing certificates and subordinate CAs?
Question: does Jarmoc mean that each network connection (source IP address) should receive its own private key used for all certificates? (Here "session" means the interaction between the user and the proxy).
If the proxy is going to re-use private keys per-user, then why can't a private key be re-used for all users?
How does the proxy handle NAT'd connections, where users are pooled into a single forward facing IP address?
(If there's something wrong with re-use, then intermediate signing certificates probably violate whatever rule is cited because the intermediate's signing key certifies a number of end-entity certificates.)
Question: what are the detriments to private key re-use across sessions?
Does private key re-use break tools like tools like HTTPS Everywhere and CertPatrol; and security diversification strategies like public key pinning and perspectives?
My concern here is a naïve implementation of public key pinning within an organization, where the implementation trusts only the {public key}, and not the {host, public key} pair. But the naïve implementation may not break in practice as long as the private key at the proxy remains secret. Its hard to say without a concrete implementation.