]> Sergey Matveev's repositories - tofuproxy.git/blob - doc/index.texi
gemini:// support
[tofuproxy.git] / doc / index.texi
1 \input texinfo
2 @documentencoding UTF-8
3 @settitle tofuproxy
4
5 @copying
6 Copyright @copyright{} 2021 @email{stargrave@@stargrave.org, Sergey Matveev}
7 @end copying
8
9 @node Top
10 @top tofuproxy
11
12 @itemize
13
14 @item I am tired that various HTTPS clients (like browsers and feed
15 aggregators) use various TLS libraries with different features. NSS,
16 GnuTLS, OpenSSL... All of them sucks, comparing to Go's @code{crypto/tls}.
17
18 @item I tired that everyone provides very limited certificates trust
19 management capabilities, like either certificate or SPKI
20 @url{https://en.wikipedia.org/wiki/Certificate_pinning, pinning} with
21 @url{https://en.wikipedia.org/wiki/Trust_on_first_use, TOFU}. Even my
22 beloved @url{https://en.wikipedia.org/wiki/Xombrero, Xombrero} browser
23 still pins only the whole certificate, but its public key would be much
24 more sufficient and convenient to work with.
25
26 @item I am tired that many clients provides very few information about
27 certificates and connections at all.
28
29 @item I hate that hardly anyone can control (no automatic silent
30 transparent following) HTTP redirections. Although Firefox had proper
31 extensions for that.
32
33 @item I am sick of tiny control on URLs. The best you can is to use some
34 kind of @url{https://en.wikipedia.org/wiki/Privoxy, Privoxy}, but it is
35 not friendly with TLS connections, obviously.
36
37 @item Xombrero sometimes has problems with HTTP-based authorization.
38
39 @item Hardly anyone does
40 @url{https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities, DANE}
41 checks.
42
43 @item And there is insanity of downloading fonts.
44 Why the hell people just do not send PostScript documents instead!?
45
46 @item And wonderful @url{http://jpegxl.info/, JPEG XL} image format is
47 not supported by most browsers. Even pretty old
48 @url{https://developers.google.com/speed/webp, WebP}, that has highest
49 compression ratio for lossless screenshots, is not supported everywhere.
50 @url{https://aomediacodec.github.io/av1-avif/, AVIF} could be useful too.
51
52 @item None of web browsers support ability to view web archives
53 (@url{https://en.wikipedia.org/wiki/Web_ARChive, WARC}s). And most of
54 WARC-related software is written on Python, that nowadays is close to be
55 impossible to install and use with all its broken dependencies system.
56
57 @item And yet another piece of software is needed for browsing the
58 @url{https://en.wikipedia.org/wiki/Gemini_(protocol), geminispace}?
59 Too many bicycles already!
60
61 @end itemize
62
63 That is why I wrote @command{tofuproxy} -- pure Go HTTP proxy, MitMing
64 all HTTPS connections on the fly. It is written for my personal needs
65 exclusively, so many features are just directly hard-coded, instead of
66 creating some kind of complex configuration framework.
67
68 @itemize
69
70 @item
71 @strong{Effective} responses proxying, without storing them in the memory first.
72
73 @item
74 TLS connection between client and @command{tofuproxy} has the
75 @strong{proper hostname} set in ephemeral on-the-fly generated
76 certificate.
77
78 @item
79 @code{HEAD} method is forbidden.
80
81 @item
82 @code{www.reddit.com} is redirected to @code{old.reddit.com}.
83
84 @item
85 @url{https://habr.com/ru/all/, Хабр}'s resolution reduced images are
86 redirected to their full size variants.
87
88 @item
89 Various @strong{spying} domains (advertisement, tracking counters) are denied.
90
91 @item
92 Web @strong{fonts} downloads are forbidden.
93
94 @item
95 @strong{Permanent} HTTP redirects are replaced with HTML page with the link.
96
97 @item
98 @strong{Temporary} HTTP redirects are replaced with HTML too, if it is
99 neither @url{https://newsboat.org/, Newsboat} nor image paths.
100
101 @item
102 @strong{WebP} images (if it is not Xombrero), @strong{JPEG XL} and
103 @strong{AVIF} are transcoded to PNG.
104
105 @item
106 Default Go's checks are applied to all certificates. If they pass, then
107 certificate chain is saved on the disk (@strong{TOFU}). Future
108 connections are compared against it, warning you about SPKI change
109 (@strong{SPKI pinning}) and waiting for your decision either to accept
110 new chain (possibly once per session), or reject it.
111
112 @item
113 Even when native Go's checks are failed, you can still make a decision
114 to forcefully trust the domain.
115
116 @item
117 @strong{HTTP-based authorization} requests are intercepted and
118 user/password input dialogue is shown. It automatically loads
119 @strong{initial form} values from @strong{@file{.netrc}}.
120
121 @item
122 TLS @strong{client certificates} supported: separate dialogue window for
123 certificate choice.
124
125 @item
126 Optional @strong{DANE-EE} check is also made for each domain you visit.
127
128 @item
129 TLS @strong{session resumption} and @strong{keep-alives} are also supported.
130
131 @item
132 And Go itself tries also to act as a @url{https://http2.github.io/, HTTP/2}
133 client too.
134
135 @item
136 Ability to load and browse @url{https://en.wikipedia.org/wiki/Web_ARChive,
137 WARC} archives, possibly @command{gzip}/@command{zstd} compressed.
138
139 @item
140 Ability to browse geminispace, by transparent conversion to HTMLs with
141 URL rewriting.
142
143 @end itemize
144
145 @include usage.texi