On Mon, Mar 9, 2015 at 12:03 PM, Stuart Henderson <[email protected]> wrote: > On 2015-03-06, Felipe Scarel <[email protected]> wrote: >> Hello all, >> >> I'm currently using relayd as a forward proxy, selectively blocking >> HTTP and HTTPS requests while doing MitM inspection (as per >> http://www.reykfloeter.com/post/41814177050/relayd-ssl-interception). >> >> To allow certain domains to go through the SSL proxy, a simple 'pass >> quick url file' is sufficient, and works. However, this option does >> not prevent the MitM operation from relayd; the request is simply >> allowed through, and the original certificate is still 'patched' by >> the local CA. The configuration is shown below: >> >> http protocol httpsfilter { >> tcp { nodelay, sack, socket buffer 65536, backlog 1024 } >> return error >> >> match header set "Keep-Alive" value "$TIMEOUT" >> match header set "Connecton" value "close" >> >> pass quick url file "/etc/relayd.d/custom_whitelist" >> block url file "/etc/relayd.d/custom_blacklist" >> include "/etc/relayd.d/auto_blacklist" >> >> ssl ca key "/etc/ssl/private/ca.key" password "password" >> ssl ca cert "/etc/ssl/ca.crt" >> } >> >> relay httpsproxy { >> listen on 127.0.0.1 port 8443 ssl >> protocol httpsfilter >> forward with ssl to destination >> } >> >> This is a problem for a few sites (especially banking websites) that >> absolutely demand that the original certificate is not tampered in any >> way. I'm currently solving the problem with pf passthrough rules >> (allowing traffic directly to destination on a per-IP basis), which is >> far from an ideal solution as covered previously in >> http://openbsd.7691.n7.nabble.com/DNS-lookups-for-hostnames-in-PF-tables-td69546.html >> (scenarios like round robin DNS, CDNs providing content for multiple >> organizations, etc.) >> >> So, my question is: Is there a way to completely bypass SSL >> interception for a given URL file? >> >> Thanks in advance, >> fbscarel >> >> > > relayd doesn't have much information available at the point where it > decides whether to pick up the request. Specifically it just has IP > addresses. It can't tell the URL or even the domain name of the request > to be able to identify the destination. > > The domain name *is* available before a full SSL negotiation, at least > for connections from non-ancient browsers, but it requires opening at > least the client-side of the connection, and reading the name from the > ClientHello (this is the first packet sent by the client; server name is > provided unencrypted by SNI). > > It is technically possible to use this information as part of a decision > process, but it's much more complicated - you first need to identify > whether interception is wanted, and then either replay the ClientHello > (and afterwards forward packets directly to the server), or do the > cert generation/MITM as usual. > > relayd doesn't support this yet. > > Recent versions of Squid (3.5.x) do; feature is called "peek and > splice", but I haven't tested it with OpenBSD yet. (Squid's normal > SSL interception does work, at least in OpenBSD -current). Even then, > the most you will be able to do is look at the domain name; the URL > is not available until *after* the SSL handshake, at which point it > is too late to make the decision whether to spoof the cert or not. >
The domain name would do, I'll try testing with Squid. Thanks for the input, Stuart.

