HTTPS और SSL3_GET_SERVER_CERTIFICATE: प्रमाणपत्र सत्यापित विफल हुआ, CA ठीक है


208

मैं विकास के लिए XAMPP का उपयोग कर रहा हूं । हाल ही में मैंने अपने पुराने संस्करण से 1.7.3 तक xampp की स्थापना को उन्नत किया।

अब जब मैं HTTPS सक्षम साइटों को कर्ल करता हूं तो मुझे निम्नलिखित अपवाद मिलते हैं

घातक त्रुटि: संदेश 'CURL संसाधन के साथ अपवाद' RequestCore_Exception ': संसाधन आईडी # 55; cURL त्रुटि: SSL प्रमाणपत्र समस्या, सत्यापित करें कि CA प्रमाणपत्र ठीक है। विवरण: त्रुटि: 14090086: एसएसएल दिनचर्या: SSL3_GET_SERVER_CERTIFICATE: प्रमाणपत्र सत्यापन विफल (60) '

हर कोई इस समस्या को ठीक करने के लिए PHP कोड से कुछ विशिष्ट कर्ल विकल्पों का उपयोग करने का सुझाव देता है। मुझे लगता है कि यह तरीका नहीं होना चाहिए। क्योंकि मुझे XAMPP के अपने पुराने संस्करण से कोई समस्या नहीं थी और नए संस्करण को स्थापित करने के बाद ही हुआ।

मुझे यह पता लगाने में मदद चाहिए कि मेरे PHP इंस्टॉलेशन में कौन-सी सेटिंग्स बदलती हैं, अपाचे आदि इस समस्या को ठीक कर सकते हैं।

जवाबों:


145

कर्ल को स्वीकृत सीए की सूची में शामिल किया गया था, लेकिन अब कोई सीए सीर्ट्स बंडल नहीं करता है। इसलिए डिफ़ॉल्ट रूप से यह सभी SSL प्रमाणपत्रों को अस्वीकार्य माना जाएगा।

आपको अपने CA का प्रमाणपत्र और बिंदु कर्ल प्राप्त करना होगा। सर्वर SSL प्रमाणपत्र पर cURLS के विवरण के बारे में अधिक जानकारी ।


4
कर्ल अमेज़ॅन वेब सेवाओं php लाइब्रेरी में हो रहा है। मुझे समझ नहीं आया कि लाइब्रेरी कोड को संपादित किए बिना इसे कैसे ठीक किया जाए।
जोसनीधिन

41
फिर प्रमाणपत्र सत्यापन बंद करें ( CURLOPT_SSL_VERIFYPEER-> गलत)। आप या तो उस साइट का CA प्रमाणपत्र जोड़ते हैं जिसे आप SSL के साथ करने का प्रयास कर रहे हैं, या आप CA सत्यापन को अक्षम करते हैं। वे केवल दो विकल्प उपलब्ध हैं।
मार्क बी

78
बस फीजी - एसएसएल का उपयोग करने के उद्देश्य CURLOPT_SSL_VERIFYPEERको falseपराजित करना।
जब तक

13
@ क्या यह एसएसएल के आधे उद्देश्य को नहीं हरा सकता है ? आपके और आपके साथी के बीच अभी भी गोपनीयता है: आपके पास अपने सहकर्मी की प्रामाणिकता नहीं है।
मार्क फॉक्स

10
प्रामाणिकता के बिना, आपके द्वारा भेजे जा रहे डेटा को एन्क्रिप्ट करने में क्या बात है? यदि आपको MITMed किया गया है, तो डेटा वैसे भी समझौता किया जाता है
hdgarrood

290

यह विंडोज में एक बहुत ही आम समस्या है। आपको बस सेट cacert.pemकरने की जरूरत है curl.cainfo

