Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用http节点代理创建转发https代理_Node.js_Http Proxy_Node Http Proxy - Fatal编程技术网

Node.js 使用http节点代理创建转发https代理

Node.js 使用http节点代理创建转发https代理,node.js,http-proxy,node-http-proxy,Node.js,Http Proxy,Node Http Proxy,我正在尝试创建一个能够处理HTTPS网站的转发代理。我试图观察和修改不同网站的流量。这是我的代码,它适用于http站点,但不适用于https站点 httpProxy.createServer(function(req, res, next) { //custom logic next(); }, function(req, res) { var proxy = new httpProxy.RoutingProxy(); var buffer = httpProxy.buf

我正在尝试创建一个能够处理HTTPS网站的转发代理。我试图观察和修改不同网站的流量。这是我的代码,它适用于http站点,但不适用于https站点

httpProxy.createServer(function(req, res, next) {
   //custom logic
   next();
}, function(req, res) {
   var proxy = new httpProxy.RoutingProxy();
   var buffer = httpProxy.buffer(req);
   var urlObj = url.parse(req.url);
   req.headers.host = urlObj.host;
   req.url = urlObj.path;
   console.log(urlObj.protocol);
  setTimeout(function() {
     proxy.proxyRequest(req, res, {
        host: urlObj.host,
        port: 80,
        buffer: buffer,
    }
   )}, 5000);

}).listen(9000, function() {
console.log("Waiting for requests...");
});

谢谢你们的帮助,伙计们

在处理https流量时,必须指定https选项。下面是我在代理设置中所做的操作

var fs = require('fs'),
    httpProxy = require('http-proxy');

var proxyTable = {};

proxyTable['domain.com'] = 'localhost:3001';
proxyTable['domain.com/path'] = 'localhost:3002';
proxyTable['sub.domain.com'] = 'localhost:3003';

var httpOptions = {
    router: proxyTable
};

var httpsOptions = {
    router: proxyTable,
    https: {
        passphrase: 'xxxxxxx',
        key: fs.readFileSync('/path/to/key'),
        ca: fs.readFileSync('/path/to/ca'),
        cert: fs.readFileSync('/path/to/crt')}
};

httpProxy.createServer(httpOptions).listen(80);
httpProxy.createServer(httpsOptions).listen(443);
https的文档也在他们的github页面上


在处理https流量时,必须指定https选项。下面是我在代理设置中所做的操作

var fs = require('fs'),
    httpProxy = require('http-proxy');

var proxyTable = {};

proxyTable['domain.com'] = 'localhost:3001';
proxyTable['domain.com/path'] = 'localhost:3002';
proxyTable['sub.domain.com'] = 'localhost:3003';

var httpOptions = {
    router: proxyTable
};

var httpsOptions = {
    router: proxyTable,
    https: {
        passphrase: 'xxxxxxx',
        key: fs.readFileSync('/path/to/key'),
        ca: fs.readFileSync('/path/to/ca'),
        cert: fs.readFileSync('/path/to/crt')}
};

httpProxy.createServer(httpOptions).listen(80);
httpProxy.createServer(httpsOptions).listen(443);
https的文档也在他们的github页面上

如果指定opts.key和opts.cert,将使用tls将连接设置为安全模式。如果要制作https路由器,请执行此操作


如果指定opts.key和opts.cert,将使用tls将连接设置为安全模式。如果您想制作https路由器,请执行此操作。

如果您只是在做转发代理,则必须考虑一些事情

对于HTTPS请求,常规请求不会在代理上触发-相反,您将看到HTTP连接。 下面是您需要处理的序列流

连接事件从浏览器发送到HTTPS部分中指定的代理。您将在这里看到这一点:注意,这是通过HTTP模块实现的,而不是HTTPS连接。 您可以创建到请求域或映射域的新套接字连接。[srvSocket] 您将使用一个200 您将通过CONNECT事件接收的缓冲区写入srvSocket,然后将两个套接字连接在一起srvSocket.pipesocket; 插座。管道插座; 由于您试图在本地欺骗所请求的域,因此还需要一些适当的东西

您需要生成根CA。 您需要将此证书作为受信任的机构导入操作系统 您将使用此证书为您尝试访问的域创建新的密钥/证书文件 映射的主机需要使用步骤3中为映射的每个域生成的相应密钥/证书文件进行响应。
如果你只是在做一个转发代理,有几件事你必须考虑

对于HTTPS请求,常规请求不会在代理上触发-相反,您将看到HTTP连接。 下面是您需要处理的序列流

连接事件从浏览器发送到HTTPS部分中指定的代理。您将在这里看到这一点:注意,这是通过HTTP模块实现的,而不是HTTPS连接。 您可以创建到请求域或映射域的新套接字连接。[srvSocket] 您将使用一个200 您将通过CONNECT事件接收的缓冲区写入srvSocket,然后将两个套接字连接在一起srvSocket.pipesocket; 插座。管道插座; 由于您试图在本地欺骗所请求的域,因此还需要一些适当的东西

您需要生成根CA。 您需要将此证书作为受信任的机构导入操作系统 您将使用此证书为您尝试访问的域创建新的密钥/证书文件 映射的主机需要使用步骤3中为映射的每个域生成的相应密钥/证书文件进行响应。
我们可以有一个如下所示的中间件

请求=请求请求请求; app.usefunction req,res,next{ 佩佩雷斯请求; };


参见示例

我们可以使用如下中间件

请求=请求请求请求; app.usefunction req,res,next{ 佩佩雷斯请求; };


参见示例

基本上,http代理npm下面是一些节点专门使用的网络库和TLS。即使我的Apache能够通过在我的浏览器中访问自签名证书(不带代理)将我与之连接起来:

https://localhost:8002    
您需要建立证书颁发机构以通过节点中的“无法验证叶签名”错误,我使用了SSLCACertificateFile选项。然后,您将在链中获得自签名证书。这导致一些Google结果表明npm放弃了自签名证书,但我很确定这与节点无关

最终会有一些人指示您在https代理中使用process.env.NODE\u TLS\u REJECT\u UNAUTHORIZED或rejectUnauthorized。如果深入研究http代理源,您会发现它接受一个代理选项。使用以下命令:

/**
 * Module dependencies
 */

// basic includes
express     = require('express');
fs          = require('fs');
http        = require('http');
https       = require('https');
httpProxy   = require('http-proxy');
require('child_process').spawn(__dirname+'/../../../dependencies/apache/bin/httpd.exe',['-f',__dirname+'/../../../dependencies/apache/conf/httpd-payments.conf']); 

var app     = module.exports = express();
app.set('port', process.env.PORT || 8001); // we sometimes change the port

// creates an output object for this particular request
//app.use(express.cookieParser(''));
//app.use(express.bodyParser());
//app.use(express.methodOverride());

proxy   = httpProxy.createProxyServer();
proxy.on('error', function (err, req, res) {
    console.log(err);
    res.send(500,err);
    res.end();
});

app.all('*',function(req,res,next) {
    var options = {
      hostname: '127.0.0.1',
      port: 8002,
      rejectUnauthorized: false,
      key: fs.readFileSync(__dirname+"/../../../deployment/server.key.pem"),
      cert: fs.readFileSync(__dirname+"/../../../deployment/server.crt.pem")
    };
    agent = new https.Agent(options);
    try {
        proxy.web(req,res, {
            target: "https://localhost:8002",
            proxyTimeout: 30,
            agent: agent
        });
    } catch(e) {
        // 500 error
        res.send(500,e);
    }
})

/** 
 * Start Server
 */

var options = {
  key: fs.readFileSync(__dirname+"/../../../deployment/server.key.pem"),
  cert: fs.readFileSync(__dirname+"/../../../deployment/server.crt.pem")
};
server  = https.createServer(options,app).listen(app.get('port'), function () {
  console.log('Running payments server on port ' + app.get('port'));
});

基本上,http代理npm下面是一些节点专门使用的网络库和TLS。即使我的Apache能够通过在我的浏览器中访问自签名证书(不带代理)将我与之连接起来:

https://localhost:8002    
您需要建立证书颁发机构以通过节点中的“无法验证叶签名”错误,我使用了SSLCACertificateFile选项。然后,您将在链中获得自签名证书。这导致一些谷歌结果表明npm放弃了自签名证书 是的,但我很确定这与节点无关

最终会有一些人指示您在https代理中使用process.env.NODE\u TLS\u REJECT\u UNAUTHORIZED或rejectUnauthorized。如果深入研究http代理源,您会发现它接受一个代理选项。使用以下命令:

/**
 * Module dependencies
 */

// basic includes
express     = require('express');
fs          = require('fs');
http        = require('http');
https       = require('https');
httpProxy   = require('http-proxy');
require('child_process').spawn(__dirname+'/../../../dependencies/apache/bin/httpd.exe',['-f',__dirname+'/../../../dependencies/apache/conf/httpd-payments.conf']); 

var app     = module.exports = express();
app.set('port', process.env.PORT || 8001); // we sometimes change the port

// creates an output object for this particular request
//app.use(express.cookieParser(''));
//app.use(express.bodyParser());
//app.use(express.methodOverride());

proxy   = httpProxy.createProxyServer();
proxy.on('error', function (err, req, res) {
    console.log(err);
    res.send(500,err);
    res.end();
});

app.all('*',function(req,res,next) {
    var options = {
      hostname: '127.0.0.1',
      port: 8002,
      rejectUnauthorized: false,
      key: fs.readFileSync(__dirname+"/../../../deployment/server.key.pem"),
      cert: fs.readFileSync(__dirname+"/../../../deployment/server.crt.pem")
    };
    agent = new https.Agent(options);
    try {
        proxy.web(req,res, {
            target: "https://localhost:8002",
            proxyTimeout: 30,
            agent: agent
        });
    } catch(e) {
        // 500 error
        res.send(500,e);
    }
})

/** 
 * Start Server
 */

var options = {
  key: fs.readFileSync(__dirname+"/../../../deployment/server.key.pem"),
  cert: fs.readFileSync(__dirname+"/../../../deployment/server.crt.pem")
};
server  = https.createServer(options,app).listen(app.get('port'), function () {
  console.log('Running payments server on port ' + app.get('port'));
});

因此,我在本地主机上运行代理,还需要代理https站点。这是否意味着我需要为本地主机创建一个自签名证书?无论代理哪个SSL站点,都需要一个证书。在我的示例中,我为domain.com提供了一个通配符,所有代理项都可以作为http和https使用。如果我想代理Facebook的响应,修改响应,然后将其发送给用户,这是否意味着我需要Facebook的证书?我想对用户可能浏览到的所有https站点执行此操作..为了澄清,我正在本地主机上运行节点代理,并通过系统设置手动将代理设置为localhost和我的端口,将所有请求和响应代理到我的localhost服务器..为了清楚您的场景。。。您正在设置本地代理,并修改主机文件,以便internet请求通过您的本地连接返回到预期目标?在这种情况下,是的,您需要一个为Facebook.com签名的证书。自签名证书将加密流量,但Facebook无法解密后续请求。浏览器还会弹出有关证书的警告/错误页面。所有这些都是为了防止你试图做的事情,这是一个中间人的攻击。所以我在我的本地主机上运行代理,也需要代理HTTPS站点。这是否意味着我需要为我的本地主机创建一个自我签名的证书?你需要一个证书来支持你所代理的SSL站点。在我的示例中,我为domain.com提供了一个通配符,所有代理项都可以作为http和https使用。如果我想代理Facebook的响应,修改响应,然后将其发送给用户,这是否意味着我需要Facebook的证书?我想对用户可能浏览到的所有https站点执行此操作..为了澄清,我正在本地主机上运行节点代理,并通过系统设置手动将代理设置为localhost和我的端口,将所有请求和响应代理到我的localhost服务器..为了清楚您的场景。。。您正在设置本地代理,并修改主机文件,以便internet请求通过您的本地连接返回到预期目标?在这种情况下,是的,您需要一个为Facebook.com签名的证书。自签名证书将加密流量,但Facebook无法解密后续请求。浏览器还会弹出有关证书的警告/错误页面。所有这些都是为了防止你试图做的事情,这是一个中间人的攻击。