2017-07-06 27 views
7

मैंने पाइथन 3 में एक इंटरसेप्टिंग प्रॉक्सी लिखा है जो कि मैन-इन-द-बीच "आक्रमण" तकनीक का उपयोग करता है ताकि इसके माध्यम से आने वाले पृष्ठों का निरीक्षण और संशोधित हो सके उड़ान पर। प्रॉक्सी को स्थापित करने या स्थापित करने की प्रक्रिया का एक हिस्सा "रूट" प्रमाणपत्र उत्पन्न करता है जिसे ब्राउज़र में स्थापित किया जाना है और प्रत्येक बार प्रॉक्सी के माध्यम से HTTPS के माध्यम से एक नया डोमेन मारा जाता है, प्रॉक्सी एक नया साइट प्रमाणपत्र उत्पन्न करता है -थ-फ्लाई (और डिस्क पर जेनरेट किए गए सभी प्रमाणपत्रों को कैश करता है, इसलिए रूट प्रमाणपत्र द्वारा हस्ताक्षरित डोमेन के लिए प्रमाणपत्रों को फिर से जेनरेट करने की आवश्यकता नहीं होती है) और ब्राउज़र के साथ संवाद करने के लिए साइट प्रमाणपत्र का उपयोग करता है। (और, ज़ाहिर है, प्रॉक्सी रिमोट सर्वर से अपने स्वयं के एचटीटीपीएस कनेक्शन को फोर्ज करता है। प्रॉक्सी सर्वर सर्टिफिकेट की वैधता भी जांचता है यदि आप उत्सुक हैं।)ऑन-द-फ्लाई उत्पन्न होने वाली प्रॉक्सी के प्रमाणपत्रों को अवरुद्ध करने वाले ब्राउज़र त्रुटियों को

अच्छा, यह ब्राउज़र surf ब्राउज़र के साथ अच्छा काम करता है। (और, यह प्रासंगिक हो सकता है - कुछ संस्करणों के रूप में, कम से कम, सर्फ प्रमाण पत्र वैधता की जांच/प्रवर्तन नहीं करता था। मैं यह प्रमाणित नहीं कर सकता कि यह हाल के संस्करणों के मामले में है या नहीं।) लेकिन, फ़ायरफ़ॉक्स एक देता है प्रॉक्सी और क्रोमियम (मैंने क्रोम के साथ उचित रूप से परीक्षण नहीं किया है) के माध्यम से किए गए दूसरे (और बाद में) HTTPS अनुरोध (एसईसी_ईआरआरओआरएआरयूएसडीडी_आईएसएसयूER_एND_SERIAL त्रुटि) प्रत्येक HTTPS अनुरोध पर नेट :: ERR_CERT_COMMON_NAME_INVALID देता है। मेरी इंटरसेप्टिंग प्रॉक्सी को ब्राउज़ करने का प्रयास करते समय ये स्पष्ट रूप से एक बड़ी समस्या पेश करते हैं।

मैं जिस एसएसएल लाइब्रेरी का उपयोग कर रहा हूं वह pyOpenSSL 0.14 है यदि इससे कोई फर्क पड़ता है।

फायरफॉक्स के SEC_ERROR_REUSED_ISSUER_AND_SERIAL त्रुटि के बारे में, मैं बहुत यकीन है कि मैं कर रहा हूँ नहीं सीरियल नंबर पुन: उपयोग कर रहा हूँ। (यदि कोई मेरा काम जांचना चाहता है, तो वह बहुत रेड होगा: cert.py - पंक्ति 168 पर "crt.set_serial_number (getrandbits (20 * 8))" पर ध्यान दें।) रूट प्रमाणपत्र जारीकर्ता पाठ्यक्रम में नहीं बदलता है, लेकिन वह बदलने की उम्मीद नहीं की जाएगी, है ना? मुझे यकीन नहीं है कि त्रुटि संदेश में "जारीकर्ता" का क्या अर्थ है यदि रूट प्रमाणपत्र जारीकर्ता नहीं है।

