python पीकेसीएस#12 प्रमाण पत्र के साथ httlib के HTTPSConnection का उपयोग करने में त्रुटि




authentication certificate (2)

OpenSSL मेलिंग सूची में, मैंने मौनर इद्रस्सी के साथ बातें कीं उन्होंने कहा कि ओपनएसएसएल पीकेसीएस # 12 फाइलों का समर्थन करता है, और - मुझे जो त्रुटि संदेश मिल रहा है उसके आधार पर ऐसा प्रतीत होता है कि क्यूप्लीबबल कुंजी को लोड करने के लिए गलत फ़ंक्शन बुला रही है।

अपने शब्दों में:

"आपके द्वारा प्राप्त होने वाली त्रुटि के बारे में, ऐसा प्रतीत होता है कि आप जिस फ़ाइथन मॉड्यूल का उपयोग कर रहे हैं वह SSL_CTX_use_PrivateKey_file को PKCS # 12 फ़ाइल नाम देकर कॉल कर रहा है। ऐसा इसलिए नहीं है क्योंकि SSL_CTX_use_PrivateKey_file केवल दो प्रारूपों को स्वीकार करता है: SSL_FILETYPE_PEM और SSL_FILETYPE_ASN1।"

(मैं पीकेसीएस # 12 फाइल नाम को सुपुर्दगी कुंजी फ़ाइल के रूप में दे रहा हूँ, क्योंकि इस फ़ाइल स्वरूप में समान फ़ाइल में प्रमाणपत्र और निजी कुंजी दोनों शामिल हैं।)

"इसे सुधारने के लिए, आपके पास दो समाधान हैं: - या तो पीआईएम फ़ाइल में निजी कुंजी के साथ अजगर मॉड्यूल को फ़ीड करें - या इस अजगर मॉड्यूल के स्रोत कोड को संशोधित करें ताकि मैं ऊपर वर्णित पीकेसीएस # 12 फ़ंक्शन का उपयोग कर सकूं। निजी कुंजी को EVP_PKEY के रूप में निकालें और SSL_CTX_use_PrivateKey_file के बजाय SSL_use_PrivateKey को कॉल करें, SSL_use_certificate के साथ संबद्ध प्रमाणपत्र सेट करने के लिए। "

(मैंने पहले की कोशिश की और उसे काम करने में सक्षम नहीं था। इसका जरूरी मतलब नहीं है कि यह काम नहीं करेगा, केवल इतना कि मैं सक्षम नहीं था।)

मैं पीकेसीएस # 12 प्रमाण पत्र का उपयोग करते हुए, क्लाउड सत्यापन के लिए हैप्शनप्लीब के HTTPSConnection का उपयोग करने की कोशिश कर रहा हूं। मुझे पता है कि प्रमाण पत्र अच्छा है, क्योंकि मैं इसे MSIE और Firefox में उपयोग कर सर्वर से कनेक्ट कर सकता हूं।

यहां मेरा कनेक्ट फ़ंक्शन है (प्रमाण पत्र में निजी कुंजी शामिल है) मैंने इसे मूलभूत चीज़ों के लिए नीचे रखा है:

def connect(self, cert_file, host, usrname, passwd):
    self.cert_file = cert_file
    self.host = host

    self.conn = httplib.HTTPSConnection(host=self.host, port=self.port, key_file=cert_file, cert_file=cert_file)

    self.conn.putrequest('GET', 'pathnet/,DanaInfo=200.222.1.1+')
    self.conn.endheaders()
    retCreateCon = self.conn.getresponse()

    if is_verbose:
        print "Create HTTPS connection, " + retCreateCon.read()

(ध्यान दें: हार्ड-कोडित पथ पर कोई टिप्पणी नहीं, कृपया - मैं इसे पहले काम करने की कोशिश कर रहा हूं, मैं इसे बहुत बाद में कर दूँगा। हार्ड-कोडित पथ सही है, क्योंकि मैं इसे MSIE और Firefox में कनेक्ट करता हूं मैंने पोस्ट के लिए आईपी एड्रेस को बदल दिया।)

जब मैं इसे एक पीकेसीएस # 12 प्रमाण पत्र (एक .पीएफएक्स फ़ाइल) का उपयोग कर चलाने की कोशिश करता हूं, तो मुझे वापस मिल जाता है जो कि एक openSSL त्रुटि दिखाई देता है यहां पूरी त्रुटि ट्रैसबैक है:

  File "Usinghttplib_Test.py", line 175, in 
    t.connect(cert_file=opts["-keys"], host=host_name, usrname=opts["-username"], passwd=opts["-password"])
  File "Usinghttplib_Test.py", line 40, in connect
    self.conn.endheaders()
  File "c:\python26\lib\httplib.py", line 904, in endheaders
    self._send_output()
  File "c:\python26\lib\httplib.py", line 776, in _send_output
    self.send(msg)
  File "c:\python26\lib\httplib.py", line 735, in send
    self.connect()
  File "c:\python26\lib\httplib.py", line 1112, in connect
    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
  File "c:\python26\lib\ssl.py", line 350, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "c:\python26\lib\ssl.py", line 113, in __init__
    cert_reqs, ssl_version, ca_certs) ssl.SSLError: [Errno 336265225] _ssl.c:337: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

