2011-05-25 18 views
5

की आवश्यकता वाले किसी साइट तक पहुंचने के लिए libcurl का उपयोग करने में असमर्थ मैं क्लाइंट प्रमाणीकरण के लिए प्रमाण पत्र और कुंजी सेट करने के लिए नीचे दिए गए स्नैप का उपयोग कर रहा हूं।क्लाइंट प्रमाणीकरण

curl_easy_setopt(curl,CURLOPT_SSLCERT,"clientCert.pem"); 
    curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit"); 
    curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEY,"privateKey.pem"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,"changeit"); 
    curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM"); 

प्रमाण पत्र एक पासवर्ड, मैं सिर्फ एक डमी मूल्य प्रदान की नहीं है, यही कारण है कि पृथ्वी पर विकल्प SSLCERTPASSWD मौजूद है मैं नहीं जानता। जब मैं कार्यक्रम लिनक्स पर मैं 58 की एक त्रुटि कोड और एक त्रुटि संदेश निजी कुंजी फ़ाइल स्थापित करने में असमर्थ मिल चलाने: 'privateKey.pem' प्रकार पीईएम

विंडोज़ पर फिर भी मैं क्लाइंट प्रमाणपत्र (उपयोग करने में असमर्थ हो जाओ कोई कुंजी नहीं मिला या गलत पास वाक्यांश?)

ऐसा लगता है कि प्रमाण पत्र और कुंजी मेल नहीं खाती है लेकिन मुझे नहीं पता कि कैसे। मैंने openssl कमांड का उपयोग कर पी 12 फ़ाइल से प्रमाणपत्र और कुंजी दोनों निकाले हैं। आदेश मैं कुंजी निकालने के लिए इस्तेमाल

openssl.exe pkcs12 -in client.p12 -nocerts -out privateKey.pem 

है और प्रमाणपत्र निकालने के लिए इस्तेमाल आदेश

openssl.exe pkcs12 -in client.p12 -nokeys -out clientCert.pem 

p12 फ़ाइल सफलतापूर्वक क्लाइंट प्रमाणीकरण यूआरएल तक पहुँचने के लिए एक ब्राउज़र में इस्तेमाल किया गया है। कृपया मुझे शूट करने से पहले कृपया मदद करें।

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

[[email protected] ~/curlm]$ openssl x509 -noout -modulus -in clientCert.pem | openssl md5 
d7207cf82b771251471672dd54c59927 

[[email protected] ~/curlm]$ openssl rsa -noout -modulus -in privateKey.pem | openssl md5 
Enter pass phrase for privateKey.pem: 
d7207cf82b771251471672dd54c59927 

तो इसे क्यों काम नहीं कर सकते हैं: यहाँ सबूत है कि निजी कुंजी और प्रमाणपत्र एक दूसरे के अनुरूप है?

+1

मुझे कमांड लाइन कर्ल के साथ एक ही परिणाम का सामना करना पड़ रहा है। मैंने क्लाइंट सर्टिफिकेट और कुंजी को एक फाइल में संयोजित किया और नीचे की कोशिश की: curl --cert concatenatedCert.pem --cert-type PEM --cacert cabundle.crt https: // inaveo: 8775/DataIntegrationService/WebService/WS_test/ एंटर करें पीईएम पास वाक्यांश: कर्ल: (58) निजी कुंजी फ़ाइल सेट करने में असमर्थ: 'concatenatedCert.pem' प्रकार पीईएम –

उत्तर

3

कमांड लाइन कर्ल का उपयोग करके, मुझे एक .pem फ़ाइल का उपयोग करके एक ही त्रुटि मिली है जिसे पी 12 फ़ाइल से openssl के साथ भी प्राप्त किया गया था, पी 12 ब्राउज़र में आयात किए जाने पर क्लाइंट प्रमाणीकरण ठीक से काम करने में भी सक्षम था। जैसा कि आपने वर्णन किया है, मुझे लगता है।

मेरी समस्या इसलिए हुई क्योंकि .pem फ़ाइल उचित क्रम में प्रमाणपत्र सूचीबद्ध नहीं कर रही थी: ऐसा लगता है कि फ़ाइल में प्रत्येक प्रमाणपत्र को उसके जारीकर्ता प्रमाण पत्र का पालन करना होगा। मैंने फ़ाइल संपादित की और अनुभागों का क्रम बदल दिया और कर्ल खुश था।

रिकॉर्ड के लिए, मेरी मूल .p12 फ़ाइल फ़ायरफ़ॉक्स से प्रमाणपत्र का बैक अप ले कर प्राप्त की गई थी।

यह भी ध्यान रखें मेरे मामले में, मैं पासवर्ड के लिए संकेत नहीं था कि हो रही है और

curl: (58) unable to set private key file: 'alice.pem' type PEM 
पासवर्ड से पहले

संकेत

+0

आपको बहुत धन्यवाद ... –

2

मैं इसी तरह के मुद्दों का सामना करना पड़ रहा था हो रही थी, मुझे पता चला समस्या थी प्रमाणपत्र और निजी कुंजी फ़ाइलों की फ़ाइल अनुमतियों से संबंधित है। PHP चलाने वाली प्रक्रिया में उन फ़ाइलों तक पढ़ने की पहुंच नहीं थी।

$result=openssl_get_privatekey('file://path/to/private/key.pem','password'); 

और अगर दिए गए मान गलत नहीं है और कोई त्रुटि नहीं की जाँच करें:

एक बात तुम कोशिश कर सकते हैं (और है कि मुझे इस पता लगाना मदद की) निम्नलिखित कोड को चलाने के लिए है।मैं प्राप्त कर रहा था:

file_get_contents(/path/to/private/key.pem): failed to open stream: Permission denied 
0

ओपनस्ल संकेत के लिए थ्रेड और रैगफर के लिए धन्यवाद ह्यूग। बाद में: सहायक और भ्रामक दोनों। ;-)

दरअसल, मैंने यह सुनिश्चित करके समस्या हल की कि कुंजी फ़ाइल का पथ सही है। और यही कारण है कि ओपनस्ल संकेत गुमराह कर रहा था, यह जांचने के बावजूद कि मेरी पीईएम फ़ाइल ठीक है या नहीं:

curl को पूरा पथ चाहिए, लेकिन बिना 'फ़ाइल: //' उपसर्ग। जबकि फॉपेन एक सापेक्ष पथ से खुश है, curl नहीं है। इसलिए, कुंजी फ़ाइल खोलने के लिए मेरे सभी परीक्षण सफल रहे थे, जबकि कर्ल नहीं था।

Btw .:

curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit"); 
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); 
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM"); 

आवश्यक नहीं हैं, के रूप में पासवर्ड केवल निजी कुंजी डिक्रिप्ट करने के लिए प्रयोग किया जाता है और पीईएम डिफ़ॉल्ट है।