Изучение MITM -> SSL / TLS, сертификаты и возможности прокси

У меня есть приложение для iOS, которое обменивается данными с API через https. Я успешно перехватил эти сообщения в виде открытого текста в прокси Charles, установив корневой сертификат прокси Charles на свой телефон и настроив свой компьютер в качестве прокси.

Сейчас я пытаюсь понять, как все это работает, поэтому я пытаюсь воспроизвести функциональность прокси Charles в NodeJS.

Шаги, которые я предпринял:

  1. Сгенерируйте корневой ЦС и установите в iOS
  2. Сгенерируйте сертификат сервера, соответствующий сертификату сервера API, подписанный ЦС из шага 1.
  3. Настройте сервер NodeJS с сертификатом сервера

Теперь, если я установил свой компьютер в качестве прокси в IOS, захожу в приложение iOS, тогда разве я не должен получать запросы на свой сервер NodeJS? На самом деле ничего не происходит. Сервер NodeJS не получает никаких запросов, а приложение iOS не может отображать информацию (потому что, конечно, оно не может получить доступ к API).

В моей голове должен возникнуть такой поток:

  • Приложение iOS устанавливает соединение с приложением NodeJS, запрашивая сертификат сервера
  • NodeJS возвращает сертификат сервера, ложно говоря, что это фактический API, с которым приложение iOS пытается связаться.
  • Приложение iOS проверяет свое хранилище ЦС и находит ЦС из шага 1 и ложно проверяет правильность сервера.
  • Приложение iOS теперь должно иметь возможность связываться с сервером NodeJS, а сервер NodeJS должен иметь возможность перехватывать сообщения в виде открытого текста.

У меня вопрос: Что мне не хватает? Почему не работает?

Я добавил код ниже. Обратите внимание, что я еще не начал проксировать «настоящий» API, я просто пытаюсь получать сообщения в NodeJS.

Ниже приведен код, связанный с вышеуказанными шагами:

  1. Создание корневого центра сертификации и сертификата сервера

    # CA
    openssl genrsa -out ca.key 4096
    openssl req -x509 -new -nodes -key ca.key -sha256 -days 1024 -out ca.crt
    
  2. Сгенерируйте сертификат сервера, соответствующий сертификату сервера API, подписанный ЦС из шага 1.

    # Server
    openssl genrsa -out server.key 2048
    openssl req -new -sha256 -key server.key -subj "/C=US/ST=CA/O=MyOrg Inc./CN=external.api.com" -out server.csr
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 500 -sha256
    
  3. NodeJS сервер

    const fs = require('fs');
    const https = require('https');
    
    const options = {
      key: fs.readFileSync('./server.key'),
      cert: fs.readFileSync('./server.crt'),
    };
    
    https.createServer(options, (req, res) => {
      console.info(`Got request headers: ${JSON.stringify(req.headers, true, 2)}`);
      console.info(`Got request body: ${JSON.stringify(req.body, true, 2)}`);
      console.info(`Got request url: ${req.url}`);
    
      res.writeHead(200, { 'Content-type': 'text/plain' });
      res.write('yup');
      res.end();
    }).listen(3102);
    

Почему вы выбрали для прослушивания порт 3102? Клиент подключается к вашей службе через этот порт? Протестируйте из другой системы, используя curl или wget.

John Hanley 09.09.2018 00:44

Просто случайный порт. Да, iOS настроена на прокси-сервер для компьютера через этот порт. Я могу подключиться к серверу с любого другого клиента - браузера, curl, wget. Итак, сервер запущен и работает, но iOS, похоже, не работает правильно.

Jackesa 09.09.2018 10:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
319
0

Другие вопросы по теме