नोटिस, ओपनएसएसएल त्रुटि (सूची में अंतिम एंट्री) "पीईएम लीब" को नोट करती है, जिसे मुझे अजीब लगता है, क्योंकि मैं एक पीईएम प्रमाणपत्र का उपयोग करने की कोशिश नहीं कर रहा हूं

किक के लिए, मैंने पीकेसीएस # 12 प्रमाणक को पीईएम प्रमाणपत्र में परिवर्तित कर दिया, और उसी कोड का प्रयोग करके उसको चलाया। उस स्थिति में, मुझे कोई त्रुटि नहीं मिली, मुझे पीईएम पास वाक्यांश दर्ज करने के लिए कहा गया था, और कोड ने सर्वर तक पहुंचने का प्रयास किया। (मुझे जवाब मिला "यह सेवा उपलब्ध नहीं है, कृपया बाद में फिर से प्रयास करें।", लेकिन मेरा मानना ​​है कि ऐसा होगा क्योंकि सर्वर PEM प्रमाणपत्र को स्वीकार नहीं करता। मैं फ़ायरफ़ॉक्स में सर्वर से पीईएम प्रमाण पत्र का उपयोग कर कनेक्ट नहीं कर सकता ।)

क्या हैक्स्प्लिब्स के HTTPSConnection को पीसीके # 12 प्रमाण पत्रों का समर्थन करना चाहिए? (अर्थात, पीएफएक्स फ़ाइलें।) यदि हां, तो ऐसा क्यों दिखता है ओपनएसएसएल इसे पीईएम लिब में लोड करने की कोशिश कर रहा है? क्या मैं यह सब गलत कर रहा हूं?

किसी भी सलाह का स्वागत है

संपादित करें: प्रमाण पत्र फ़ाइल में दोनों प्रमाण पत्र और निजी कुंजी है, यही वजह है कि मैं HTTPSConnection के key_file और cert_file पैरामीटर दोनों के लिए एक ही फाइल नाम प्रदान कर रहा हूं।


यह कोई आश्चर्य नहीं है पायथन पुस्तकालय संदर्भ दस्तावेज़ इस बारे में बहुत स्पष्ट हैं। Http://docs.python.org/library/httplib.html से :

क्लास स्कूप्लबिल HTTPSConnection (होस्ट [, पोर्ट [, key_file [, cert_file [, सख्त [, टाइमआउट [, स्रोत_एड्रेस]]]]]]]])

सुरक्षित सर्वर के साथ संचार के लिए SSL का उपयोग करने वाले HTTP कनेक्शन का उप-वर्ग डिफ़ॉल्ट पोर्ट 443 है। Key_file एक PEM स्वरूपित फ़ाइल का नाम है जिसमें आपकी निजी कुंजी है। cert_file एक PEM स्वरूपित प्रमाणपत्र श्रृंखला फ़ाइल है।





pkcs#12