2012-12-04 32 views
10

आज मुझे एक दिलचस्प मुद्दा का सामना करना पड़ा।Httplib2 एसएसएल त्रुटि

मैं Foursquare सिफारिश अजगर पुस्तकालय httplib2 उपयोग कर रहा हूँ

SSLHandshakeError(SSLError(1, '_ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed'),) 

बढ़ा

_process_request_with_httplib2 function 

में एक OAuth टोकन

response, body = h.request(url, method, headers=headers, body=data) 

अनुरोध करने के लिए किसी को पता है कि ऐसा क्यों होता कोशिश करते हुए ?

+3

प्रणाली प्रमाणपत्र फ़ाइल के लिए पथ पारित कर सकते हैं मैं बहुत यकीन है कि SSL प्रमाणपत्र सत्यापन नहीं हो पाया हूँ **: - डी ** – BorrajaX

उत्तर

20

आप जानते हैं कि साइट पर आप प्राप्त करने के लिए कोशिश कर रहे हैं एक "अच्छा आदमी", तो आप इस तरह अपने "सलामी बल्लेबाज" बनाने की कोशिश कर सकते है:

import httplib2 
if __name__ == "__main__": 
    h = httplib2.Http(".cache", disable_ssl_certificate_validation=True) 
    resp, content = h.request("https://site/whose/certificate/is/bad/", "GET") 

(दिलचस्प हिस्सा disable_ssl_certificate_validation=True है)

डॉक्स से: http://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http

संपादित करें 01:

चूंकि आपका प्रश्न वास्तव में ऐसा क्यों होता है, आप this या this देख सकते हैं।

संपादित करें 02:

देखकर कैसे इस जवाब से अधिक लोगों की तुलना में मैं उम्मीद द्वारा दौरा किया गया है, मैं थोड़ा समझाने के लिए जब अक्षम करने प्रमाण पत्र सत्यापन उपयोगी हो सकता है चाहते हैं।

सबसे पहले, ये प्रमाण पत्र कैसे काम करते हैं, इस बारे में हल्की पृष्ठभूमि की एक छोटी सी पृष्ठभूमि। ऊपर दिए गए लिंक में बहुत सारी जानकारी है, लेकिन यहां यह वैसे भी है।

एसएसएल प्रमाणपत्रों को एक प्रसिद्ध (कम से कम, आपके ब्राउज़र के लिए जाना जाता है) द्वारा सत्यापित किया जाना चाहिए Certificate Authority। आप आम तौर पर उन अधिकारियों में से एक से पूरे प्रमाण पत्र खरीदने के (Symantec, GoDaddy ...)

मोटे तौर पर विचार है: उन प्रमाणपत्र प्राधिकारी (CA) आप एक प्रमाण पत्र भी इसमें शामिल हैं कि सीए जानकारी देना । आपके ब्राउज़र में अच्छी तरह से ज्ञात सीए की एक सूची है, इसलिए जब आपका ब्राउज़र प्रमाण पत्र प्राप्त करता है, तो यह कुछ ऐसा करेगा: "HmmmMMMmmm .... [ब्राउज़र यहां एक शानदार चेहरा बनाता है]... मुझे एक प्राप्त हुआ सर्टिफिकेट, और यह कहता है कि यह सिमेंटेक द्वारा सत्यापित किया गया है। क्या मुझे पता है कि "सिमेंटेक" लड़का? [ब्राउज़र तब प्रसिद्ध सीए की सूची में जाता है और सिमेंटेक के लिए चेक करता है]ओह, हाँ! मैं करता हूँ। ठीक है, प्रमाण पत्र अच्छा है!

आप उस जानकारी अपने आप देख सकते हैं कि आप अपने ब्राउज़र में यूआरएल द्वारा थोड़ा ताला पर क्लिक करें:

Chrome certificate information

हालांकि, वहाँ मामलों में आप सिर्फ HTTPS का परीक्षण करना चाहते हैं, और आप command line टूल का उपयोग करके अपनी खुद की सर्टिफिकेट अथॉरिटी बनाते हैं और आप उस "कस्टम" सीए का उपयोग करते हैं जो "कस्टम" प्रमाण पत्र पर हस्ताक्षर करने के लिए है जिसे आपने अभी भी जेनरेट किया है, है ना? उस स्थिति में, आपका ब्राउज़र (जिस तरह से, प्रश्न में httplib2.Http) विश्वसनीय सीए की सूची में आपका "कस्टम" सीए नहीं होने वाला है, इसलिए यह कहने जा रहा है कि प्रमाणपत्र अमान्य है। जानकारी अभी भी एन्क्रिप्टेड यात्रा करने जा रही है, लेकिन ब्राउजर आपको क्या कह रहा है कि यह पूरी तरह से भरोसा नहीं करता है कि वह उस स्थान पर एन्क्रिप्टेड यात्रा कर रहा है जहां आप जा रहे हैं।