इसके अलावा, फ़ायरफ़ॉक्स का "व्यू प्रमाणपत्र" संवाद प्रॉक्सी द्वारा उत्पन्न विभिन्न प्रमाणपत्रों के लिए पूरी तरह से अलग सीरियल नंबर प्रदर्शित करता है। (उदाहरण के तौर पर, मुझे 00.google.com के सीरियल नंबर के साथ www.google.com के लिए जेनरेट किया गया है: बीएफ: 7 डी: 34: 35: 15: 83: 3 ए: 6 ई: 9 बी: 5 9: 4 9: ए 8: सीसी: 88: 01: बीए: बीई: 23: ए 7: एडी और दूसरा www.reddit.com के लिए 78 की धारावाहिक संख्या के साथ जेनरेट किया गया: 51: 04: 48: 4 बी: बीसी: ई 3: 96: 47: एसी: डीए: डी 4 : 50: ईएफ: 2 बी: 21: 88: 99: एसी: 8 सी।) तो, मुझे सच में यकीन नहीं है कि फ़ायरफ़ॉक्स वास्तव में किस बारे में शिकायत कर रहा है।

मेरी प्रॉक्सी उड़ान भरने वाले सभी प्रमाणपत्रों के लिए निजी कुंजी (और इस प्रकार सार्वजनिक कुंजी/मॉड्यूलस) का पुन: उपयोग करती है। मुझे संदेह हुआ कि फ़ायरफ़ॉक्स इस बारे में बात कर रहा था और फॉक्स पर हर सर्किट के लिए एक नई कुंजी जोड़ी उत्पन्न करने के लिए कोड बदलने की कोशिश की थी। इससे फ़ायरफ़ॉक्स में समस्या हल नहीं हुई। मुझे अभी भी एक ही त्रुटि संदेश मिलता है। मैंने अभी तक परीक्षण नहीं किया है कि यह क्रोमियम समस्या हल करता है या नहीं।

क्रोमियम के नेट :: ERR_CERT_COMMON_NAME_INVALID त्रुटि के संबंध में, साइट प्रमाणपत्र के लिए सामान्य नाम सिर्फ डोमेन होना चाहिए, है ना? मुझे बंदरगाह संख्या या कुछ भी शामिल नहीं होना चाहिए, है ना? (दोबारा, अगर कोई मेरा काम देखना चाहेगा, तो cert.py देखें।) यदि यह किसी की मदद करता है, तो मेरी इंटरसेप्टिंग प्रॉक्सी सर्टिफिकेट सामान्य नामों या किसी भी चीज़ में किसी भी वाइल्डकार्ड का उपयोग नहीं कर रही है। उत्पन्न हर प्रमाणपत्र एक विशिष्ट fqdn के लिए है।

मुझे फ़ायरफ़ॉक्स या क्रोम (या क्रोमियम या आईई आदि) बाल्क बनाने के बिना यह काम करने में काफी यकीन है। एक कंपनी जिसे मैं खरीदे जाने के लिए काम करता था और man-in-them-middling proxy स्थापित करता था जिसके माध्यम से कॉर्पोरेट नेटवर्क के भीतर से सभी ट्रैफिक इंटरनेट पर पास होते थे।कहा गया कंपनी के पीसी प्रशासकों ने कर्मचारियों द्वारा उपयोग किए जाने वाले प्रत्येक कंपनी के स्वामित्व वाले कंप्यूटर पर प्रत्येक ब्राउजर में सर्टिफिकेट अथॉरिटी के रूप में एक स्व-हस्ताक्षरित प्रमाण पत्र स्थापित किया और परिणाम ने कभी भी फ़ायरफ़ॉक्स और क्रोमियम जैसे प्रमाण पत्र के लिए मुझे कोई त्रुटि नहीं दी है। अपने intercepting प्रॉक्सी सॉफ्टवेयर पैदा करता है। यह संभव है कि पीसी प्रशासकों ने इस बारे में कुछ tweaked: फ़ायरफ़ॉक्स में कॉन्फ़िगरेशन सेटिंग्स को यह सब काम या कुछ करने के लिए, लेकिन मुझे इसमें संदेह है।

निष्पक्ष होने के लिए, इस कंपनी में प्रयुक्त प्रॉक्सी या तो नेटवर्क या परिवहन परत थी, न कि मेरे जैसे अनुप्रयोग परत। लेकिन मुझे उम्मीद है कि इसे एक एप्लीकेशन-लेयर HTTP (ओं) प्रॉक्सी में पूरा किया जा सकता है।

संपादित करें: मैंने brainAl द्वारा सुझाए गए विषयAltName को सेट करने का प्रयास किया है। पीछा कर रहा है लाइन मैं स्थान brain99 में जोड़ा सुझाव:।

r.add_extensions([crypto.X509Extension(b"subjectAltName", False, b"DNS:" + cn.encode("UTF-8"))])

