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


187

मैं विंडोज 7 पर XAMPP के हिस्से के रूप में PHP संस्करण 5.6.3 चला रहा हूं।

जब मैं मैनड्रिल एपीआई का उपयोग करने की कोशिश करता हूं, तो मुझे निम्नलिखित त्रुटि मिल रही है:

संदेश 'एपीआई कॉल टू मैसेज / सेंड-टेम्प्लेट विफल: SSL प्रमाणपत्र समस्या: स्थानीय जारीकर्ता प्रमाणपत्र प्राप्त करने में असमर्थ'

मैंने पहले से ही StackOverflow पर पढ़ी गई सभी चीज़ों को आज़माया, जिसमें निम्नलिखित को php.ini फ़ाइल में शामिल करना शामिल है:

curl.cainfo = "C:\xampp\php\cacert.pem"

और वह स्थान http://curl.haxx.se/docs/bextract.html से cacert.pem फ़ाइल को उस स्थान पर डाउनलोड किया गया

लेकिन आखिरकार, XAMPP और Apache सर्वर को फिर से शुरू किया लेकिन फिर भी वही त्रुटि हो रही है।

मैं वास्तव में नहीं जानता कि और क्या प्रयास करना है।

क्या कोई और सलाह दे सकता है कि मैं क्या कोशिश कर सकता हूं?


मेरा जवाब देखें: stackoverflow.com/a/29649024/660410
Michal-sk

3
यह भी सुनिश्चित करें कि आपने ';' को हटाकर उस लाइन को अनलॉक्ड कर दिया है। यह curl.cainfo = "C: \ xampp \ php \ cacert.pem" होना चाहिए, बजाय; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
जॉन

HTTP पर HTTPS का उपयोग करने से भी यह त्रुटि होगी?
javiniar.leonard

जवाबों:


363

अंत में यह काम करने के लिए मिल गया!

  1. सर्टिफिकेट बंडल डाउनलोड करें ।

  2. कहीं लगा दो। मेरे मामले में, वह c:\wamp\निर्देशिका थी (यदि आप Wamp 64 बिट का उपयोग कर रहे हैं तो यह है c:\wamp64\)।

  3. सक्षम mod_sslअपाचे में और php_openssl.dllमें php.ini(को निकाल कर उसे हटाएं ;शुरुआत में)। लेकिन सावधान रहें, मेरी समस्या यह थी कि मेरे पास दो php.iniफाइलें थीं और मुझे उन दोनों में ऐसा करने की आवश्यकता है। एक वह है जो आपको अपने WAMP टास्कबार आइकन से मिलता है, और दूसरा वह है, मेरे मामले में, मेंC:\wamp\bin\php\php5.5.12\

  4. इन पंक्तियों को दोनों php.iniफ़ाइलों में अपने प्रमाणपत्र में जोड़ें :

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
    
  5. Wamp सेवाएँ पुनरारंभ करें।


3
मेरे मामले में वह था: \ xamp \ निर्देशिका और उसकी खिड़कियां 7 और यह समाधान एकदम सही काम करता है..धन्यवाद ...
मनु आरएस

1
नवीनतम प्रमाणपत्र बंडल को मूल कर्ल साइट curl.haxx.se/docs/caextract.html
पॉल

1
मेरे मामले में लाइन ;की शुरुआत में हुई थी और मुझे यह महसूस करने में घंटों लग गए कि इसका मतलब है कि यह एक टिप्पणी है। इसलिए मेरे जैसे noobs के लिए, एक की जरूरत को दूर करने ;के साथ-साथ
abhyudayasrinet

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

1
यह कुंजी हैBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

अस्वीकरण: यह कोड आपके सर्वर को असुरक्षित बनाता है।

मैं लाइन नंबर 65 के बाद मैंड्रिल.फपी फाइल में एक ही समस्या थी, जहां वह $ यह कहता है-> ch = curl_init ();

निम्नलिखित दो पंक्तियों को जोड़ें:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

इससे मेरी समस्या हल हो गई और मैंने लोकलहोस्ट का उपयोग करके ईमेल भी भेजा लेकिन मेरा सुझाव है कि इसे लाइव संस्करण लाइव पर उपयोग न करें। आपके लाइव सर्वर पर कोड इस कोड के बिना काम करना चाहिए।


1
इस बायपास के बिना काम करने के लिए मैं अपने डेवलपर्स के वातावरण को बनाने की कोशिश कर सकता हूं?
डोर दादूश

4
मेरे लिए, बस काम करने के CURLOPT_SSL_VERIFYPEERलिए सेटिंग के साथ false
फ्रांसिस्को कॉर्लेस मोरेल्स 16

