कर्ल त्रुटि 60, एसएसएल प्रमाणपत्र मुद्दा: प्रमाण पत्र श्रृंखला में स्वयं हस्ताक्षरित प्रमाण पत्र


81

मैं अपने सही APP_ID, APP_SECRET आदि के साथ कर्ल अनुरोध भेजने की कोशिश करता हूं

  https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI 

मुझे इससे access_token प्राप्त करने की आवश्यकता है, लेकिन एक FALSE प्राप्त करें और curl_error()अगले संदेश को प्रिंट करें अन्यथा:

60: SSL certificate problem: self signed certificate in certificate chain

मेरा कोड है:

    // create curl resource
    $ch = curl_init();

    // set url
    curl_setopt($ch, CURLOPT_URL, $url);
    //return the transfer as a string
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // $output contains the output string
    $output = curl_exec($ch);
    if ( ! $output) {
        print curl_errno($ch) .': '. curl_error($ch);
    }

    // close curl resource to free up system resources
    curl_close($ch);

    return $output;

जब मैं मैन्युअल रूप से उपरोक्त लिंक पर जाता हूं, तो मुझे access_token अच्छी तरह से मिलता है। यह कर्ल के साथ काम क्यों नहीं करता है? कृपया मदद करें।


हो सकता है कि मुझे .crtनिरोध के साथ प्रमाण पत्र प्राप्त करने की आवश्यकता हो ? लेकिन मैं नहीं जानता कि उसे कैसे मिलेगा
विक्टर बोकार्स्की

1
कृपया [टूटे] स्वीकृत उत्तर से बचें। इसके बजाय @ erlangsec के उत्तर का उपयोग करें। इसके अलावा दुनिया में सबसे खतरनाक कोड देखें : गैर-ब्राउज़र सॉफ़्टवेयर में एसएसएल प्रमाणपत्रों को मान्य करना
jww

जवाबों:


180

अक्षम करने का सुझाव देने वाले उत्तर CURLOPT_SSL_VERIFYPEERस्वीकार नहीं किए जाने चाहिए। सवाल यह है कि "यह cURL के साथ काम क्यों नहीं करता है", और जैसा कि मार्टिज़न होल्स ने सही ढंग से कहा है, यह खतरनाक है।

त्रुटि शायद CA रूट प्रमाणपत्रों के अप-टू-डेट बंडल नहीं होने के कारण होती है। यह आमतौर पर एक क्रिप्टोग्राफिक हस्ताक्षर का एक गुच्छा के साथ एक पाठ फ़ाइल है जो कर्ल होस्ट के एसएसएल प्रमाणपत्र को सत्यापित करने के लिए उपयोग करता है।

आपको यह सुनिश्चित करने की आवश्यकता है कि आपके PHP की स्थापना में इन फ़ाइलों में से एक है, और यह आज तक है (अन्यथा यहां एक डाउनलोड करें: http://curl.haxx.se/docs/caextract.html )।

फिर php.ini में सेट करें :

curl.cainfo = <absolute_path_to> cacert.pem

यदि आप इसे रनटाइम पर सेट कर रहे हैं, तो उपयोग करें:

curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");

1
धन्यवाद, लेकिन मैं बाहरी एपीआई के साथ काम करने के लिए एक सुझाव की तलाश में था। तो यह सुझाव, कि @SabujHassan का प्रस्ताव काम है, और, जैसा कि मैंने समझा, एपीआई जिसका मैंने उपयोग किया है, एसएसएल प्रदान नहीं करता है।
विक्टर बोकार्स्की

उत्कृष्ट समाधान। बहुत बहुत धन्यवाद :)
चन्द्र नक्ष

1
जादू की तरह काम करता है। यह उत्तर होना चाहिए, "स्वीकृत उत्तर" आसान है लेकिन सुरक्षा कारणों से एक बुरा तरीका है।
कृतिकांट

धन्यवाद, जैसा कि कहा गया है कि शानदार काम करता है! यह वास्तव में सही उत्तर होना चाहिए।
पोस्टमन्स

2
यह ध्यान देने योग्य बात कि curl.cainfo PHP 7.1 / 7.2 में phpinfo () में नहीं दिखाई देता है, हालांकि Opensl.cafile करता है। php.net/manual/en/curl.configuration.php
एलियाह लिन

58

यह समाधान खतरनाक है और अनुशंसित नहीं है :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

SSL सहकर्मी सत्यापन को अक्षम करना एक अच्छा विचार नहीं है। ऐसा करने से MITM हमलावरों के लिए आपके अनुरोध का खुलासा हो सकता है।

वास्तव में, आपको बस अप-टू-डेट सीए रूट प्रमाणपत्र बंडल की आवश्यकता है। किसी अद्यतन को स्थापित करना उतना ही आसान है:

  1. CURL वेबसाइटcacert.pem से अप-टू-डेट फ़ाइल डाउनलोड करना और

  2. अपनी php.ini फ़ाइल में इसके लिए एक पथ सेट करना, जैसे विंडोज पर:

    curl.cainfo=c:\php\cacert.pem

