[about] [index] [prev] [2021-09-04 23:40:40+03:00] [432f7635faed298751cef04f0102deee68ea942f]
Topics: [crypto][go][web]

tofuproxy

http://www.git.stargrave.org/?p=tofuproxy.git;a=tree
Уже не первый год у меня была идея сделать прокси-сервер который бы
полностью брал на себя всё что касается TLS-а как минимум.

Вот какой-нибудь Xombrero броузер, на старом WebKit движке, как броузер
может быть неплох, но вот TLS в нём уныл. В других возможно даже TLS 1.3
поддерживается, но нету certificate pinning-а, нету TOFU и прочих
технологий, присутствующих в Xombrero.

В Xombrero/WebKit мне не нравится что я не вижу и не управляю
redirect-ом -- он просто автоматически происходит, тогда как в Firefox
был плагин показывающий промежуточную HTML страницу. Например именно так
я сегодня увидел что lite.duckduckgo.com уже не работает и он делается
redirect на html.duckduckgo.com.

В этом же Xombrero были какие-то проблемы с HTTP авторизацией на не
стандартных портах. Плюс мне хочется автоматически перебрасывать с
www.reddit.com на old.reddit.com. Плюс запретить качать всякие
Web-шрифты (это я правкой WebKit исходного кода реализовал). Плюс делать
certificate pinning не на сам сертификат, а на его SPKI. А ещё бы DANE
использовать. Плюс блокировать всякие рекламные домены (Google Analytics
и прочее).

В Lynx вообще с TLS всё плачевно с детализацией информации и никакого
pinning конечно же.

Править древний движок -- нет ни желания, ни времени. Зато Go-шную
crypto/tls я излазил вдоль и поперёк когда-то. Плюс имею и ГОСТ TLS 1.3
поддержку в ней. И в ней есть все современные быстрые протоколы (*25519,
ChaCha20-Poly1305). Прокси на Go мог бы решить все проблемы. Вот только
к нему нужен какой-то интерактивный интерфейс или какой-то способ
взаимодействия: ведь увидев не сходящийся pinning, он же должен будет
меня спросить что делать.

Не раз я начинал его делать, но почему-то каждый раз довольно быстро
забивал, ибо не просто было почему то. Сегодня без причины снова
вспомнил о таком прокси, задумался в чём же могут быть подвохи, не
придумал, за несколько часов написал. Я искренне не понимаю почему у
меня прежде с ним возникали трудности. Обожаю Go!

Это HTTP прокси демон. HTTPS соединения он терминирует на себе, выступаю
в роли клиента для HTTPS серверов. На лету генерирует сертификаты для
хостов, выступая в качестве TLS-сервера, с поддержкой DANE.

* Запрещаю HEAD методы (405 возвращаю). Потому что Xombrero упорно любит
  слать и GET и HEAD -- достал
* Если хост www.reddit.com -- возвращаю redirect на old.reddit.com
* Если хост является поддоменом hardcoded списка шпионящих доменов
  (google-analytics.com, fbcdn., mc.yandex.ru и прочие), то 404
* Ошибки на уровне Go библиотеки возвращаются в виде текстовой страницы
* Если ответом является redirect, то он преобразуется в HTML страницу с
  ссылкой, чтобы явно это перенаправление было видно. Если это temporary
  redirect, а User-Agent это newsboat, то HTML страница не отдаётся.
  Многие RSS/Atom имеют официальные URL-ы которые всегда делают
  перенаправление
* В противном случае ответ проксируется как есть, с честным копированием
  тела из клиента в ответ сервера
* Для TLS на диск сохраняются присланные сертификаты для данного домена
  (TOFU). Если штатные проверки Go не прошли или SPKI сохранённого
  сертификата отличается (SPKI pinning), то показывается xmessage окно с
  Accept/Once/Reject кнопками и выводом certtool сертификатов "наших" и
  "ихних". То есть, можно разрешить и совершенно штатно не валидные
  сертификаты (например выданные для других доменов)
* Accept обновляет сертификаты на диске. Если SPKI pinning отрабатывает,
  но сертификат был обновлён, то оно автоматически обновляется
* Кроме того, можно делать DANE-EE проверку напротив TLSA записи из DNS.
  Результат DANE показывается в xmessage тоже

В разные FIFO файлы пишутся TSV сообщения с TAI64N префиксом о:
запросах, ошибках, успешных ответах, "других" ответах (redirect, 404),
заменённых на HTML redirect-ах, событиях TLS подключений (плюс версия
TLS, ciphersuite, SPKI хэш сертификата), события связанные с
сертификатами (DANE, обновления, reject-ы). multitail скриптом я собираю
их все воедино и разукрашиваю.

Единственное что не делал ещё: перехват HTTP авторизации, видимо тоже
через показ xmessage-like окон. Я уже на самом деле забыл где именно с
ней у меня возникали проблемы. Сейчас и Lynx и Xombrero и Newsboat
работают через этот прокси -- всё тип топ.

[leave comment]