29
जबकि आप तकनीकी रूप से सही हैं, एसएसएल को अक्षम करना एक बुरा विचार है। लोकलहोस्ट पर भी, प्रमाण पत्र को ठीक से लोड करने के लिए बेहतर है जैसा कि अन्य उत्तर में बताया गया है।
रीढ़ की हड्डी में

जबकि आप तकनीकी रूप से सही हैं, एसएसएल को अक्षम करना एक बुरा विचार है। यहां तक ​​कि अगर यह किसी अन्य तरीके से काम करने के लिए बहुत ही प्रतिरोधी है, तो अपनी नौकरी को खोने से बेहतर है कि आप गैर-उचित sys-admin तरीके से काम करें। @ सामान्य

45

धन्यवाद @Mladen Janjetovic,

आपके सुझाव ने मेरे लिए मैक में काम किया जिसमें अम्प्स स्थापित थे।

नकल: http://curl.haxx.se/ca/cacert.pem

सेवा: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

और php.iniउस रास्ते से अपडेट किया गया और अपाचे को फिर से शुरू किया:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

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

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: वैम्प के लिए भी।

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

अगर आप लोकलहोस्ट के लिए SAN का उपयोग करके नया एसएसएल प्रमाणपत्र जेनरेट करना चाह रहे हैं, तो इस पोस्ट पर कदम मेरे लिए काम कर रहे हैं Centos 7 / Vagrant / Chrome Browser


18

जब आप http://curl.haxx.se/docs/caextract.html पृष्ठ देखते हैं, तो आपको बड़े अक्षरों में एक खंड दिखाई देगा:

RSA-1024 को हटा दिया गया

इसे पढ़ें, फिर उन प्रमाणपत्रों का संस्करण डाउनलोड करें जिनमें 'RSA-1024' प्रमाणपत्र शामिल हैं। https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

जो मैंड्रिल के साथ काम करेंगे।

SSL को निष्क्रिय करना एक बुरा विचार है।


1
इससे AWS / Guzzle / cURL के साथ एक समस्या तय हो गई है जो मैं पूरे दिन संघर्ष कर रहा हूं। धन्यवाद!
शून्य

का उपयोग करते हुए इस @voidstate मैं जानता हूँ कि यह पुराना है लेकिन आप इसे बाईपास भी कर सकते हैं Guzzle में [ 'की पुष्टि' => झूठी], पर पूरा दस्तावेज़ के लिए SSL / कर्ल / Guzzle यहाँ जाना guzzle.readthedocs.org/en/latest/...
जॉन

@ जॉन, लेकिन यह एसएसएल सत्यापन को भंग कर देगा जो वह नहीं है जो आप करना चाहते हैं, इसलिए मैं ऐसा करने का सुझाव नहीं दूंगा।
आर्टुरो अल्वारादो

1
विंडोज के लिए, आपको अपने सर्वर पर फ़ाइलें सहेजने की आवश्यकता होगी (उदाहरण के लिए C: \ curl \ curl-ca-bundle.crt), फिर अपने php.ini में निम्नलिखित जोड़ें: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[coverssl] opensl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstl

मेरे पास उम्र के लिए पूरी तरह से काम करने के बाद भी यही था (यहां तक ​​कि सर्वर परिवर्तन से भी बचे) लेकिन मुझे यह समझने में परेशानी हो रही है कि यहां क्या चल रहा है। क्या ऐसा है कि कर्ल या ओपनसेल अपडेट किया गया था और उसके पास था? सीए-बंडल को एक में बदल दिया गया था जो कि मेलचम्प के साथ असंगत है?
सम्मे

11

उपरोक्त कदम, हालांकि उपयोगी, विंडोज 8 पर मेरे लिए काम नहीं किया। मैं सह-संबंध नहीं जानता, लेकिन नीचे दिए गए चरणों ने काम किया। मूल रूप से cacert.pem फ़ाइल में एक परिवर्तन। आशा है कि यह किसी की मदद करता है।

  • यहाँ से cacert.pem फ़ाइल डाउनलोड करें: http://curl.haxx.se/docs/caextract.html
  • फ़ाइल को अपने PHP इंस्टॉलेशन फ़ोल्डर में सहेजें। (उदाहरण: यदि xampp का उपयोग कर रहे हैं - इसे c: \ Installation_Dir \ xampp \ php \ cacert.pem में सहेजें)।
  • अपनी php.ini फ़ाइल खोलें और इन पंक्तियों को जोड़ें:
  • curl.cainfo = "C: \ Installation_Dir \ xampp \ php \ cacert.pem" खुलता हैll.cafile = "C: \ Installation_Dir \ xampp \ php \ cacert.pem"
  • अपने Apache सर्वर को पुनरारंभ करें और इसे ठीक करना चाहिए (बस रोकें और आवश्यकतानुसार सेवाएँ शुरू करें)।

