У меня есть приложение для iOS, которое взаимодействует с API через https. Я успешно перехватил эти сообщения в виде открытого текста в прокси-сервере Charles, установив корневой сертификат прокси-сервера Charles на свой телефон и установив мой компьютер в качестве прокси.
Сейчас я пытаюсь понять, как все это работает, поэтому я пытаюсь воспроизвести функциональность прокси-сервера Чарльза в NodeJS.
Шаги, которые я предпринял:
- Создание корневого ЦС и установка в iOS
- Создание сертификата сервера, соответствующего сертификату сервера API, подписанного СА с шага 1
- Настройка сервера NodeJS с сертификатом сервера
Теперь, если я установлю свой компьютер в качестве прокси-сервера в IOS, зайду в приложение iOS, тогда я не должен получать запросы на свой сервер NodeJS? На самом деле ничего не происходит. Сервер NodeJS не получает никаких запросов, и приложение iOS не отображает информацию (потому что, конечно, не может получить доступ к API).
В моей голове должен произойти следующий поток:
- Приложение iOS устанавливает соединение с приложением NodeJS, запрашивая сертификат сервера
- NodeJS возвращает сертификат сервера ложно, говоря, что это фактический API, с которым приложение iOS пытается установить связь с
- Приложение iOS проверяет свое хранилище CA и находит CA с шага 1 и ложно проверяет, что сервер правильный
- Приложение iOS должно теперь иметь возможность общаться с сервером NodeJS, а сервер NodeJS должен иметь возможность перехватывать сообщения в виде открытого текста
Мой вопрос: Что мне не хватает? Почему не работает?
Я включил код ниже. Обратите внимание, что я еще не начал проксирование к «настоящему» API, я просто пытаюсь получать сообщения в NodeJS.
Ниже приведен код, относящийся к вышеуказанным шагам:
Создание корневого центра сертификации и сертификата сервера
# CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 1024 -out ca.crt
Создание сертификата сервера, соответствующего сертификату сервера 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
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);