Изучение MITM -> SSL / TLS, сертификаты и возможности прокси - PullRequest
0 голосов
/ 08 сентября 2018

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

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

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

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

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

В моей голове должен произойти следующий поток:

  • Приложение iOS устанавливает соединение с приложением NodeJS, запрашивая сертификат сервера
  • NodeJS возвращает сертификат сервера ложно, говоря, что это фактический API, с которым приложение iOS пытается установить связь с
  • Приложение iOS проверяет свое хранилище CA и находит CA с шага 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.log(`Got request headers: ${JSON.stringify(req.headers, true, 2)}`);
      console.log(`Got request body: ${JSON.stringify(req.body, true, 2)}`);
      console.log(`Got request url: ${req.url}`);
    
      res.writeHead(200, { 'Content-type': 'text/plain' });
      res.write('yup');
      res.end();
    }).listen(3102);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...