Прокси-сервер HTTP работает только в SwitchOmega - PullRequest
2 голосов
/ 11 июля 2019

Я провел довольно много поисков и практических испытаний, прежде чем задавать этот вопрос.

Длинная история:

Я нашел (не на английском языке) учебное пособие о том, как написать http-прокси с Node.js.

Пока что я знаю и пробовал:

  • HTTP-прокси может обрабатывать как HTTP-запрос, так и HTTPS-запрос, но по-разному.Он обрабатывает HTTP-запрос, читая запрос клиента, и делает новый запрос к цели и возвращает ответ клиенту.Что касается HTTPS-запроса, он имеет дело с HTTP Tunnel .

enter image description here

  • Поле SSL proxy в настройках прокси-сервера Firefox и поле Secure в настройках прокси-сервера IE (Windows):все о настройке туннеля HTTP.Если установлен SSL proxy или Secure proxy, когда браузер хочет подключиться к сайту https, он отправляет запрос CONNECT вместо обычного запроса.

Проблемы:

Запрос CONNECT представляет собой простой текст, поэтому брандмауэры могут видеть, к какому хосту я хочу подключиться, и прерывать соединение. Поэтому я подумал, могу ли я использовать https для общения с прокси-сервером с самого начала. Я прочитал все связанные посты, но не смог найти ответ, прямо говорящий об этом.И в некоторых ответах также говорится «Нет такого понятия, как прокси-сервер https» .

Но в руководстве говорится, что это можно сделать ( HTTPS между клиентом и прокси-сервером и ничего большеизменения ). Поэтому я попробую. Я изменил сервер на https с сертификатом моего сайта. Но в итоге он работает только с Proxy SwitchOmega в Chrome.работать в традиционных настройках, например, в настройках прокси-сервера Firefox или IE.

Настройка прокси SwitchOmega:

Scheme|Protocol|Server|Port
....  | https  | .... |...

Я должен выбрать здесь протокол https, если я запускаю сервер https.Мне нужно выбрать протокол http, если я запускаю http-сервер. Также я не знаю, что означает это поле protocol.


Подводя итог:

proxy server | Firefox proxy setting |work? | SwitchOmega setting |work?|
 http        | http + ssl setting    | yes  | protocol http       |yes  |
 https       | http + ssl setting    | no   | protocol https      |yes  |
 https       |      -                |  -   | protocal http       |no   |

Итак, мои вопросы:

  1. Можно ли подключиться к прокси-серверу https обычным способом (без расширения)? Если возможно, как?
  2. Почему я могу подключиться к прокси-серверу https через SwitchOmega ?
  3. Я думаю, что я строю прокси-сервер https.Но почему другие говорят: «Нет такого понятия, как прокси-сервер https?

Исходный код

Сервер https

var http = require('http');
var https = require('https');
var fs = require('fs');
var net = require('net');
var url = require('url');

console.log("qqqqq2");

function request(cReq, cRes) {
    console.log("request=====start");
    console.log(cReq.headers);
    console.log(cReq.url);
    console.log(cReq.method);
    console.log("request=====end");
    var u = url.parse(cReq.url);

    var options = {
        hostname : u.hostname, 
        port     : u.port || 80,
        path     : u.path,       
        method     : cReq.method,
        headers     : cReq.headers
    };

    var pReq = http.request(options, function(pRes) {
        cRes.writeHead(pRes.statusCode, pRes.headers);
        pRes.pipe(cRes);
    }).on('error', function(e) {
        cRes.end();
    });

    cReq.pipe(pReq);
    // console.log(cReq.headers);
    // console.log(cReq.method);
    // console.log(cReq.url);
    // console.log("^_^^_^^_^^_^^_^^_^");
    // cRes.writeHead('200');
    // cRes.end('hello world2222\n');
}

function connect(cReq, cSock) {
    console.log("connect=====start");
    console.log(cReq.headers);
    console.log(cReq.url);
    console.log(cReq.method);
    console.log("connect=====end");
    var u = url.parse('http://' + cReq.url);

    var pSock = net.connect(u.port, u.hostname, function() {
        cSock.write('HTTP/1.1 200 Connection Established\r\n\r\n');
        pSock.pipe(cSock);
    }).on('error', function(e) {
        cSock.end();
    });

    cSock.pipe(pSock);
}

var options = {
    key: fs.readFileSync('./privkey1.pem'),
    cert: fs.readFileSync('./fullchain1.pem')
};

https.createServer(options)
    .on('request', request)
    .on('connect', connect)
    .listen(9999, '0.0.0.0');

http-сервер

var http = require('http');
var net = require('net');
var url = require('url');

console.log('qqqqq2');