PHP 5.3.7 के बाद से आप कर सकते हैं:

  1. https://curl.haxx.se/ca/cacert.pem डाउनलोड करें और इसे कहीं सहेजें।
  2. अद्यतन php.ini- curl.cainfo = "PATH_TO / cacert.pem" जोड़ें

अन्यथा आपको प्रत्येक CURL संसाधन के लिए निम्न कार्य करने होंगे:

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

2
यह ओएस एक्स पर XAMPP में मेरे लिए काम करता है। यह एक समस्या तय करता है जहां एक स्थानीय प्रमाणपत्र खोजने में असमर्थ होने के कारण एक वर्डप्रेस प्लगइन अपडेट नहीं होगा।
जोनाथन निकोल

8
किसी और को अपाचे का उपयोग करके विंडोज पर इस समस्या को हल करने की कोशिश करने के लिए, मुझे अपने PHP कोड में पूरा रास्ता (यानी C: \ PATH_TO \ cacert.pem) सेट करना पड़ा। IIS पर, सापेक्ष पथ ठीक काम करता था।
http203

यदि cacert.pem उसी निर्देशिका में है, तो curl_setopt ($ ch, CURLOPT_CAINFO, dirname ( FILE )। '/cacert.pem'); काम करेगा
मुजफ्फर

7
WampServer का उपयोग करते समय 2., आपको चर को दो अलग-अलग php.iniफ़ाइलों में जोड़ना होगा । Stackoverflow.com/a/25706713/1101095
Nate

क्या विचित्र / विडंबना है कि आप बिना किसी अतिरिक्त विकल्प को बताए HTTPS पर curl.haxx.se/ca/cacert.pem डाउनलोड कर सकते हैं। क्या curl.haxx.se का प्रमाणपत्र कर्ल में ही समर्थित है?
qbolec

84

चेतावनी: यह उन सुरक्षा मुद्दों को प्रस्तुत कर सकता है जो SSL आपके संपूर्ण कोडबेस असुरक्षित का बचाव करने के लिए डिज़ाइन किया गया है। यह हर अनुशंसित अभ्यास के खिलाफ जाता है।

लेकिन एक बहुत ही साधारण फिक्स जो मेरे लिए काम करता था उसे कॉल करना था:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

फोन करने से पहले:

curl_exec():

php फ़ाइल में।

मेरा मानना ​​है कि यह एसएसएल प्रमाणपत्रों के सभी सत्यापन को अक्षम करता है।


65
... और प्रमाणपत्रों के सत्यापन को अक्षम करके, आप संभावित MITM हमलों के लिए दरवाजा खुला छोड़ देते हैं, जिन्हें SSL / TLS से बचाना है। यह मत करो!
ब्रूनो

12
हाँ। मुझे उत्तर में इस पर अधिक ध्यान आकर्षित करना चाहिए था। ऐसा तभी करें जब आप किसी महत्वपूर्ण चीज पर काम नहीं कर रहे हों। मैं इसका उपयोग स्थानीयहोस्ट पर उन वेबसाइटों तक पहुंचने के लिए करता हूं जिन्हें मैंने व्यक्तिगत रूप से प्रोग्राम किया था।
क्रिस डुट्रो

3
मेरे नीचे से। यह आपके कोड को काम करने के लिए एक गंदा फिक्स है, लेकिन समाधान नहीं। Артур Курицын द्वारा प्रदान किया गया उत्तर बहुत बेहतर है।
इलिजा

2
@Bruno यह सही समाधान है, सहायक स्क्रिप्ट, परीक्षण, विश्वसनीय अनुप्रयोग, इंट्रानेट, ..... के बारे में जो हर कोई एसएसएलटी के बारे में जानता है, जानता है कि किन मामलों में प्रमाण पत्र सत्यापन को छोड़ दिया जा सकता है। तो इस जवाब पर सभी 'स्मार्ट ’टिप्पणियां और' DON'T DO THIS’ जैसी बातें सिर्फ NONSENSE है !!
केनेकोर्न केटसोम्बुत