मैं अभी भी (फ़ायरफ़ॉक्स से SEC_ERROR_REUSED_ISSUER_AND_SERIAL हो रही है दूसरी और बाद HTTPS अनुरोध पर और मैं क्रोमियम से ERR_SSL_SERVER_CERT_BAD_FORMAT हो रही है

google.com: https://pastebin.com/YNr4zfZu

stackoverflow.com यहाँ प्रॉक्सी द्वारा उत्पन्न प्रमाण पत्र के एक जोड़े हैं : https://pastebin.com/veT8sXZ4

+0

डांटेड बाउंटी टेक्स्ट स्वरूपण को संरक्षित नहीं करता था। वॉल-ओ-टेक्स्ट के लिए खेद है। – AntiMS

+0

आपको सामान्य नाम के बजाय subjectAltName का उपयोग करना चाहिए। –

+0

फ़ायरफ़ॉक्स का पुन: उपयोग करने का दावा करने वाले दो चेतावनियों को साझा करने में सहायता मिल सकती है। –

उत्तर

1

मैंने देखा कि आप केवल अपने X509Req में सीएन सेट करते हैं। क्रोम और फ़ायरफ़ॉक्स दोनों दोनों को विषय एटलनाम एक्सटेंशन मौजूद होना आवश्यक है; उदाहरण के लिए देखें this Chrome help page या this Mozilla wiki page सीए आवश्यक या अनुशंसित प्रथाओं पर चर्चा। मोज़िला विकी है के शब्दों में:

कुछ सीए गलती का मानना ​​है कि एक प्राथमिक DNS नाम विषय का सामान्य नाम और सैन में सभी दूसरों में जाना चाहिए।

सीए/ब्राउज़र के अनुसार फोरम आधारभूत आवश्यकताएँ:

  • बीआर # 9.2.1 (आधार दर संस्करण 1.3 में खंड 7.1.4.2.1), विषय वैकल्पिक नाम एक्सटेंशन
    • आवश्यक/वैकल्पिक: आवश्यक
    • सामग्री: इस एक्सटेंशन में कम से कम एक प्रविष्टि होनी चाहिए। प्रत्येक प्रविष्टि या तो एक डीएनएसनाम होना चाहिए जिसमें पूर्ण-योग्य डोमेन नाम या एक आईपैड्रेस होता है जिसमें सर्वर का आईपी पता होता है।

आप pyOpenSSL के साथ आसानी से ऐसा करने के लिए सक्षम होना चाहिए: अगर यह केवल आंशिक रूप से यह हल करती है, तो कृपया पोस्ट

if not os.path.exists(path): 
    r = crypto.X509Req() 
    r.get_subject().CN = cn 
    r.add_extensions([crypto.X509Extension("subjectAltName", False, "DNS:" + cn]) 
    r.set_pubkey(key) 
    r.sign(key, "sha1") 

यदि यह समस्या का समाधान नहीं होता, या एक या दो उदाहरण प्रमाणपत्र जो समस्या प्रदर्शित करते हैं।


इसके अलावा, मैंने यह भी देखा कि आप SHA1 का उपयोग करके साइन इन करते हैं। ध्यान दें कि SHA1 के साथ हस्ताक्षरित प्रमाणपत्रों को कई प्रमुख ब्राउज़रों में बहिष्कृत कर दिया गया है, इसलिए मैं SHA-256 पर स्विच करने का सुझाव दूंगा।

r.sign(key, "sha256") 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन अभी तक कोई पासा नहीं है। मैं अधिक जानकारी के साथ अपनी पोस्ट अपडेट कर दूंगा। – AntiMS

+0

आपके द्वारा पोस्ट किए गए stackoverflow.com के लिए प्रमाण पत्र * नहीं * विषय एटलनाम एक्सटेंशन (दूसरे को चेक नहीं किया गया है) करता है। क्या आप वाकई अपने कोड के नवीनतम संस्करण द्वारा उत्पन्न प्रमाणपत्र तैयार करते हैं? – brain99

+0

एचआरएम। खैर, दोहरी जांच के बाद, मुझे यकीन है कि यह संस्करण "नई_ addensions" पंक्ति के साथ संस्करण से है। लेकिन, ओपनएसएसएल के साथ प्रमाणपत्र विवरण की जांच करना, यह वास्तव में विस्तार के बिना प्रमाणपत्र का उत्पादन कर रहा है। यकीन नहीं है कि इसके साथ क्या हो रहा है। मैं कुछ गुगल कर दूंगा और देख सकता हूं कि क्या मैं वहां जा रहा हूं कि क्या हो रहा है। – AntiMS

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

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