2009-04-08 14 views
21

मैं curl का उपयोग कर एक PHP स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो किसी उपयोगकर्ता नाम और पासवर्ड के अलावा किसी SSL प्रमाणपत्र का उपयोग करने वाले पृष्ठ के माध्यम से अधिकृत कर सकता है, और मुझे लगता है कि मुझे लगता है एसएसएल प्रमाण चरण पिछले।एसएसएल प्रमाणपत्रों के साथ PHP कर्ल का उपयोग करने में त्रुटि

इस मामले में, curl_setopt($handle, CURLOPT_VERIFYPEER, 0) दुर्भाग्य से कोई विकल्प नहीं है। प्रमाण पत्र प्रमाणीकरण का एक आवश्यक हिस्सा है, अन्यथा मुझे this other similar SO post में उल्लिखित त्रुटि मिलती है।

मैं कुछ कमांड लाइन की कोशिश की है cURL के साथ चलता है:

> curl --url https://website

यह (60) SLL certificate problem त्रुटि देता है। अगर मैं आदेश को समायोजित --cacert विकल्प शामिल करने के लिए:

> curl --url https://website --cacert /path/to/servercert.cer

यह सिर्फ ठीक काम करता है; लेख वेबसाइट वापस आ गई है।

हालांकि, मैं निम्नलिखित PHP कोड की कोशिश की है:

$handle = curl_init(); 
$options = array( 
        CURLOPT_RETURNTRANSFER => false, 
        CURLOPT_HEADER   => true, 
        CURLOPT_FOLLOWLOCATION => false, 
        CURLOPT_SSL_VERIFYHOST => '0', 
        CURLOPT_SSL_VERIFYPEER => '1', 
        CURLOPT_CAINFO   => '/path/to/servercert.cer', 
        CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)', 
        CURLOPT_VERBOSE  => true, 
        CURLOPT_URL   => 'https://website' 
      ); 

curl_setopt_array($handle, $options); 
curl_exec($handle); 
if (curl_errno($handle)) { 
    echo 'Error: ' . curl_error($handle); 
} 
curl_close($handle); 

मैं सोचा होगा कोड अनिवार्य रूप से खोल आदेशों के अनुरूप था, लेकिन इसके बजाय मैं निम्न त्रुटि संदेश के साथ स्वागत कर रहा हूँ:

Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none

मैंने उन सभी साहित्य को पढ़ा है जिन्हें मैं पा सकता हूं (विशेष रूप से php.net और curl.haxx पर) और इस समस्या को हल करने वाले कुछ भी नहीं मिलते हैं। कोई सुझाव?

EDIT: मैंने chmod 777 servercert.cer को सफलता के बिना प्रयास किया है। हालांकि, उपरोक्त कोड के साथ PHP स्क्रिप्ट को php test.php के माध्यम से ब्राउज़र की बजाय कमांड लाइन से निष्पादित करने में, यह पूरी तरह से काम करता है। ब्राउजर में यह क्यों काम नहीं करता है इसके लिए कोई स्पष्टीकरण?

EDIT 2: इन ड्राइव-डाउनवॉट्स द्वारा केवल एक ही आत्माओं पर डाउनवॉट्स इस सवाल का जवाब देने के लिए पर्याप्त बहादुर हैं। या तो कुछ सार्थक योगदान दें या पास करें, कृपया।

+0

क्या PHP को निश्चित रूप से उस फ़ाइल को पढ़ने की अनुमति है? कमांड लाइन से स्क्रिप्ट चलाने का प्रयास करें: php my.php – Greg

+0

अजीब! जैसा आपने कहा था मैंने इसका परीक्षण किया, और यह पूरी तरह से काम किया! यह कमांड लाइन से क्यों काम करेगा, लेकिन ब्राउजर नहीं? – Magsol

+0

http://serverfault.com/questions/121768/curl-or-ssl-problems-how-to-solve/297484#297484 –

उत्तर

11

क्योंकि चीजें कमांड लाइन के माध्यम से काम करती हैं लेकिन कर्ल का उपयोग करके php के माध्यम से नहीं तो मैं समस्या को कर्ल का पीछा करता हूं।

इस URL, http://curl.haxx.se/docs/sslcerts.html है, जो एक में संदर्भ था, इसलिए पोस्ट आप ऊपर उद्धृत (reading SSL page with CURL (php)) ... के अनुसार

"7.18.0 तक, कर्ल गया था कि द्वारा स्थापित एक गंभीर रूप से पुरानी सीए बंडल फ़ाइल बंडल डिफ़ॉल्ट। इन दिनों, कर्ल अभिलेखागार में पर कोई सीए कर्ट शामिल नहीं है। आपको उन्हें कहीं और प्राप्त करने की आवश्यकता है। उदाहरण के लिए नीचे देखें।