बस!

सुरक्षित और सुरक्षित रहें।


5
यदि आप वैश्विक php.iniफ़ाइल को संपादित करने का अधिकार नहीं रखते हैं, तो आप इस विकल्प को अपने कोड में भी सेट कर सकते हैं : curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
zxcmehran

2
देव परिवेश पर काम किया
cmedeiros

2
देव env पर परीक्षण के लिए अच्छा है
गौरव राय

यह भयानक सलाह है और जवाब को हटा दिया जाना चाहिए।
miken32

4
@ miken32 हाँ और फिर मैं खतरनाक वैकल्पिक हल के प्रतिस्थापन के रूप में एक वैकल्पिक सुरक्षित समाधान का सुझाव देता हूं। अंत तक पढ़ते रहिए।
zxcmehran

3

यदि SSL प्रमाणपत्र आपके सिस्टम में ठीक से स्थापित नहीं है, तो आपको यह त्रुटि मिल सकती है:

cURL त्रुटि 60: एसएसएल प्रमाणपत्र समस्या: स्थानीय जारीकर्ता प्रमाण पत्र प्राप्त करने में असमर्थ।

आप इस समस्या को निम्नानुसार हल कर सकते हैं:

Https://curl.haxx.se/ca/cacert.pem से प्रमाणपत्रों की अद्यतन सूची के साथ एक फ़ाइल डाउनलोड करें

डाउनलोड की गई cacert.pemफ़ाइल को अपने सिस्टम में कुछ सुरक्षित स्थान पर ले जाएं

अपनी php.iniफ़ाइल को अपडेट करें और उस फ़ाइल का पथ कॉन्फ़िगर करें:


इसके अलावा, आपको openssl.cafile="C:/dev/ssl/mywebsite.local.crt"­php.ini
फ्रैंकोइस ब्रेटन में

3

महत्वपूर्ण: इस मुद्दे ने मुझे कुछ दिनों के लिए पागल कर दिया और मैं यह पता नहीं लगा सका कि मेरे कर्ल और ओपनसेल प्रतिष्ठानों के साथ क्या हो रहा था। मुझे अंत में पता चला कि यह मेरा इंटरमीडिएट सर्टिफिकेट था (मेरे मामले में, गोआड्डी) जो पुराना था। मैं अपने godaddy SSL व्यवस्थापक पैनल पर वापस गया, नया मध्यवर्ती प्रमाणपत्र डाउनलोड किया, और समस्या गायब हो गई।

मुझे यकीन है कि यह आप में से कुछ के लिए मुद्दा है।

जाहिरा तौर पर, GoDaddy ने कुछ मुद्दों पर अपने मध्यवर्ती प्रमाणपत्र को बदल दिया था, क्योंकि वे अब इस चेतावनी को प्रदर्शित करते हैं:

"कृपया अपने डाउनलोड किए गए बंडल में शामिल नए SHA-2 मध्यवर्ती प्रमाणपत्रों का उपयोग करना सुनिश्चित करें।"

आशा है कि यह आप में से कुछ को मदद करता है, क्योंकि मैं पागल हो रहा था और इसने मेरे सभी सर्वरों पर समस्या को साफ कर दिया।


हालांकि प्रश्न से बिल्कुल संबंधित नहीं है, यह सामान्य रूप से व्यवहार्य जानकारी पेश कर सकता है।
peter.hrasko.sk

त्रुटि संदेश कर्ल का उत्पादन कभी-कभी गूढ़ और भ्रामक हो सकता है, और मुझे यकीन है कि कुछ लोग जो "स्व-हस्ताक्षरित प्रमाण पत्र" प्राप्त कर रहे थे, त्रुटि मुझे क्विक आई के कारण मिल रही थी। मैं यह भी जोड़ना चाहता हूं कि जब कर्ल का निर्माण होता है, तो मैं कॉन्फ़िगर स्ट्रिंग का उपयोग करता हूं: / .configure --with-ca-बंडल = / etc / ssl / certs / ca-bundle.crt और मैंने पर्ल स्क्रिप्ट / mk का भी उपयोग किया है -ca-bundle.pl एक अच्छा ताज़ा ca-bundle.crt फ़ाइल उत्पन्न करने के लिए। मैं अपाचे वेब सर्वर का उपयोग कर रहा था, लेकिन मैंने अपने मौजूदा मध्यवर्ती प्रमाण पत्र को गोडैडी के अपडेटेड के साथ प्रतिस्थापित नहीं किया था।
ली

-3

त्रुटि: एसएसएल प्रमाणपत्र समस्या: प्रमाणपत्र श्रृंखला में स्वयं हस्ताक्षरित प्रमाण पत्र

Solution:
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);    
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.