Я провел довольно много поисков и практических испытаний, прежде чем задавать этот вопрос.
Длинная история:
Я нашел (не на английском языке) учебное пособие о том, как написать http-прокси с Node.js.
Пока что я знаю и пробовал:
- HTTP-прокси может обрабатывать как HTTP-запрос, так и HTTPS-запрос, но по-разному.Он обрабатывает HTTP-запрос, читая запрос клиента, и делает новый запрос к цели и возвращает ответ клиенту.Что касается HTTPS-запроса, он имеет дело с HTTP Tunnel .
- Поле
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 |
Итак, мои вопросы:
- Можно ли подключиться к прокси-серверу https обычным способом (без расширения)? Если возможно, как?
- Почему я могу подключиться к прокси-серверу https через SwitchOmega ?
- Я думаю, что я строю прокси-сервер 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 на основе приведенного выше кода.
Тестовый сервер удален, поскольку я нашел ответ.