Итак, захотелось мне попробовать сделать так, чтобы любой сайт запрошенный по HTTPS возвращался в виде HTTP. Смысл действия - улучшение работы с кэшем + возможность перекидывать трафик прокси, которые не умеют обрабатывать HTTPS, вроде Privoxy (для резки рекламы) и Ziproxy (для просмотра сайтов через мобильный инет).
Классический SSL Strip уже не годится, ибо не слишком прост в применении и сбивается HSTS. Продвинутый SSL Strip c DNS Spoof чересчур изощренный.
Поэтому я воспользовался дебаг-проксей. Их вообще три штуки:
1. Burp Suite. В нем функция SSL Strip включается тремя галками, но сам он очень-очень Java. Бесплатная версия не умеет сохранять проекты.
2. Fiddler. Не пробовал, но теоретически функция есть в виде AutoResponse. Тоже очень-очень Java, зато халявный.
3. Charles Proxy. Функция называется Map Remote. Не Java, нет на линукс, и не халявный.
В принципе, работает и даже хорошо. Но что у Burp, что у Charles есть одна и та же беда - для работы SSL Strip им нужно всегда цепляться к внешнему хосту через SSL, а если оного SSL нет, то все, хана. Второй косяк - если запрашивать https версию сайта, то они оба выдают https версию сайта. Т.е. надо в самом браузере запрашивать http, или же делать rewrite запроса, только тогда это сработает.
Начал делать редирект https -> http. Если делать его силами самого прокси, то он применяет правило и к декодированному, и к исходящему трафику. В итоге вместо схемы:
Браузер запрашивает
https://yandex.ru, прокси возвращает ему 302
http://yandex.ru, а к серверу делает запрос
https://yandex.ruполучаем зацикливание:
Браузер запрашивает
https://yandex.ru, прокси применяет правило и запрашивает у сервера
http://yandex.ru, а сервер отвечает "не-а, я только по HTTPS". Повторять пока кому-нибудь не надоест. Обычно надоедает браузеру.
Решений два. Первый - в Firefox использовать плагин Redirector и в нем сделать регэксп нужного вида. Работает замечательно, но - на чистые HTTP сайты попасть нельзя, ибо дебаг-прокси дает отлуп "У него нет SSL!".
Второй - создавать цепочку из двух дебаг-прокси, первый из которых выполняет преобразование URL, а второй - устанавливает соединение с внешним миром, и https-трафик отделять и кидать на эту цепочку. Такое колдунство работает нормально.
Начинаем пользоваться. Google работает нормально, Yandex работает нормально, SourceForge работает нормально... GitHub и Facebook распадаются на запчасти. Смотрим дебагерром - Firefox жалуется что в CORS запросах домены нынче какие-то не те, а поэтому загружать он ничего не будет. Злобствуем, закидываем в дебаг-прокси условие, чтоб добавлял в возвращенные хедеры
Access-Control-Allow-Origin *
Access-Control-Allow-Methods POST,GET
Проверяем - теперь все работает.
А, для Chrome схема практически неприменима - у него список HSTS для целой кучи доменов захардкожен.
В общем - как-то все печально :(