11

मुझे बिना किसी सर्टिफिकेशन के नया सॉल्यूशन मिला कि कर्ल को कॉल करने के लिए केवल दो लाइन कोड जोड़ें।

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
हालांकि यह काम कर सकता है, यह बिल्कुल अनुशंसित नहीं है। आप मूल रूप से कह रहे हैं, सभी प्रमाणपत्रों पर भरोसा करें ... और यदि आप भूल जाते हैं तो यह संभव हमले के लिए आपके आवेदन को खोल देता है और आपका कोड इस बदलाव के साथ उत्पादन करने के लिए बनाता है ... यह वास्तव में सीए बंडल डाउनलोड करने के लिए बहुत काम नहीं है। इसमें पॉइंट PHP जोड़ें।
user919426

यह कर्ल अवधारणा है, इसलिए जब भी आप कर्ल का उपयोग कर रहे हैं तो ऊपर कोड जोड़ें
मनीष शर्मा

8

यदि आपके पास php.ini तक पहुंच नहीं है, तो इस कोड को जोड़ना (आपकी $ch = curl_init();लाइन के बाद ) मेरे लिए काम करता है:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

फिर, आपको बस ca-bundle.crt डाउनलोड करना होगा और इसे आपके द्वारा निर्दिष्ट स्थान पर सहेजना होगा $certificate_location


3

मेरे पास इस समस्या का बहुत सरल समाधान है। आप इसे बिना किसी सर्टिफिकेट फाइल के कर सकते हैं।

लारवेल रूट फ़ोल्डर पर जाएं -> विक्रेता -> guzzlehttp -> guzzle -> src

Client.php खोलें

$ चूक को ढूंढें। इस तरह देखो ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

अब मुख्य काम सत्यापित कुंजी के मूल्य को बदलना है ।

'verify'          => false,

इसलिए इसके बाद यह CURL अनुरोध के लिए SSL प्रमाणपत्र की जांच नहीं करेगा ... यह समाधान मेरे लिए काम कर रहा है। मैं कई शोध के बाद इसका समाधान ढूंढता हूं ...


2

सर्वर परिनियोजन के लिए उपरोक्त उत्तरों पर विस्तार से बताया गया है।

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

तैनात होने पर सर्वर से समझौता किए बिना विकास के माहौल के लिए चाल चलनी चाहिए।


अपने कोड के विभिन्न भागों को अलग-अलग वातावरण में चलाने से अच्छी अवधारणा की तरह आवाज़ नहीं आती है - यह कठिन डिबगिंग बनाता है
निको हसे

2

मैंने कोशिश की यह काम करता है

खुला हुआ

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

और इसे बदलें

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

इसके लिए

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0

AppVeyor में अपना ऐप बनाने के दौरान मेरे पास यही मुद्दा था।

  • Https://curl.haxx.se/ca/cacert.pem को डाउनलोड करेंc:\php
  • Opensl सक्षम करें echo extension=php_openssl.dll >> c:\php\php.ini
  • प्रमाण पत्र का पता लगाएँecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

यदि ऊपर दिए गए कोई भी समाधान आपके लिए काम नहीं कर रहे हैं तो अपने XAMPP इंस्टॉलेशन को नए संस्करण में अपडेट करने का प्रयास करें।

मैं php 5.5.11 के साथ XAMPP चला रहा था, वही सटीक कोड काम नहीं कर रहा था, मैंने php 5.6.28 और ऊपर दिए गए समाधानों के साथ XAMPP में अपग्रेड किया।

इसके अतिरिक्त केवल अपडेट करने वाला PHP या तो काम नहीं करता था या तो XAMPP के उस संस्करण पर एपाचे और php सेटिंग्स के संयोजन जैसा लगता है।

आशा है कि यह किसी की मदद करता है।


0

मुझे इस तरह की त्रुटि मिली:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

मैं विंडोज़ मशीन का उपयोग कर रहा हूँ। इसलिए मैंने नीचे दिए गए चरणों का पालन किया।

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

आशा है कि यह किसी की मदद कर सकता है


0

मैं अपने स्थानीय सिस्टम में इस तरह की समस्या का सामना कर रहा था लेकिन लाइव सर्वर में नहीं। मैं भी इस पेज पर एक और समाधान का उल्लेख अपने से पहले, लेकिन उस में काम कर रहा था स्थानीय होस्ट .so इस का एक नया समाधान, कि में काम कर रहा है लगता है स्थानीय होस्ट-WAMP सर्वर

