[php] HTTPS और SSL3_GET_SERVER_CERTIFICATE: प्रमाणपत्र सत्यापित विफल रहा, सीए ठीक है


Answers

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

चूंकि PHP 5.3.7 आप कर सकते हैं:

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

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

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

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

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

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

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

मुझे यह पता लगाने में मदद की ज़रूरत है कि मेरी PHP स्थापना में कौन सी सेटिंग्स बदलती हैं, अपाचे इत्यादि इस समस्या को ठीक कर सकती हैं।




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

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

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

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




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

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

07 अप्रैल 2006

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

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

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

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

//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 एसएसएल पीयर प्रमाणपत्र में एक सामान्य नाम के अस्तित्व की जांच करने के लिए। 2 एक सामान्य नाम के अस्तित्व की जांच करने के लिए और यह भी सत्यापित करें कि यह प्रदान किए गए होस्टनाम से मेल खाता है।

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

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

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

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

खैर, हमें प्रमाणित करने की आवश्यकता है कि हमें प्रस्तुत प्रमाण पत्र वास्तविक के लिए अच्छा है। हम इसे प्रमाण पत्र * विश्वास के मुकाबले तुलना करके करते हैं।

यदि रिमोट रिसोर्सेज को मुख्य सीए जैसे वेरिज़िग, जियोट्रस्ट एट अल द्वारा जारी प्रमाण पत्र द्वारा संरक्षित किया जाता है, तो आप आसानी से मोज़िला के सीए प्रमाणपत्र प्रमाण पत्र के खिलाफ तुलना कर सकते हैं जिसे आप http://curl.haxx.se/docs/caextract.html से प्राप्त कर सकते हैं 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




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

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

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



Www.googleapis.com से एक पृष्ठ प्राप्त करने के लिए GuzzleHttp (मैक पर php + apache) प्राप्त करने का प्रयास करते समय मैं यहां समाप्त हुआ।

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

जो भी डोमेन आपको यह त्रुटि दे रहा है, उसके लिए प्रमाणपत्र श्रृंखला देखें। मेरे लिए यह 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 / खोज करने की आवश्यकता हो सकती है।

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

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

एक बार सही प्रमाणपत्र इस फ़ाइल में हैं, अपाचे और परीक्षण पुनरारंभ करें।




Links