2011-11-17 20 views
17

मैं node.js प्रॉक्सी सर्वर एप्लिकेशन विकसित कर रहा हूं और मैं इसे HTTP और HTTPS(SSL) प्रोटोकॉल (सर्वर के रूप में) का समर्थन करना चाहता हूं।node.js में HTTPS प्रॉक्सी सर्वर

मैं वर्तमान में node-http-proxy इस तरह उपयोग कर रहा हूँ:

const httpProxy = require('http-proxy'), 
     http = require('http'); 

var server = httpProxy.createServer(9000, 'localhost', function(req, res, proxy) { 
    console.log(req.url); 
    proxy.proxyRequest(req, res); 
}); 

http.createServer(function(req, res) { 
    res.end('hello!'); 
}).listen(9000); 

server.listen(8000); 

मैं सेटअप अपने ब्राउज़र localhost:8000 पर HTTP प्रॉक्सी का उपयोग करने और यह काम करता है। मैं HTTPS अनुरोधों को पकड़ना चाहता हूं (यानी मेरा ब्राउज़र localhost:8000HTTPS प्रॉक्सी के रूप में उपयोग करने के लिए सेटअप करें और मेरे आवेदन में अनुरोधों को पकड़ें)। क्या आप कृपया मेरी मदद कर सकते हैं मैं यह कैसे कर सकता हूं?

पुनश्च:

अगर मैं httpProxy सर्वर वस्तु की upgrade घटना की सदस्यता मैं अनुरोध प्राप्त कर सकते हैं, लेकिन मैं अनुरोध अग्रेषित करने के लिए कैसे जानते हैं और ग्राहक के जवाब न भेजें:

server.on('upgrade', function(req, socket, head) { 
    console.log(req.url); 
    // I don't know how to forward the request and send the response to client 
}); 

किसी भी मदद की सराहना की जाएगी।

उत्तर

2

नोड-http-प्रॉक्सी दस्तावेज़ों में इसके उदाहरण शामिल हैं। https://github.com/nodejitsu/node-http-proxy पर "HTTPS से HTTPS तक प्रॉक्सी करना" की तलाश करें कॉन्फ़िगरेशन प्रक्रिया प्रत्येक ब्राउज़र में थोड़ा अलग है। कुछ के पास सभी प्रोटोकॉल के लिए आपकी प्रॉक्सी सेटिंग्स का उपयोग करने का विकल्प होता है; कुछ आपको अलग-अलग SSL प्रॉक्सी को कॉन्फ़िगर करने की आवश्यकता है।

7

मैं http-proxy मॉड्यूल की सहायता से एक HTTP/HTTPS प्रॉक्सी बनाया है: https://gist.github.com/ncthis/6863947

कोड अब तक:

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

var isHttps = true; // do you want a https proxy? 

var options = { 
    https: { 
    key: fs.readFileSync('key.pem'), 
    cert: fs.readFileSync('key-cert.pem') 
    } 
}; 

// this is the target server 
var proxy = new httpProxy.HttpProxy({ 
    target: { 
    host: '127.0.0.1', 
    port: 8080 
    } 
}); 

if (isHttps) 
    https.createServer(options.https, function(req, res) { 
    console.log('Proxying https request at %s', new Date()); 
    proxy.proxyRequest(req, res); 
    }).listen(443, function(err) { 
    if (err) 
     console.log('Error serving https proxy request: %s', req); 

    console.log('Created https proxy. Forwarding requests from %s to %s:%s', '443', proxy.target.host, proxy.target.port); 
    }); 
else 
    http.createServer(options.https, function(req, res) { 
    console.log('Proxying http request at %s', new Date()); 
    console.log(req); 
    proxy.proxyRequest(req, res); 
    }).listen(80, function(err) { 
    if (err) 
     console.log('Error serving http proxy request: %s', req); 

    console.log('Created http proxy. Forwarding requests from %s to %s:%s', '80', proxy.target.host, proxy.target.port); 
    }); 
+1

गीस्ट का लिंक पुराना था। मैंने इसे https://gist.github.com/ncthis/6863947 – david

+1

@ डेविड को फिर से अपडेट किया है – fidev

+0

'httpProxy.HttpProxy फ़ंक्शन नहीं है –

15

समाधान मुश्किल से इस बात के लिए मौजूद हैं, और प्रलेखन पर सबसे अच्छा गरीब है एक सर्वर पर दोनों का समर्थन करने के लिए। यह चाल यहां समझने के लिए है कि क्लाइंट प्रॉक्सी कॉन्फ़िगरेशन HTTP प्रॉक्सी सर्वर पर https अनुरोध भेज सकता है। फ़ायरफ़ॉक्स के लिए यह सच है यदि आप HTTP प्रॉक्सी निर्दिष्ट करते हैं और फिर "सभी प्रोटोकॉल के लिए समान" चेक करें।

आप "कनेक्ट" ईवेंट सुनकर HTTP सर्वर पर भेजे गए https कनेक्शन को संभाल सकते हैं। ध्यान दें कि कनेक्ट ईवेंट पर केवल प्रतिक्रिया सॉकेट तक पहुंच नहीं होगी, केवल सॉकेट और बॉडीहेड। इस सॉकेट पर भेजा गया डेटा प्रॉक्सी सर्वर के रूप में आपके लिए एन्क्रिप्ट किया जाएगा।

इस समाधान में, आपको अपने प्रमाणपत्र बनाने की ज़रूरत नहीं है, और परिणामस्वरूप आपके पास प्रमाणपत्र विवाद नहीं होंगे। यातायात बस प्रक्षेपित है, अलग-अलग प्रमाणपत्रों के साथ अवरुद्ध नहीं किया गया है और फिर से लिखा गया है।

// Install npm dependencies first 
// npm init 
// npm install --save [email protected] 
// npm install --save [email protected] 

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(); 
    }); 

}); 
+0

अपना उदाहरण प्यार करें। मैं सोच रहा था कि आप वेबस्केट अपग्रेड कनेक्शन को संभालने के लिए इसे कैसे बढ़ा सकते हैं – lzc

+0

@ y3sh क्या आप कृपया मेरा प्रश्न यहां देखें http://stackoverflow.com/questions/43908640/node-js-http-proxy-with-https? मुझे लगता है कि आपका उदाहरण मेरी मदद कर सकता है, लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए .. – Valip

+0

मैं इसे उपयोगकर्ता और पासवर्ड प्रमाणीकरण कैसे जोड़ सकता हूं ताकि मैं केवल मेरे और मेरे गतिशील आईपी पते से अनुरोध अग्रेषित कर सकूं? – koampapapa

संबंधित मुद्दे