function request(cReq, cRes) {
    console.log("request=====start");
    console.log(cReq.headers);
    console.log(cReq.url);
    console.log(cReq.method);
    console.log("request=====end");

    var u = url.parse(cReq.url);

    var options = {
        hostname : u.hostname, 
        port     : u.port || 80,
        path     : u.path,       
        method     : cReq.method,
        headers     : cReq.headers
    };

    var pReq = http.request(options, function(pRes) {
        cRes.writeHead(pRes.statusCode, pRes.headers);
        pRes.pipe(cRes);
    }).on('error', function(e) {
        cRes.end();
    });

    cReq.pipe(pReq);
}

function connect(cReq, cSock) {
    console.log("connect=====start");
    console.log(cReq.headers);
    console.log(cReq.url);
    console.log(cReq.method);
    console.log("connect=====end");
    var u = url.parse('http://' + cReq.url);

    var pSock = net.connect(u.port, u.hostname, function() {
        cSock.write('HTTP/1.1 200 Connection Established\r\n\r\n');
        pSock.pipe(cSock);
    }).on('error', function(e) {
        cSock.end();
    });

    cSock.pipe(pSock);
}

http.createServer()
    .on('request', request)
    .on('connect', connect)
    .listen(9999, '0.0.0.0');

Тестовый сервер

Вы можете легко создать прокси-сервер http и протестировать его, но создать прокси-сервер https может быть неудобно, поскольку вам необходимо развернуть сертификатыТаким образом, предоставляется тестовый прокси-сервер https на основе приведенного выше кода.

Тестовый сервер удален, поскольку я нашел ответ.

1 Ответ

2 голосов
/ 11 июля 2019

Я нашел ответ в Security StackExchange. Можно ли подключиться к прокси с ssl (или иным зашифрованным) соединением?

С https://wiki.squid -cache.org / Возможности / HTTPS # Encrypted_browser-Squid_connection :

Зашифрованное соединение браузера-Squid

Несмотря на то, что усилия по разработке HTTPS были сосредоточены на сквозном взаимодействии, было бы также неплохо иметь возможность шифровать соединение между браузером и прокси (без создания туннеля CONNECT, который блокирует Squid от доступ и кеширование контента). Это позволит, например, безопасно использовать удаленные прокси, расположенные в потенциально враждебной сети.

Squid может принимать обычный прокси-трафик с использованием https_port таким же образом, как Squid делает это с помощью директивы http_port. К сожалению, популярные современные браузеры не разрешают настройку прокси-соединений с шифрованием TLS / SSL. В настоящее время имеются открытые отчеты об ошибках для большинства из этих браузеров, ожидающие появления поддержки. Если у вас есть какой-либо интерес, пожалуйста, помогите браузерным командам добиться этого.

...

Chrome

Браузер Chrome может подключаться к прокси-серверам через SSL-соединения, если он настроен на использование одного из них в файле PAC или в переключателе командной строки. Настройка графического интерфейса пользователя невозможна (пока) .

Firefox

Браузер Firefox 33.0 может подключаться к прокси через TLS-соединения, если настроен для использования одного из них в файле PAC. Конфигурация графического интерфейса представляется невозможной (пока) , хотя существует хак с настройкой для встраивания логики PAC.

Более подробную информацию о Chrome можно найти в http://dev.chromium.org/developers/design-documents/secure-web-proxy.


Чтобы ответить на вопросы:

  1. Могу ли я подключиться к прокси-серверу https обычным способом (без расширения)? Если возможно, то как?

Традиционный способ (например, поле Manual proxy configuration в Firefox) установить прокси-сервер http предназначен только для прокси-сервера HTTP. Прокси-сервер https можно установить только через файлы pac (например, поле Automatic proxy configuration URL в Firefox).

  1. Почему я могу подключиться к прокси-серверу https через SwitchOmega?

Расширение SwitchOmega фактически генерирует файл pac для использования Chrome, хотя как он взаимодействует с Chrome мне пока неизвестно.

Нажав кнопку Export PAC в SwitchOmega, я получаю файл, содержащий:

var FindProxyForURL = function(init, profiles) {
    return function(url, host) {
        "use strict";
        var result = init, scheme = url.substr(0, url.indexOf(":"));
        do {
            result = profiles[result];
            if (typeof result === "function") result = result(url, host, scheme);
        } while (typeof result !== "string" || result.charCodeAt(0) === 43);
        return result;
    };
}("+test", {
    "+test": function(url, host, scheme) {
        "use strict";
        if (/^127\.0\.0\.1$/.test(host) || /^::1$/.test(host) || /^localhost$/.test(host)) return "DIRECT";
        return "HTTPS myHttpsProxyServer.com:9999"; // This line matters
    }
});

С https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file:

HTTP host:port   
The specified proxy should be used   
HTTPS host:port 
The specified HTTPS proxy should be used  
  1. Я думаю, что я строю прокси-сервер https. Но почему другие говорят, что «прокси-сервера https не существует?

Да, я строю прокси-сервер https / прокси-сервер http через соединение tls. Те, кто говорит: «Нет такого понятия, как прокси-сервер https», ошибаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...