2015-06-02 10 views
10

के रूप में प्रमाण पत्र भेजता है, मुझे लगता है कि हैंडशेक ठीक तरह से काम नहीं कर रहा है।पायथन अनुरोध स्ट्रिंग

cert = 'path/to/cert_file.pem' 
url = 'https://example.com/api' 

requests.get(url, cert=cert, verify=True) 

यह ठीक है जब मैं इसे स्थानीय रूप से उपयोग करता हूं जहां मेरे पास भौतिक रूप से फ़ाइल है। हम अपने आवेदन को उसकेोकू पर होस्ट करते हैं और पर्यावरण के उपयोग का उपयोग करते हैं।

अनुरोध मॉड्यूल स्ट्रिंग के रूप में प्रमाण पत्र स्वीकार नहीं करता प्रतीत होता है। जैसे।

$ export CERTIFICATE="long-list-of-characters" 

requests.get(url, cert=get_env('CERTIFICATE'), verify=True) 

मैं भी कुछ इस तरह की कोशिश की है:

सभी की
cert = tempfile.NamedTemporaryFile() 
cert.write(CERTIFICATE) 
cert.seek(0) 
requests.get(url, cert=cert.name, verify=True) 

सबसे पहले, यह स्थानीय स्तर पर नहीं बल्कि Heroku पर काम करता है। वैसे भी, यह एक ठोस समाधान की तरह महसूस नहीं करता है। मुझे एक एसएसएल हैंडशेक त्रुटि मिलती है।

कोई सुझाव?

+1

संभावित डुप्लिकेट [पाइथन में स्ट्रिंग चर में संग्रहीत प्रमाणपत्र का उपयोग करके एसएसएल सॉकेट कैसे खोलें] (http://stackoverflow.com/questions/12336239/how -टू-ओपन-एसएसएल-सॉकेट-उपयोग-प्रमाणपत्र-संग्रहित-इन-स्ट्रिंग-चर-इन-पायथन) –

+0

@ गेलबैंडर, जिन्होंने cert_file.pem पर हस्ताक्षर किए हैं? क्या यह आपके कस्टम/इनहाउस रूट प्रमाणपत्र प्राधिकरण द्वारा स्वयं हस्ताक्षरित है? क्या आपने यह सुनिश्चित करने के लिए हेरोोकू में पेम पूर्ण पथ को पारित करने के लिए सुनिश्चित किया है, यह सुनिश्चित करने के लिए कि आप अपनी पम फ़ाइल को हेरोोकू में अपलोड करने का प्रयास कर चुके हैं? –

+0

इसके अलावा मुझे यकीन नहीं है कि एनवी चर का उपयोग करना पसंदीदा तरीका है। यह शायद "हेरोकू कॉर्ट्स: सर्वर.crt server.key" का उपयोग करके बेहतर है –

उत्तर

1

प्रति requests प्रलेखन के रूप में:

अपने स्थानीय प्रमाण पत्र के लिए निजी कुंजी एन्क्रिप्ट नहीं किए गए होना चाहिए। वर्तमान में, अनुरोध एन्क्रिप्टेड कुंजी का उपयोग करने का समर्थन नहीं करता है।

आप [भी] एक एकल फाइल (निजी कुंजी और प्रमाणपत्र युक्त) के रूप में, ग्राहक के पक्ष प्रमाण पत्र के रूप में उपयोग करने के लिए एक स्थानीय प्रमाणपत्र निर्दिष्ट कर सकते हैं या दोनों फ़ाइल पथ के एक टपल के रूप में:

requests.get('https://kennethreitz.com', cert=('/path/client.cert', '/path/client.key')) 

आपको सार्वजनिक और निजी कुंजी दोनों के लिए पथ शामिल करना होगा ... या आप दोनों में मौजूद एक फ़ाइल के पथ को शामिल कर सकते हैं।

1

वासीली का जवाब तकनीकी रूप से सही है, हालांकि यह आपके प्रश्न का उत्तर नहीं देता है। Keyfile, वास्तव में, शुरू करने के लिए unencrypted होना चाहिए।

मैंने स्वयं को आपकी तरह की स्थिति का समाधान किया है। आप सही रास्ते पर थे; तुम सब करने की थी NamedTemporaryFile() को

1. पास delete=False था, तो फ़ाइल close()

2.close() tempfile बुला उपयोग करने से पहले के बाद हटाया नहीं जा सकता है, तो यह बचा लिया जाएगा

ध्यान दें कि यह करने के लिए एक बहुत ही असुरक्षित बात है। delete=False, जैसा कि मैं समझता हूं, फ़ाइल को संदर्भ को हटाने के बाद भी डिस्क पर रहने का कारण बनता है। इसलिए, फ़ाइल को हटाने के लिए, आपको मैन्युअल रूप से os.unlink(tmpfile.name) पर कॉल करना चाहिए।

प्रमाण पत्र के साथ ऐसा करना एक बड़ा सुरक्षा जोखिम है: आप सुनिश्चित करना चाहिए कि प्रमाण पत्र के साथ स्ट्रिंग सुरक्षित और छिपी हुई है और किसी के पास सर्वर तक पहुंच नहीं है।

फिर भी, यह एक उपयोगी वातावरण है, उदाहरण के लिए, एक परीक्षण वातावरण के रूप में और क्लाउड में निर्मित डॉकर छवि में आपके ऐप को प्रबंधित करना, जहां COPY निर्देश एक विकल्प नहीं हैं।यह आपके गिट भंडार में फ़ाइल को संग्रहीत करने से भी निश्चित रूप से बेहतर है: डी

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