उदाहरण के लिए, मान लें कि अपने localhostFQDN के लिए और अपने CA प्रमाणपत्र फ़ाइल वर्तमान निर्देशिका में स्थित है कि कस्टम कुंजी और सीए और सभी मैम्बो जंबो निम्नलिखित this tutorial का एक समूह तैयार करते हैं। आप अपने कस्टम प्रमाणपत्रों और व्हाट्नॉट का उपयोग कर https://localhost:4443 पर चल रहे सर्वर को बहुत अच्छी तरह से चला सकते हैं। अब, आपकी सीए प्रमाणपत्र फ़ाइल वर्तमान निर्देशिका में ./ca.crt फ़ाइल में स्थित है (उसी निर्देशिका में आपकी पायथन स्क्रिप्ट चल रही है)। आप इस तरह इस्तेमाल कर सकते हैं:

h = httplib2.Http(ca_certs='./ca.crt') 
response, body = h.request('https://localhost:4443') 
print(response) 
print(body) 

... और आप चेतावनी अब और नहीं दिखाई देगा। क्यूं कर? क्योंकि आप के बाद से क्रोम (एक ब्राउज़र का हवाला देते हैं करने के लिए) इस सीए के प्रमाणपत्र के बारे में पता नहीं है ./ca.crt को सीए के प्रमाणपत्र) के लिए देखो जाने के लिए

हालांकि, से कहा, यह वह अमान्य विचार करेंगे:

enter image description here

इसके अलावा, प्रमाणपत्र समाप्त हो जाते हैं। एक मौका है कि आप ऐसी कंपनी में काम कर रहे हैं जो एसएसएल एन्क्रिप्शन के साथ एक आंतरिक साइट का उपयोग करता है। यह एक साल के लिए ठीक काम करता है, और फिर आपका ब्राउज़र शिकायत शुरू करता है। आप उस व्यक्ति के पास जाते हैं जो सुरक्षा के प्रभारी हैं, और पूछें "यो !! मुझे यह चेतावनी यहां मिलती है! क्या हो रहा है?" और उत्तर बहुत अच्छी तरह से हो सकता है "ओह लड़का !! मैं प्रमाण पत्र को नवीनीकृत करना भूल गया! यह ठीक है, इसे अभी तक स्वीकार करें, जब तक कि मैं इसे ठीक नहीं करता।" httplib2 की

+3

यह वास्तव में एक अच्छा विचार नहीं है - आपको वास्तव में यह पता लगाना चाहिए कि आपका सत्यापन विफल क्यों हो रहा है। सत्यापन को अक्षम करके, आप संक्षेप में कई मैन-इन-द-मिडल-हमलों का पता लगाने की क्षमता को हटा रहे हैं, जहां कोई अपस्ट्रीम फोरस्क्वेयर सर्वर का प्रतिरूपण करना चाहता है - आप उस साधारण मामले का पता लगाने में सक्षम नहीं होंगे जहां उनके पास है एक स्व-हस्ताक्षरित प्रमाण उत्पन्न किया। – javanix

+1

टिप्पणी: प्रमाण पत्र सत्यापन अक्षम करने के लिए यह केवल 'h = httplib2.Http (disabled_ssl_certificate_validation = True) 'आवश्यक है। –

+0

@javanix, इसलिए * यदि आप जानते हैं कि जिस साइट को आप प्राप्त करने का प्रयास कर रहे हैं वह "अच्छा लड़का" है ... * – BorrajaX

10

हाल संस्करणों (सच्ची कहानी, हालांकि वहाँ जवाब में swearwords थे मैं :-D प्राप्त) अपने स्वयं के प्रमाणपत्र संग्रह करने के लिए दोषी है।

# Default CA certificates file bundled with httplib2. 
CA_CERTS = os.path.join(
    os.path.dirname(os.path.abspath(__file__)), "cacerts.txt") 

मामले में आप ubuntu/डेबियन उपयोग कर रहे हैं, आप स्पष्ट रूप से की तरह

httplib2.HTTPSConnectionWithTimeout(HOST, ca_certs="/etc/ssl/certs/ca-certificates.crt")