2010-06-25 15 views
8

में HTTP प्रॉक्सी को HTTPS प्रॉक्सी में कनवर्ट करें हाल ही में मैं ट्विस्ट में HTTP प्रॉक्सी के साथ खेल रहा हूं। बहुत परीक्षण और त्रुटि के बाद मुझे लगता है कि आखिरकार मेरे पास कुछ काम कर रहा है। हालांकि मैं क्या जानना चाहता हूं, अगर यह संभव है, तो क्या मैं इस प्रॉक्सी का विस्तार करने के लिए भी HTTPS पृष्ठों को संभालने में सक्षम हूं? इस कोड, यह दर्शाता हैट्विस्ट

from twisted.internet import reactor 
from twisted.web import http 
from twisted.web.proxy import Proxy, ProxyRequest, ProxyClientFactory, ProxyClient 



class HTTPProxyClient(ProxyClient): 
    def handleHeader(self, key, value): 
     print "%s : %s" % (key, value) 
     ProxyClient.handleHeader(self, key, value) 

    def handleResponsePart(self, buffer): 
     print buffer 
     ProxyClient.handleResponsePart(self, buffer) 

class HTTPProxyFactory(ProxyClientFactory): 
    protocol = HTTPProxyClient 

class HTTPProxyRequest(ProxyRequest): 
    protocols = {'http' : HTTPProxyFactory} 

    def process(self): 
     print self.method 
     for k,v in self.requestHeaders.getAllRawHeaders(): 
      print "%s : %s" % (k,v) 
     print "\n \n" 

     ProxyRequest.process(self) 

class HTTPProxy(Proxy): 

    requestFactory = HTTPProxyRequest 


factory = http.HTTPFactory() 
factory.protocol = HTTPProxy 

reactor.listenSSL(8001, factory) 
reactor.run() 

के रूप में अब मैं सिर्फ बाहर मुद्रण कर रहा हूँ जो कुछ भी कनेक्शन के माध्यम से जा रहा है के लिए उदाहरण के लिए: यहाँ मैं अब तक क्या मिल गया है है। क्या समान कक्षाओं के साथ एचटीटीपीएस को संभालना संभव है? यदि नहीं, तो मुझे ऐसी चीज को लागू करने के बारे में कैसे जाना चाहिए?

+0

आप सर्वर प्रमाणपत्र ट्रस्ट के मुद्दे को संभालने का इरादा कैसे रखते हैं? – MattH

+0

मैटएच, मैं इस परियोजना के लिए एक और प्रोग्रामर के साथ सहयोग कर रहा हूं और उसके अनुसार वह पहले से ही यह पता लगा चुका है कि एसएसएल प्रमाण को दोबारा कैसे प्राप्त किया जाए। स्पष्ट रूप से आप चला सकते हैं: reactor.listenSSL (पोर्ट, फैक्ट्री, प्रमाण) और आप HTTPS कनेक्शन सुन सकते हैं। हालांकि, यदि आप विषय के बारे में जानकार हैं तो मैं निश्चित रूप से किसी भी इनपुट की सराहना करता हूं! – themaestro

+0

मार्कस एडम्स बताते हैं। आपके पास प्रमाण पत्र ट्रस्ट का मुद्दा है। जब वेबब्रोसर को HTTPS के लिए प्रॉक्सी का उपयोग करने के लिए कॉन्फ़िगर किया गया है, तो यह "कनेक्ट होस्ट: पोर्ट" भेजता है और सर्वर से पास होने की अपेक्षा करता है। शामिल प्रॉक्सी केवल एन्क्रिप्टेड SSL ट्रैफ़िक को देखेगा जो क्लाइंट और सर्वर के बीच ब्रोकिंग कर रहा है। यदि आप क्लाइंट के लिए सर्वर के रूप में जादुई रूप से मास्कराइड करना चाहते हैं, तो क्लाइंट को उस वेबसाइट तक पहुंचने के प्रयोजनों के लिए क्लाइंट प्राप्त करना होगा, जिस पर ग्राहक यात्रा करने का प्रयास कर रहा है। – MattH

उत्तर

12

यदि आप HTTP प्रॉक्सी के माध्यम से किसी HTTPS वेबसाइट से कनेक्ट करना चाहते हैं, तो आपको CONNECT HTTP क्रिया का उपयोग करने की आवश्यकता है (क्योंकि यह प्रॉक्सी एचटीटीपीएस के लिए काम करता है)। इस मामले में, प्रॉक्सी सर्वर बस लक्ष्य सर्वर से कनेक्ट होता है और सर्वर द्वारा जो भी भेजा जाता है वह क्लाइंट की सॉकेट (और इसके विपरीत) पर वापस आता है। इस मामले में कोई कैशिंग शामिल नहीं है (लेकिन आप उन होस्ट को लॉग इन करने में सक्षम हो सकते हैं जिन्हें आप कनेक्ट कर रहे हैं)।

