NeiroNext
@NeiroNext

Как реализовать NodeJS HTTP прокси сервер с перехватом https трафика?

Добрый день!
У меня возникла идея для контроля и анализа собственного трафика, хочу кеширование настроить по собственному желанию, для чего использую прокси, с HTTP соединениями все работает отлично, но HTTPS не могу правильно обработать, либо через сокет могу отловить их и просто перенаправить зашифрованные данные, либо, когда создаю HTTPS сервер, он пингуется и по прямому адресу запросы видит, но как только устанавливаю его в качестве прокси, запросы к нему уже не идут.

Хочу сделать так, чтобы клиент отправлял HTTPS запрос на прокси сервер, он его принимал, создавал свой собственный HTTPS запрос и при получении ответа создавал снова новый HTTPS запрос к клиенту и отдавал ему данные, тоесть был посредником, который создает с обеих сторон зашифрованное соединение. Но сейчас получалось лишь перекидывать уже зашифрованные данные, тоесть клиент, настолько я могу понять, не создает рукопожатие с прокси сервером, а передает через него данные. Мучаюсь уже неделю, но сделать так, чтобы прокси был именно посредником, где были бы открытые данные, я никак не могу.

Сертификаты создавал, устанавливал в браузер, по прямому адресу к прокси серверу, как писал выше, запросы видны, но при указании сервера как прокси сервера, в логах сервера пусто, запрос просто не поступает, тоесть клиент не хочет с ним устанавливать HTTP.

Вот код HTTP прокси сервера. Я специально не использовал pipe потоки, это для теста, также убрал обработку ошибок, чтобы не скидывать сюда много кода.

const fs = require('fs');
const https = require('https');
const http = require("http");


const server = http.createServer((req, res) => {
    let fullUrl = req.url;

    console.log(fullUrl);

    const proxyRequest = http.request(fullUrl, (proxyResponse) => {
        res.writeHead(proxyResponse.statusCode, proxyResponse.headers);

        let data = Buffer.from("");

        proxyResponse.on("data", (chunk) => {
            data = Buffer.concat([data, chunk]);
        });

        proxyResponse.on("end", () => {
            res.end(data);
        });
    });

    req.on("data", (chunk) => {
        proxyRequest.write(chunk);
    });

    req.on("end", () => {
        proxyRequest.end();
    });
});

server.listen(8080, () => {
    console.log('HTTP прокси сервер запущен на порту: ' + server.address().port);
});


Если заменить http на https и добавить сертификаты, то при переходе по адресу сервера он запросы видит, но когда использовать его как прокси, он уже их не обрабатывает в такой конфигурации. Может обрабатывать лишь в конфигурации сокетного сервера, но тогда я вижу уже зашифрованные данные, а мне нужно, чтобы клиент с сервером https устанавливал, чтобы я их расшифрованными мог видеть.
Помогите с этим, пожалуйста.

Мне любой вариант сойдет, главное чтобы для прокси не приходилось никакую программу устанавливать, а так, могу и плагин для браузера скачать, сертификаты установить, только бы это заработало.
  • Вопрос задан
  • 234 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы