У меня есть приложение для iOS, которое обменивается данными с API через https. Я успешно перехватил эти сообщения в виде открытого текста в прокси Charles, установив корневой сертификат прокси Charles на свой телефон и настроив свой компьютер в качестве прокси.
Сейчас я пытаюсь понять, как все это работает, поэтому я пытаюсь воспроизвести функциональность прокси Charles в NodeJS.
Шаги, которые я предпринял:
Теперь, если я установил свой компьютер в качестве прокси в IOS, захожу в приложение iOS, тогда разве я не должен получать запросы на свой сервер NodeJS? На самом деле ничего не происходит. Сервер NodeJS не получает никаких запросов, а приложение iOS не может отображать информацию (потому что, конечно, оно не может получить доступ к API).
В моей голове должен возникнуть такой поток:
У меня вопрос: Что мне не хватает? Почему не работает?
Я добавил код ниже. Обратите внимание, что я еще не начал проксировать «настоящий» 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.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);
Просто случайный порт. Да, iOS настроена на прокси-сервер для компьютера через этот порт. Я могу подключиться к серверу с любого другого клиента - браузера, curl, wget. Итак, сервер запущен и работает, но iOS, похоже, не работает правильно.
Почему вы выбрали для прослушивания порт 3102? Клиент подключается к вашей службе через этот порт? Протестируйте из другой системы, используя
curl
илиwget
.