मैंने पाइथन 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
डांटेड बाउंटी टेक्स्ट स्वरूपण को संरक्षित नहीं करता था। वॉल-ओ-टेक्स्ट के लिए खेद है। – AntiMS
आपको सामान्य नाम के बजाय subjectAltName का उपयोग करना चाहिए। –
फ़ायरफ़ॉक्स का पुन: उपयोग करने का दावा करने वाले दो चेतावनियों को साझा करने में सहायता मिल सकती है। –