cURL त्रुटि #: SSL प्रमाणपत्र समस्या: स्थानीय जारीकर्ता प्रमाणपत्र प्राप्त करने में असमर्थ

कभी-कभी सिस्टम आपके cacert.pem को आपके ड्राइव में नहीं खोज पाता । इसलिए आप इसे अपने कोड में परिभाषित कर सकते हैं जहां आप CURL का उपयोग करने जा रहे हैं

ध्यान दें कि मैं इसके लिए सभी शर्तों को पूरा कर रहा हूं जैसे कि OPEN-SSL पुस्तकालय सक्रिय और अन्य चीजें।

CURL के इस कोड की जाँच करें ।

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

लेकिन यह समाधान लाइव सर्वर में काम नहीं कर सकता है। cacert.pem के पूर्ण पथ के कारण


0

मेरे पास इस समस्या का एक उचित समाधान है, इस समस्या के मूल कारण को समझने और समझने की कोशिश करता है। यह समस्या तब आती है जब आपके सिस्टम के सर्टिफिकेट स्टोर में रूट सर्टिफिकेट का उपयोग करके दूरस्थ सर्वर ssl को सत्यापित नहीं किया जा सकता है या चेन सर्टिफिकेट के साथ रिमोट ssl इंस्टॉल नहीं किया गया है। यदि आपके पास रूट ssh एक्सेस के साथ एक लिनक्स सिस्टम है, तो इस स्थिति में आप नीचे दिए गए कमांड के साथ अपने प्रमाणपत्र स्टोर को अपडेट करने का प्रयास कर सकते हैं:

update-ca-certificates

यदि फिर भी, यह काम नहीं करता है, तो आपको अपने सर्टिफिकेट स्टोर में रूट सर्वर के रूट और अंतरिम प्रमाणपत्र को जोड़ने की आवश्यकता है। आप रूट और इंटरमीडिएट सिरे डाउनलोड कर सकते हैं और उन्हें / usr / लोकल / शेयर / सीए-सर्टिफिकेट डायरेक्टरी में जोड़ सकते हैं और फिर कमांड चला सकते हैं update-ca-certificates। यह काम कर जाना चाहिए। इसी तरह खिड़कियों के लिए आप रूट और इंटरमीडिएट सर्टिफिकेट को जोड़ने का तरीका खोज सकते हैं।

जिस तरह से आप इस समस्या को हल कर सकते हैं वह है रिमोट सर्वर टीम को डोमेन रूट सर्टिफिकेट, इंटरमीडिएट सर्टिफिकेट और रूट सर्टिफिकेट के बंडल के रूप में ssl सर्टिफिकेट जोड़ने के लिए कहना।


-4

गुझिया के लिए आप यह कोशिश कर सकते हैं:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

गुझिया / गुझिया 3. पर परीक्षण


1
वहाँ एक 3 साल पुराने सवाल का जवाब है कि 200 + upvotes के साथ एक स्वीकृत जवाब है?
treyBake

मेरा जवाब ऊपर वाले की तुलना में सरल है, आप देखेंगे कि मुझे कुछ महीनों के लिए 10
अपवोट मिलेंगे

1
मुझे अत्यधिक संदेह है, ओपी में किसी भी तरह की गड़बड़ी का उल्लेख नहीं है ... इसलिए यह एक असंबंधित उत्तर है। यह तब होता है जब कोई जावास्क्रिप्ट समस्या के लिए jQuery समाधान प्रदान करता है। यह अप्रासंगिक है।
treyBake

यह यहाँ इस्तेमाल नहीं किया जा रहा है तथ्य को नहीं बदलता है। क्या आप Windows उपयोगकर्ता के लिए लिनक्स समाधान सुझाएंगे क्योंकि यह सबसे अधिक इस्तेमाल किया जाने वाला सर्वर ऑपरेटिंग सिस्टम है? हर कोई Guzzle का उपयोग नहीं करना चाहता है, मैंने व्यक्तिगत रूप से PHP का उपयोग करने के वर्षों में कभी भी इसका उपयोग नहीं किया है। मेरे लिए, HTTP अनुरोध वास्तव में इसके लिए पैकेज की आवश्यकता के लिए मुश्किल नहीं है।
treyBake

1
पूरी तरह से अवगत - यह सिर्फ जरूरत नहीं है .. बस कर्ल के लिए डॉक्स पढ़ें और यह सभी आत्म-व्याख्यात्मक है। यह होशियार होने के बारे में नहीं है ... यह सवाल का ठीक से जवाब देने के बारे में है
treyBake
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.