विनिमय इस (प्रॉक्सी के लिए क्लाइंट) तरह दिखेगा:

C->P: CONNECT target.host:443 HTTP/1.0 
C->P: 

P->C: 200 OK 
P->C: 

इस के बाद, प्रॉक्सी बस लक्ष्य सर्वर के लिए एक सादे सॉकेट (अभी तक कोई HTTP या SSL/TLS) को खोलता है और सब कुछ रिले के बीच प्रारंभिक ग्राहक और लक्ष्य सर्वर (क्लाइंट शुरू होने वाले टीएलएस हैंडशेक सहित)। क्लाइंट टीएलएस/एसएसएल (एसएसएल/टीएलएस हैंडशेक शुरू करके) का उपयोग करने के लिए प्रॉक्सी को मौजूद मौजूदा सॉकेट को अपग्रेड करता है। एक बार क्लाइंट ने '200' स्टेटस लाइन पढ़ी है, जहां तक ​​ग्राहक का संबंध है, ऐसा लगता है जैसे उसने सीधे लक्ष्य सर्वर से कनेक्शन बनाया था।

+0

मुझे यह समझने में कठिनाई है कि आप यह कैसे कर रहे हैं। मुझे पूरी प्रक्रिया मिलती है लेकिन जब यह वास्तव में नीचे आती है, तो मुझे समझ में नहीं आता कि कैसे प्रॉक्सी लक्ष्य सर्वर पर सादा सॉकेट खोलता है "। क्लाइंट पोस्ट कनेक्ट करें, फिर सर्वर 200 का जवाब देता है और सर्वर सॉकेट खोलता है। यह आसान है। अब जो भी क्लाइंट भेजता है वह सॉकेट के माध्यम से भेजा जाता है लेकिन मुझे नहीं पता कि यह कैसे करें। जब मैं एकाधिक कनेक्शन करता हूं तो क्लाइंट किस सॉकेट को कुछ भेजने जा रहा है, इस पर ट्रैक कैसे करूं? मैं क्लाइंट कनेक्शन को "असाइन" कैसे करूं जो लक्ष्य सर्वर पर पहले से खोले सॉकेट को प्रॉक्सी करने के लिए डेटा पंप करता है? – stewenson

+0

@ क्लाइंटसन क्लाइंट कनेक्शन प्राप्त करता है जब क्लाइंट कनेक्शन अनुरोध भेजता है, इसलिए सर्वर उत्तर 200 के ठीक बाद, बस कुछ भी कच्चे सॉकेट टीसीपी कनेक्शन के साथ कर सकते हैं। – schemacs

1

मुझे मुड़ने के बारे में निश्चित नहीं है, लेकिन मैं आपको चेतावनी देना चाहता हूं कि यदि आप एक HTTPS प्रॉक्सी लागू करते हैं, तो एक वेब ब्राउज़र सर्वर के SSL प्रमाणपत्र को यूआरएल (पता बार) में डोमेन नाम से मेल खाने की उम्मीद करेगा। वेब ब्राउज़र अन्यथा सुरक्षा चेतावनियां जारी करेगा।

इस तरह के तरीके हैं, जैसे कि फ्लाई पर प्रमाणपत्र तैयार करना, लेकिन आपको ब्राउजर पर रूट प्रमाणपत्र की आवश्यकता होगी।

+0

यह एक रिवर्स एप्लिकेशन-लेयर प्रॉक्सी, या पारदर्शी प्रॉक्सी के लिए सच होगा। प्रश्न यह निर्दिष्ट नहीं करता कि वह किस उद्देश्य के लिए चाहता है कि वह किस उद्देश्य के लिए चाहता है। – MattH

+0

स्पष्ट करने के लिए: शुरू करने के लिए मैं बस एक HTTPS प्रॉक्सी लिखना चाहूंगा जो केवल कनेक्शन पर जा रहे सभी ट्रैफ़िक को सुन सकता है और इसे प्रिंट/लॉग कर सकता है। उदाहरण: क्लाइंट -> एसएसएल एन्क्रिप्टेड साइट -> प्रॉक्सी इंटरसेप्ट्स -> गंतव्य एसएसएल सर्वर पर भेजता है -> प्रतिक्रिया -> प्रॉक्सी इंटरसेप्ट्स और पढ़ता है -> क्लाइंट – themaestro

+0

@MattH, उदाहरण स्पष्ट रूप से दिखाता है एक अनुप्रयोग परत प्रॉक्सी और एक रिवर्स नहीं। ओपी इसका उपयोग कैसे करता है इस पर निर्भर करता है कि आप इसे एक पारदर्शी प्रॉक्सी कह सकते हैं या नहीं। –

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