5
... " हर कोई जो एसएसएलटी [...] के बारे में एक थोड़ा जानता है ... " और आपको आश्चर्य होगा कि कितने लोग एसएसएल / टीएलएस की मूल बातें के बारे में थोड़ा भी जानने की जहमत नहीं उठाते हैं, और बस आ रहे हैं अपनी त्रुटि संदेश के लिए एक त्वरित समाधान कॉपी / पेस्ट करने के लिए यहां।
ब्रूनो

53

स्रोत: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

कर्ल: एसएसएल प्रमाणपत्र समस्या, सत्यापित करें कि CA प्रमाणपत्र ठीक है

07 अप्रैल 2006

कर्ल के साथ एक सुरक्षित यूआरएल खोलने पर आपको निम्नलिखित त्रुटि मिल सकती है:

SSL प्रमाणपत्र समस्या, सत्यापित करें कि CA प्रमाणपत्र ठीक है

मैं बताऊंगा कि त्रुटि क्यों हुई और आपको इसके बारे में क्या करना चाहिए।

त्रुटि से छुटकारा पाने का सबसे आसान तरीका आपकी स्क्रिप्ट में निम्नलिखित दो पंक्तियों को जोड़ना होगा। यह समाधान एक सुरक्षा जोखिम उत्पन्न करता है।

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

देखते हैं कि यह दो पैरामीटर क्या करते हैं। मैनुअल का हवाला देते हुए।

CURLOPT_SSL_VERIFYHOST : 1 SSL सहकर्मी प्रमाणपत्र में एक सामान्य नाम के अस्तित्व की जांच करने के लिए। 2 एक सामान्य नाम के अस्तित्व की जांच करने के लिए और यह भी सत्यापित करें कि यह प्रदान किए गए होस्टनाम से मेल खाता है।

CURLOPT_SSL_VERIFYPEER : सहकर्मी के प्रमाणपत्र को सत्यापित करने से CURL को रोकने के लिए FALSE। के खिलाफ सत्यापित करने के लिए वैकल्पिक प्रमाणपत्र CURLOPT_CAINFO विकल्प के साथ निर्दिष्ट किए जा सकते हैं या CURLOPT_CAPATH विकल्प के साथ एक प्रमाणपत्र निर्देशिका निर्दिष्ट की जा सकती है। CURLOPT_SSL_VERIFYHOST को TRUE या FALSE होने की आवश्यकता हो सकती है यदि CURLOPT_SSL_VERIFYPEER अक्षम है (यह 2 में चूक करता है)। CURLOPT_SSL_VERIFYHOST को 2 पर सेट करना (यह डिफ़ॉल्ट मान है) यह गारंटी देगा कि आपके द्वारा प्रस्तुत किए जा रहे प्रमाणपत्र में URN से मेल खाता एक सामान्य नाम है जिसे आप दूरस्थ संसाधन तक पहुंचने के लिए उपयोग कर रहे हैं। यह एक स्वस्थ जाँच है, लेकिन इससे आपके प्रोग्राम को राहत नहीं मिलने की गारंटी नहीं है।

'बीच में आदमी' दर्ज करें

आपके प्रोग्राम को इसके बजाय किसी अन्य सर्वर से बात करने में गुमराह किया जा सकता है। यह कई तंत्रों के माध्यम से प्राप्त किया जा सकता है, जैसे कि डीएनएस या एआरपी विषाक्तता (यह एक और दिन के लिए एक कहानी है)। घुसपैठिया उसी 'कॉमन नाम' के साथ एक प्रमाण पत्र पर स्व-हस्ताक्षर भी कर सकता है जो आपका कार्यक्रम अपेक्षित है। संचार अभी भी एन्क्रिप्ट किया जाएगा, लेकिन आप अपने रहस्यों को दूर करने वाले को दे देंगे। इस तरह के हमले को 'मैन इन द मिडल' कहा जाता है।

