11

सम्मान नहीं किया जा रहा AppEngine डेवलपर appserver में मैं इस तरह एक त्रुटि हो रही है: जब मैं एक स्व-हस्ताक्षरित साथ एक https सर्वर से इस तरह लाने बनाने रहाAppEngine UrlFetch validate_certificate = झूठी/कोई नहीं

SSLCertificateError: Invalid and/or missing SSL certificate for URL ... 

प्रमाण पत्र (लगभग हमेशा localhost पोर्ट-अग्रेषित एक वी एम को ssh से अधिक):

result = urlfetch.fetch(url=url, method=method, payload=payload, 
         deadline=DEADLINE, validate_certificate=None) 

है कि अमान्य प्रमाण पत्र जहां validate_certificateFalse है के लिए SSL विफलताओं की उम्मीद नहीं है, हालांकि यह काफी है संभावित रूप से एसएसएल प्रमाणपत्रों को सत्यापित करने के लिए पाइथन में 2.7.9 नीति का दुष्प्रभाव।

ध्यान दें कि False (None के बजाय) validate_certificate के लिए या तो काम नहीं करता है।

यह समस्या ओएस एक्स 10.10.2-4 पर होमब्री/एक्सकोड के माध्यम से पाइथन 2.7.9-10 पर होती है, जिसमें एपइंजिन 1.9.18 1.19.26 के माध्यम से होता है।

Google App Engine पर इस बारे में समस्याएं हैं (उदा। 12096), लेकिन मैं एक कामकाज की तलाश में हूं।

यहाँ क्या मैं इस के आसपास काम करने के लिए कोशिश की है:

  1. मैक के लॉगिन कीचेन के लिए प्रमाण पत्र जोड़ें

  2. (ब्राउज़र, अजगर से नहीं में काम करता है) app-engine-python/lib/cacerts/cacerts.txt को प्रमाण पत्र जोड़ें और/या ./lib/cacerts/urlfetch_cacerts.txt (हालांकि इसे संभवतः पर पर काम करने की आवश्यकता है, क्योंकि यह एकमात्र ऐसा मामला प्रतीत होता है जहां उनका उपयोग किया जाता है) उदाहरण के साथ

    $ गूंज >> /usr/local/share/app-engine-python/lib/cacerts/urlfetch_cacerts.txt

    $ openssl X509 -subject -इन server.crt >>/usr/स्थानीय /share/app-engine-python/lib/cacerts/urlfetch_cacerts.txt

  3. ssl HTTPS के यानी

    ssl._create_default_https_context = ssl._create_unverified_context

    वैकल्पिक हल के साथ जाँच अक्षम

    पर या के बाद import ssl (लाइन 1149 के आसपास) के google/appengine/dist27/python_std_lib/httplib.py

यह/ओएस एक्स एल कैपिटल अब एक व्यावहारिक विकल्प है विशेष रूप से XCode 7 के रूप में पदावनति के बाद से मैक पर समस्याग्रस्त है।

एक बेहतर कामकाज में एपइंजिन कोड को बंदर-पैचिंग में शामिल नहीं किया जाएगा जब भी डेवलपर ऐप्स अपडेट किया जाता है।


संपादित

ध्यान दें कि मैक builtin OpenSSL प्रमाण पत्र /System/Library/OpenSSL में जमा हो जाती है, जो SIP/rootlessness साथ सुरक्षित है, जो स्पष्ट रूप से साथ गंदगी के लिए एक दर्द और एक सार्थक सुविधा अगर हम कर सकते हैं रखने के लिए है।

मैंने सत्यापित किया है कि प्रमाण पत्र openssl s_client -connect localhost:7500 -CAfile server.pem का उपयोग करके मान्य करता है।

यह hash.# प्रारूप जहां हैश openssl x509 -subject_hash -in server.pem से आता है (या homebrew ssl, अर्थात् /usr/local/Cellar/openssl/1.0.2d_1/bin/openssl) के साथ कीचेन पर और /usr/local/etc/openssl/certs जोड़ लिया गया है। किस मामले में /usr/local/Cellar/openssl/1.0.2d_1/bin/openssl s_client -connect localhost:7500 प्रमाण पत्र सत्यापित करता है (लेकिन अजगर अभी भी नहीं है)।

मैंने पायथन और openssl के होमब्रू संस्करण का उपयोग करने का प्रयास किया है, लेकिन इसका कोई फायदा नहीं हुआ है। पाइथन में निम्नलिखित चलाना हमेशा असफल रहता है; जहां SSL_CERT_FILE सर्वर का सुरक्षा प्रमाणपत्र के लिए सेट है

./pve/bin/python -c "import requests; requests.get('https://localhost:7500')" 