यदि रिमोट सर्वर एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करता है, यदि आप कोई इंस्टॉल नहीं करते हैं सीए प्रमाण बंडल, यदि सर्वर एक सीए द्वारा हस्ताक्षरित प्रमाणपत्र का उपयोग करता है जो नहीं है I बंडल आप उपयोग में ncluded या यदि दूरस्थ होस्ट बहरूपिया अपने पसंदीदा साइट नाम से कार्य है, और आप इस सर्वर से फ़ाइलों को हस्तांतरण करने के लिए, निम्न में से एक कार्य हैं: "

यह तो एक नंबर सूचीबद्ध करने के लिए पर चला जाता है आप जिस कदम का प्रयास कर सकते हैं।

चूंकि आपका 7.16.3 संस्करण कर्ल 7.18.0 से पहले है, यदि आपके पास पहले से नहीं है, तो मैं आपके कर्ल और ओपनएसएल घटकों को अपडेट करने और फिर ऊपर उल्लिखित सूची के माध्यम से काम करने की अनुशंसा करता हूं।

3

अब यह प्रश्न बहुत पुराना है, लेकिन हो सकता है कि कुछ उपयोगकर्ता वर्तमान में उत्तर देने के लिए उपयोगी हो सकें।

मुझे एसएसएल के साथ एक एपीआई के बारे में एक ही समस्या है, जिसमें कर्ल (ब्राउज़र के साथ नहीं) के साथ समस्याएं हैं, मेरी समस्या यह थी कि मैंने प्रमाणपत्र प्रमाणित किया लेकिन सीरिटिफिकेट श्रृंखला/बंडल नहीं। तब मैंने उसे रखा और चीजें काम करना शुरू कर दिया। तो समस्याओं से बचने के लिए यह महत्वपूर्ण है।

आशा है कि यह किसी के लिए उपयोगी हो सकता है।

5

प्रश्न के 6 साल बाद, मैं एक साझा मेजबान पर एक ही समस्या को पूरा करता हूं, और जाहिर है कि कोई संतोषजनक उत्तर नहीं है। मैंने खुद को एक समाधान पाया, उम्मीद है कि यह सभी के लिए उपयोगी होगा।

आप इस config कोशिश कर सकते हैं:

curl_setopt($config,CURLOPT_SSL_VERIFYHOST,0); 
curl_setopt($config,CURLOPT_SSL_VERIFYPEER,1); 
curl_setopt($config,CURLOPT_CAINFO,'ca-bundle.crt'); 
curl_setopt($config,CURLOPT_CAPATH,'ca-bundle.crt'); 

मैं @Magsol के साथ एक ही त्रुटि मिले: Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none; इसलिए मैंने सीएपीएथ सेट करने के लिए चौथी लाइन जोड़ा।

यह मेरे साथ काम करता है। लेकिन ध्यान दें, सीए फ़ाइल एक्सेस करने योग्य डीआईआर (chmod 755 या 777 के साथ) में होनी चाहिए और यह बेहतर होगा अगर सीए फ़ाइल PHP फ़ाइल के साथ एक ही डीआईआर में है।

+0

यह काम किया, ** केवल अगर मैं निरपेक्ष पथ के रूप में पथ सेट ** ... यदि आपके पास कॉलिंग PHP फ़ाइल के समान निर्देशिका में 'ca-bundle.crt' है, तो इसका मतलब है कि पथ वास्तव में '__DIR __।'/ca-bundle.crt'' –

0

विस्तृत है और इस निष्कर्ष निकालने के लिए:

यदि आप PHP कर्ल का उपयोग कर एक PHP फ़ाइल है और एक ही निर्देशिका में अपने सिस्टम के लिए CA प्रमाणपत्र जगह, नीचे दिए गए कोड आप एक तुरत प्रारम्भ

$url = "https://myserver.mydomain.local/get_somedata.php"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 

//These next lines are for the magic "good cert confirmation" 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_VERBOSE, true); 

//for local domains: 
//you need to get the pem cert file for the root ca or intermediate CA that you signed all the domain certificates with so that PHP curl can use it...sorry batteries not included 
//place the pem or crt ca certificate file in the same directory as the php file for this code to work 
    curl_setopt($ch, CURLOPT_CAINFO, __DIR__.'/cafile.pem'); 
    curl_setopt($ch, CURLOPT_CAPATH, __DIR__.'/cafile.pem'); 

//DEBUG: remove slashes on the next line to prove "SSL verify" is the cause  
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

//Error handling and return result 
    if (curl_exec($ch) === false) 
     { 
     $result = curl_error($ch); 
     } 
    else 
     { 
     $result = curl_exec($ch); 
     } 
    // Close handle 
    curl_close($ch); 
    return $result; 
दे देंगे
+0

ओप्स होगा यदि अंत में कथन खींचता है डबल कॉल ... मेरा बुरा, –

+0

$ डेटा = curl_exec ($ ch) के रूप में समायोजित करें; यदि ($ डेटा === झूठा) { $ परिणाम = curl_error ($ ch); } अन्य { $ परिणाम = $ डेटा; } –

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