'बीच में आदमी' को हराना

ठीक है, हमें यह सत्यापित करने की आवश्यकता है कि जो प्रमाण पत्र हमें प्रस्तुत किया जा रहा है वह वास्तविक के लिए अच्छा है। हम इसे एक ऐसे सर्टिफिकेट से तुलना करते हैं, जिसे हम उचित / भरोसेमंद मानते हैं।

यदि दूरस्थ संसाधन को मुख्य CA के Verisign, GeoTrust et al जैसे किसी प्रमाणपत्र द्वारा जारी किया गया है, तो आप मोज़िला के CA प्रमाणपत्र बंडल से सुरक्षित रूप से तुलना कर सकते हैं, जिसे आप http://curl.haxx.se/docs-caextract से प्राप्त कर सकते हैं .html

फ़ाइल cacert.pemको अपने सर्वर में कहीं सहेजें और अपनी स्क्रिप्ट में निम्न विकल्प सेट करें।

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

उपरोक्त सभी जानकारी के लिए क्रेडिट जाता है: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html


38
यह आमतौर पर आपकी जानकारी के स्रोत को श्रेय देने के लिए विनम्र माना जाता है और केवल प्रश्न के लिए प्रासंगिक कुछ भागों को उद्धृत करता है, बजाय यहाँ पर इसे कॉपी और पेस्ट किए!
डैन हर्ड

1
क्षमा करें, मैं दूर रहा हूँ, हाँ, मैं इसके लिए डैन को नियुक्त कर रहा हूँ और अपडेट किया गया है
दीपक ओबेरॉय

6
कम से कम दीपक ने इस पर शोध करने का प्रयास किया। @danherd तो danherd, आपने सिर्फ यह पता लगाने के लिए शोध किया कि उसने कहीं से कोड लिया था? इस कोड का एट्रिब्यूशन अधिकार क्या था? किसी और की गलतियों को खोजने के लिए अपना समय बर्बाद करने के बजाय अपने दम पर किसी की मदद करने की कोशिश करें। लड़ाई मत करो, साझा करें!
GTodorov

17

उपरोक्त समाधान महान हैं, लेकिन यदि आप WampServer का उपयोग कर रहे हैं, तो आप curl.cainfoचर को अंदर सेट कर सकते हैंphp.ini काम न करने दें।

मैंने अंततः पाया कि WampServer में दो php.iniफाइलें हैं:

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

पहली बार जाहिरा तौर पर तब इस्तेमाल किया जाता है जब PHP फ़ाइलों को वेब ब्राउज़र के माध्यम से मंगाया जाता है, जबकि दूसरी का उपयोग तब किया जाता है जब एक कमांड कमांड या या के माध्यम से आह्वान किया जाता है shell_exec()

टी एल; डॉ

यदि WampServer का उपयोग कर रहे हैं, तो आपको दोनों फ़ाइलों के लिए curl.cainfoलाइन जोड़ना होगा । php.ini


6

सभी के प्यार के लिए पवित्र ...

मेरे मामले में, मुझे सेट करना पड़ा openssl.cafile PHP कॉन्फिग चर को PEM फ़ाइल पथ ।

मुझे विश्वास है कि यह बहुत सही है कि curl.cainfoPHP के विन्यास में ऐसी कई प्रणालियाँ हैं जिनकी आवश्यकता है, लेकिन जिस वातावरण में मैं काम कर रहा हूँ, वह है eboraas / laravel कंटेनर है, जो डेबियन 8 (जेसी) और पीएचपी का उपयोग करता है 5.6, उस चर को सेट करने से चाल नहीं चली।