यह भी विफल रहता है, और यह भी जहां SSL_CERT_PATH/usr/local/etc/openssl/certs पर सेट है विफल रहता है (उपाय एक जोड़ा के बाद से openssl आदेश अनिवार्य रूप से इस तरह काम करता है यह काम करने के लिए उम्मीद कर सकते हैं के लिए अर्थात)।

ध्यान दें, pve एक आभासी env जहां help(ssl) से पता चलता है एक FILE की /usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py

आगे की पुष्टि करने के लिए homebrew पायथन के _ssl.so लिंक homebrew है कि के openssl मैं भाग गया:

xcrun otool एल /usr/स्थानीय/सेलर /python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_ssl.so

जो रिटर्न

./Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_ssl.so:

/usr/स्थानीय/opt/openssl /lib/libssl.1.0.0.dylib (संगतता संस्करण 1.0.0, वर्तमान संस्करण 1.0.0)

/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (संगतता संस्करण 1.0। 0, वर्तमान संस्करण 1.0.0)

/usr/lib/libSystem.B.dylib (अनुकूलता संस्करण 1.0.0, वर्तमान संस्करण 1225.1.1)

,210

एक brew info openssl चलाता है यह CAVEATS के तहत टिप्पणी:

एक सीए फाइल सिस्टम कीचेन से प्रमाण पत्र का उपयोग कर चलाया गया है। अतिरिक्त प्रमाण पत्र जोड़ने के लिए, में फ़ाइलों .pem जगह /usr/स्थानीय/etc/openssl/प्रमाणपत्र

लेकिन स्पष्ट रूप से किसी कारण अजगर के लिए प्रमाण पत्र को खोजने के लिए homebrew के openssl कलन विधि का उपयोग नहीं कर रहा है।

तो मैं प्रमाण पत्र वाले OpenSSL निर्देशिका दस्तावेजों के साथ-साथ कीचेन (दोनों .pem और .p12 स्वरूपों में में निर्दिष्ट कर रहे हैं यही कारण है कि अजगर मानक पुस्तकालय मान्य नहीं है के रूप में एक नुकसान में बने हुए हैं, Secure Sockets Layer (SSL) के लिए "हमेशा पर भरोसा" के साथ)।

उत्तर

8

यह हाल ही में पाइथन रिलीज (मैं विश्वास 2.7.9) में httplib.HTTPSConnection व्यवहार परिवर्तन (डिफ़ॉल्ट रूप से प्रमाणपत्र जांच चालू) के कारण dev_appserver बग है।

बग आंतरिक dev_appserver कोड का परीक्षण आवेदन की स्वतंत्र रूप से चलाया जाता है (ऐप्स इंजन एसडीके की फ़ाइल google_appengine/google/appengine/api/urlfetch_stub.py) में है, वहाँ एक ठीक है कि एक एसडीके अद्यतन बच जाएगा बनाने के लिए कोई रास्ता नहीं है।

एकमात्र स्थायी समाधान का मैं के बारे में सोच सकते हैं validate_certificate सक्षम और urlfetch_cacerts.txt फाइल करने के लिए सीए प्रमाण पत्र को जोड़ने के लिए किया जाएगा। एक अस्थायी फिक्स के रूप में, आप वर्कअराउंड # 3 के साथ urlfetch_stub.py पैच कर सकते हैं।

+0

धन्यवाद @ एलेक्स। क्या मैक सिस्टम में प्रमाण पत्र जोड़ना संभव नहीं है, तो पाइथन के Httplib तब उपयोग करेंगे? –

+0

ब्रायन, मैक पर पाइथन एसएसएल लिब कैसे काम करता है, मैं बहुत परिचित नहीं हूं, मैं [एसएसएल दस्तावेज़ पृष्ठ] (https://docs.python.org/2/library/ssl.html#ssl-contexts) की जांच करूंगा और देखें कि डिफ़ॉल्ट पथ स्ट्रिंग क्या है: 'ssl.get_default_verify_paths()'। हो सकता है कि आपके प्रमाणपत्र फ़ाइल में पथ सेट करने के लिए env वैरिएबल का उपयोग करने का एक तरीका हो) [https://www.python.org/dev/peps/pep-0476/#trust-डेटाबेस)। – Alex

+0

[यहां प्रासंगिक दस्तावेज़ है] (http://gagravarr.org/writing/openssl-certs/others.shtml) openssl के लिए स्वयं-हस्ताक्षरित प्रमाणपत्र कैसे जोड़ें। – Alex

1

मैं विंडोज पर एक ही मुद्दे में भाग गया। मैं पायथन (2.7) का पुराना संस्करण इस्तेमाल कर रहा था। जब मैंने पायथन 2.7.11 में अपग्रेड किया, तो समस्या दूर हो गई।