From f62068a89b1c2bc079491913dfb44689e9a018a0 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sun, 5 Sep 2021 17:03:46 +0300 Subject: [PATCH] Small documentation --- README | 2 + doc/dialog.webp | Bin 0 -> 23184 bytes doc/index.texi | 158 ++++++++++++++++++++++++++++++++++++++++++++++++ doc/logs.webp | Bin 0 -> 33824 bytes doc/style.css | 9 +++ doc/www.do | 16 +++++ mkfifos.sh | 6 ++ verify.go | 12 ++-- 8 files changed, 199 insertions(+), 4 deletions(-) create mode 100644 README create mode 100644 doc/dialog.webp create mode 100644 doc/index.texi create mode 100644 doc/logs.webp create mode 100644 doc/style.css create mode 100644 doc/www.do create mode 100755 mkfifos.sh diff --git a/README b/README new file mode 100644 index 0000000..c62d94d --- /dev/null +++ b/README @@ -0,0 +1,2 @@ +tofuproxy -- HTTP proxy, MitMing all HTTPS connections, taking all +TLS-related certificates trust management. diff --git a/doc/dialog.webp b/doc/dialog.webp new file mode 100644 index 0000000000000000000000000000000000000000..bff32689fc2ca043d51cc596a295e999f82b5273 GIT binary patch literal 23184 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 literal 0 HcmV?d00001 diff --git a/doc/index.texi b/doc/index.texi new file mode 100644 index 0000000..1989a45 --- /dev/null +++ b/doc/index.texi @@ -0,0 +1,158 @@ +\input texinfo +@documentencoding UTF-8 +@settitle tofuproxy + +@copying +Copyright @copyright{} 2021 @email{stargrave@@stargrave.org, Sergey Matveev} +@end copying + +@node Top +@top tofuproxy + +@image{logs,,,Example logs,.webp} + +@itemize + +@item I am tired that various HTTPS clients (like browsers and feed +aggregators) use various TLS libraries with different features. NSS, +GnuTLS, OpenSSL... All of them sucks, comparing to Go's @code{crypto/tls}. + +@item I am tired that everyone provides very limited certificates trust +management capabilities, like either certificate or SPKI +@url{https://en.wikipedia.org/wiki/Certificate_pinning, pinning} with +@url{https://en.wikipedia.org/wiki/Trust_on_first_use, TOFU}. Even my +beloved @url{https://en.wikipedia.org/wiki/Xombrero, Xombrero} browser +still pins only the whole certificate, but its public key would be much +more sufficient and convenient to work with. + +@item I am tired that many clients provides very few information about +certificates and connections at all. + +@item I am tired that hardly anyone can control (no automatic silent +transparent following) HTTP redirections. Although Firefox had proper +extensions for that. + +@item I am tired that you have got small control on URLs. The best you +can is to use some kind of @url{https://en.wikipedia.org/wiki/Privoxy, +Privoxy}, but it is not friendly with TLS connections, obviously. + +@item Hardly anyone does +@url{https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities, DANE} +checks. + +@end itemize + +That is why I wrote @command{tofuproxy} -- pure Go HTTP proxy, MitMing +all HTTPS connections on the fly. It is written for my personal needs +exclusively, so many features are just directly hard-coded, instead of +creating some kind of complex configuration framework. + +@itemize + +@item Effective responses proxying, without storing them in the memory first. + +@item TLS connection between client and @command{tofuproxy} has the + proper hostname set in ephemeral on-the-fly generated certificate. + +@item @code{HEAD} method is forbidden, because of damned Xombrero loving + making it so much. Can live without it. + +@item @code{www.reddit.com} is redirected to @code{old.reddit.com}. + +@item Various spying domains (advertisement, tracking counters) are + responded with 404 error. + +@item All HTTP redirects are replaced with HTML page with the link. + However temporary redirects are passed as is for @code{newsboat} + User-Agent. + +@item Default Go's checks are applied to all certificates. If they pass, + then certificate chain is saved on the disk. Future connections are + compared against it, warning you about SPKI change and waiting for + your decision either to accept new chain (possibly once per + session), or reject it. + +@item Even when native Go's checks are failed, you can still make a + decision to forcefully trust the domain. + +@item Optionally DANE-EE check is also made for each domain you visit. + +@end itemize + +@image{dialog,,,Example dialog,.webp} + +@node Usage +@unnumbered Usage + +@itemize + +@item Build @command{tofuproxy}: + +@example +$ git clone git://git.stargrave.org/tofuproxy.git +$ cd tofuproxy +$ go build +@end example + +@item +Generate CA-capable certificate for the proxy, that will issue ephemeral +certificate to proxied domains: + +@example +$ redo cert.pem +@end example + +@item +Create directory with output FIFOs and directory for stored certificate chains: + +@example +$ ./mkfifos.sh +$ mkdir certs +@end example + +@item +Run @command{tofuproxy} itself. By default it will bind to +@code{[::1]:8080}, use @code{[::1]:53} DNS server for DANE requests +(set to an empty string to disable DANE lookups): + +@example +$ ./tofuproxy +main.go:316: listening: [::1]:8080 +@end example + +@item Trust your newly generated CA: + +@example +# cat /path/to/tofuproxy/cert.pem >> /etc/ssl/cert.pem +@end example + +@item Point you HTTP/HTTPS clients to @code{http://localhost:8080}. + +@item Watch logs with @url{https://github.com/halturin/multitail, multitail}: + +@example +$ ./multitail.sh +@end example + +@end itemize + +When you encounter something requiring your attention and decision, you +will be shown Tk-dialog through the @command{wish} invocation. GnuTLS'es +@command{certtool} is used for certificate information printing. + +@node TODO +@unnumbered TODO + +What I am planning possibly to do? Just brainstorming: + +@itemize + +@item JPEG-XL/WebP transparent converter to JPEG/PNG. + +@item HTTP authorization dialog. + +@item TLS client certificates usage capability. + +@item Web fonts download restriction. + +@end itemize diff --git a/doc/logs.webp b/doc/logs.webp new file mode 100644 index 0000000000000000000000000000000000000000..0d3bba6ce9ed01036eaaf7426f6082919d84e79b GIT binary patch literal 33824 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