मैंने देखा कि आउटपुट php -iमें उस विशेष विन्यास सेटिंग के बारे में कुछ भी उल्लेख नहीं किया गया था, लेकिन इसमें कुछ लाइनें थीं openssl। इसमें विकल्प openssl.capathऔर openssl.cafileविकल्प दोनों हैं , लेकिन PHP के माध्यम से दूसरे अनुमति वाले कर्ल को सेट करना आखिरकार HTTPS URL के साथ ठीक है।


धन्यवाद! Curl.cainfo को सेट करना मेरे लिए या तो काम नहीं करता था, लेकिन सेटिंग को खोल देता है। मैं XAMPP और PHP 7.1.1 के साथ विंडोज 7 पर हूं।
नॉजमिलोस

@knezmilos आप के बारे में कैसे चला गया खुलने की सेटिंग। आपने कहां डाउनलोड किया, और आप इसे कैसे सक्रिय करते हैं?
क्राइस्ट

ठीक है, यह थोड़ी देर का समय है लेकिन मुझे लगता है कि यह कुछ इस तरह है: curl.cainfo = "C: \ xampp \ cacert \ cacert.pem" और phsl.cafile = "C: \ xampp \ cacert \ cacert.pem" को php में। ini, जबकि मुझे लगता है कि मुझे जवाब में से एक से pem फ़ाइल मिली है।
knezmilos

1
"सभी के प्यार के लिए जो पवित्र है ..." वास्तव में। यह मेरे Ubuntu 18.08 / Apache / Php7.2 सेटअप के लिए काम करता है। यदि कर्ल त्रुटि सही फ़ाइल की ओर इशारा करती है, तो यह निश्चित रूप से ओपनस्ल्स फॉल्ट है
JTG

4

कभी-कभी यदि आप जिस एप्लिकेशन से संपर्क करने का प्रयास करते हैं उसके पास स्व हस्ताक्षरित प्रमाण पत्र होते हैं, http://curl.haxx.se/ca/cacert.pem से सामान्य cacert.pem समस्या का समाधान नहीं करता है।

यदि आप सेवा समापन बिंदु url के बारे में सुनिश्चित हैं, तो इसे ब्राउज़र के माध्यम से हिट करें, "X 509 प्रमाणपत्र श्रृंखला (PEM)" प्रारूप में मैन्युअल रूप से प्रमाण पत्र को सहेजें। इस प्रमाण पत्र फ़ाइल को बिंदु के साथ इंगित करें

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   

4

मुझे amazon AMI linux पर वही त्रुटि है।

मैंने /etc/php.d/curl.ini पर curl.cainfo सेट करके हल किया

https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

अतिरिक्त अक्टूबर 2018

अमेज़न लिनक्स v1 पर इस फ़ाइल को संपादित करें

vi /etc/php.d/20-curl.ini

इस लाइन को जोड़ने के लिए

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"

बहुत बहुत धन्यवाद! मैंने यह सवाल करने के लिए अद्यतन किया कि मैंने ऐसा क्या किया जिससे मेरे लिए समस्या का समाधान हो गया, बजाय एक और उत्तर देने के।
टिम

3

CURLOPT_CAINFO के लिए कर्ल विकल्प सेट करते समय कृपया एकल उद्धरणों का उपयोग करना याद रखें, दोहरे उद्धरण चिह्नों का उपयोग केवल एक और त्रुटि का कारण होगा। तो आपका विकल्प इस तरह दिखना चाहिए:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

इसके अतिरिक्त, आपकी php.ini फ़ाइल सेटिंग में इस प्रकार लिखा जाना चाहिए: (मेरे दोहरे उद्धरणों पर ध्यान दें)

curl.cainfo = "C:\wamp\www\mywebfolder"

मैं इसे सीधे रेखा के नीचे रखता हूं जो यह कहता है: extension=php_curl.dll

(केवल उद्देश्यों को व्यवस्थित करने के लिए, आप इसे अपने भीतर कहीं भी रख सकते हैं php.ini, मैंने इसे केवल एक और कर्ल संदर्भ के करीब रखा है, इसलिए जब मैं कीवर्ड कर्ल का उपयोग करके खोज करता हूं तो मुझे लगता है कि दोनों कर्ल संदर्भ एक क्षेत्र में मिलते हैं।)


