2010-04-13 11 views
5

के साथ प्रेजेंटलिब के HTTPSConnection का उपयोग करने में त्रुटि मैं पीकेसीएस # 12 प्रमाणपत्र का उपयोग कर क्लाइंट सत्यापन के लिए प्रेजेंटप्लिब के HTTPSConnection का उपयोग करने का प्रयास कर रहा हूं। मुझे पता है कि प्रमाणपत्र अच्छा है, क्योंकि मैं इसे एमएसआईई और फ़ायरफ़ॉक्स में सर्वर से कनेक्ट कर सकता हूं।पीकेसीएस # 12 प्रमाणपत्र

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

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() 

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

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

 
    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 

सूचना, openssl त्रुटि (सूची में अंतिम प्रविष्टि) नोट "पीईएम lib" है, जो मैं अजीब पाया, क्योंकि मैं एक पीईएम प्रमाणपत्र का उपयोग करने का प्रयास नहीं कर रहा हूँ।

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

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

कोई सलाह स्वागत है।

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

उत्तर

4

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

उनके शब्दों में:।

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

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

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

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

4

यह कोई आश्चर्य की बात है । अजगर पुस्तकालय संदर्भ डॉक्स इस बारे में बहुत स्पष्ट हैं http://docs.python.org/library/httplib.html से:।

वर्ग httplib HTTPSConnection (मेजबान [, बंदरगाह [, key_file [, cert_file [, सख्त [, टाइमआउट [, source_address]]]। ]]])

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

+0

आरटीएफएम के लिए +1। पिछले साल आप कहाँ थे जब मैं इस पर काम कर रहा था? :) –

+0

हाय रेमी, मैं निशान से थोड़ी धीमी थी ;-) - मैं SO के लिए बिल्कुल नया हूं। बस एक ही त्रुटि स्ट्रिंग पर अपनी पोस्ट खोज में आया। बाहर निकलता है मैंने कॉल श्रृंखला के साथ कहीं भी तर्क आदेश को उलझाया था और कभी भी प्रेजिपीप्लिब में मुख्य पथ पारित नहीं किया था। – Blairo

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