Решений для этого практически не существует, и документация в лучшем случае недостаточна для поддержки обоих на одном сервере.Хитрость заключается в том, чтобы понять, что конфигурации клиентских прокси могут отправлять запросы https на прокси-сервер http.Это верно для Firefox, если вы указываете HTTP-прокси, а затем отмечаете «одинаково для всех протоколов».
Вы можете обрабатывать https-соединения, отправленные на HTTP-сервер, прослушивая событие «connect».Обратите внимание, что у вас не будет доступа к объекту ответа на событие подключения, только сокет и заголовок.Данные, отправленные через этот сокет, останутся зашифрованными для вас в качестве прокси-сервера.
В этом решении вам не нужно создавать собственные сертификаты, и в результате у вас не будет конфликтов сертификатов.Трафик просто проксируется, не перехватывается и перезаписывается различными сертификатами.
// Install npm dependencies first
// npm init
// npm install --save url@0.10.3
// npm install --save http-proxy@1.11.1
var httpProxy = require("http-proxy");
var http = require("http");
var url = require("url");
var net = require('net');
var server = http.createServer(function (req, res) {
var urlObj = url.parse(req.url);
var target = urlObj.protocol + "//" + urlObj.host;
console.log("Proxy HTTP request for:", target);
var proxy = httpProxy.createProxyServer({});
proxy.on("error", function (err, req, res) {
console.log("proxy error", err);
res.end();
});
proxy.web(req, res, {target: target});
}).listen(8080); //this is the port your clients will connect to
var regex_hostport = /^([^:]+)(:([0-9]+))?$/;
var getHostPortFromString = function (hostString, defaultPort) {
var host = hostString;
var port = defaultPort;
var result = regex_hostport.exec(hostString);
if (result != null) {
host = result[1];
if (result[2] != null) {
port = result[3];
}
}
return ( [host, port] );
};
server.addListener('connect', function (req, socket, bodyhead) {
var hostPort = getHostPortFromString(req.url, 443);
var hostDomain = hostPort[0];
var port = parseInt(hostPort[1]);
console.log("Proxying HTTPS request for:", hostDomain, port);
var proxySocket = new net.Socket();
proxySocket.connect(port, hostDomain, function () {
proxySocket.write(bodyhead);
socket.write("HTTP/" + req.httpVersion + " 200 Connection established\r\n\r\n");
}
);
proxySocket.on('data', function (chunk) {
socket.write(chunk);
});
proxySocket.on('end', function () {
socket.end();
});
proxySocket.on('error', function () {
socket.write("HTTP/" + req.httpVersion + " 500 Connection error\r\n\r\n");
socket.end();
});
socket.on('data', function (chunk) {
proxySocket.write(chunk);
});
socket.on('end', function () {
proxySocket.end();
});
socket.on('error', function () {
proxySocket.end();
});
});