1
मुझे आशा है कि php.ini को अपने पैरेंट फोल्डर के बजाय pem फाइल की ओर संकेत करना चाहिए
dejjub-AIS

2

जब मैं www.googleapis.com से एक पृष्ठ प्राप्त करने के लिए गुज़लहेट्प (मैक पर php + अपाचे) प्राप्त करने की कोशिश कर रहा था, तो मैं यहाँ समाप्त हुआ।

यहाँ मेरा अंतिम समाधान था कि यह किसी की मदद करे।

जो भी डोमेन आपको यह त्रुटि दे रहा है, उसके लिए प्रमाणपत्र श्रृंखला देखें। मेरे लिए यह googleapis.com था

openssl s_client -host www.googleapis.com -port 443

आपको कुछ इस तरह वापस मिलेगा:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

नोट: आपकी समस्या के ठीक बाद मैंने इसे कैप्चर कर लिया है, आपकी चेन आउटपुट अलग दिख सकती है।

फिर आपको php में अनुमत प्रमाणपत्रों को देखना होगा। एक पृष्ठ में phpinfo () चलाएँ।

<?php echo phpinfo();

फिर पृष्ठ आउटपुट से लोड की गई प्रमाणपत्र फ़ाइल देखें:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

यह वह फ़ाइल है जिसे आपको सही प्रमाण पत्र जोड़कर ठीक करना होगा।

sudo nano /usr/local/php5/ssl/certs/cacert.pem

आपको मूल रूप से इस फ़ाइल के अंत में सही प्रमाण पत्र "हस्ताक्षर" संलग्न करना होगा।

आप उनमें से कुछ को यहां देख सकते हैं: यदि आपको उनकी आवश्यकता है तो आपको श्रृंखला में अन्य लोगों के लिए Google को खोजना होगा।

वे इस तरह दिखते हैं:

उदाहरण प्रमाण पत्र छवि

( नोट: यह एक छवि है, इसलिए लोग स्टैकओवरफ़्लो से प्रमाण पत्र की कॉपी / पेस्ट नहीं करेंगे )

एक बार सही सर्टिफिकेट इस फाइल में होने के बाद, अपाचे को फिर से शुरू करें और परीक्षण करें।


0

आप ca-certificatesपैकेज को पुन: स्थापित करने का प्रयास कर सकते हैं , या स्पष्ट रूप से यहां वर्णित प्रमाण पत्र की अनुमति दे सकते हैं


-5

समाधान बहुत सरल है! इस लाइन को पहले रखें curl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

मेरे लिए यह काम करता है।


7
कभी भी, कभी भी सहकर्मी सत्यापन को अक्षम न करें जब तक कि आपको परवाह न हो कि डेटा पारगमन में समझौता किया गया है या नहीं।
rdlowrey

माना। अगर आप एक सुरक्षित ऐप चाहते हैं तो आपको पीयर वेरिफिकेशन की जरूरत है।
ब्रैडेन

2
"कभी नहीं, कभी भी सहकर्मी सत्यापन अक्षम करें" आप जिस डिफ़ॉल्ट ब्राउज़र कार्यक्षमता को चाहते हैं, उसे लाइक करें। इसके अलावा, यह इतना नीचे क्यों है? यह एकमात्र ऐसा उत्तर है, जो संक्षिप्त, मीठा, बिंदु तक और प्रभावी है।
एडम एफ

@AdamF FYI करें, ब्राउज़र डिफ़ॉल्ट रूप से सहकर्मी प्रमाणपत्र को सत्यापित करते हैं, वे केवल आपको चेतावनी के साथ मैन्युअल रूप से त्रुटियों को बायपास करने का विकल्प देते हैं।
ब्रूनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.