Я пытался создать прозрачный снифер http / https для моего устройства разработки под Android 6.0. Я делаю это, используя собственный DNS для разрешения всего на моем прокси-хосте. Прокси-хост имел самозаверяющий CA, который я установил на устройстве как пользовательский CA. Прокси-сервер использует HTTP-заголовок Host и HTTPS SNI для определения цели вместо HTTP CONNECT и будет использовать поддельные сертификаты, выданные под самозаверяющим CA для HTTPS.
Мне показалось, что хотя большинство запросов работает нормальнонекоторые запросы HTTPS не выполнены. Я проверил документ Google и обнаружил, что Android теперь будет игнорировать пользовательский CA по умолчанию (да, я знаю, как использовать манифест конфигурации сети, чтобы приложение могло использовать пользовательский CA, это не главное). Но это не совсем имеет смысл.
Точнее говоря, эти HTTPS приходят из веб-просмотра, в котором работает User-Agent, такой как "Dalvik / 2.1.0 (....)", но те, которые приходят из okhttpу которого User-Agent как «okhttp / 3.10.0» не удалось (я нашел это с помощью fddler). Я полагаю, что встроенный в браузер шоуд дает пользователю возможность доверять самозаверяющему ЦС, поэтому он принимает пользовательский ЦС, а вот нет. Так что это все еще можно понять.
Но чего я не понимаю, так это того, что когда я использую fiddler с расшифрованным HTTPS и его самозаверяющим CA, эти okhttp-запросы тоже работают нормально. Это меня очень беспокоит. Единственное различие между этими двумя сценариями заключается в том, что для использования fiddler мне необходимо настроить соединение устройства WIFI для использования прокси. Таким образом, я предполагаю, что базовая библиотека знает, что она проксируется. Я также думаю, что HTTP CONNECT имеет место на этом. Что я хочу подтвердить, так это то, что настройки прокси заставляют okhttp принимать CA пользователя, что немного подрывает безопасность CA. И я также хотел бы знать, есть ли обходной путь для моего решения, чтобы позволить okhttp использовать мой CA.
Спасибо, что обратили на это внимание.