HTTPS के साथ काम करने के लिए file_get_contents () कैसे प्राप्त करें?


106

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

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

जवाबों:


89

निम्न स्क्रिप्ट देखने की कोशिश करें कि क्या आपके php स्क्रिप्ट के लिए https रैपर उपलब्ध है।

$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);

आउटपुट कुछ इस तरह होना चाहिए

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

@volker यही कारण है कि मैंने
गॉर्डन

वैसे यह कितना अजीब है कि यह कहता है कि ओपनस्ले बंद है, लेकिन phpinfo () के अनुसार इसे इसके साथ संकलित किया गया है, जब तक कि मैं इसे गलत नहीं देख रहा हूं।
जेम्स सिम्पसन 18

phpinfo () आपको कॉन्फ़िगर-लाइन में बताता है या क्या "ओपनएसएसएल" नामक एक पूरा खंड है?
वोल्कर

ठीक है, यह सिर्फ कॉन्फ़िगर-लाइन में है, इसके लिए कोई अनुभाग नहीं है। मुझे लगता है कि समस्या है?
जेम्स सिम्पसन

मेरे पास वह सब है और यह अभी भी काम नहीं करता है। और allow_url_fopen। केवल non https url लोकलहोस्ट से काम करता है।
कर्टिस

116

Https आवरण को अनुमति देने के लिए:

  • php_opensslविस्तार मौजूद होना चाहिए और सक्रिय किया जा
  • allow_url_fopen के लिए सेट किया जाना चाहिए on

अगर मौजूद नहीं है तो php.ini फ़ाइल में आपको यह लाइनें जोड़नी चाहिए:

extension=php_openssl.dll

allow_url_fopen = On

मेरी स्थापना में दोनों चालू हैं, लेकिन मुझे अभी भी SSL त्रुटि मिलती है "चेतावनी: file_get_contents (): SSL: हैंडशेक टाइम आउट"
एडमांटस

53

निम्नलिखित का प्रयास करें।

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

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


29
क्रेडिट कार्ड प्रसंस्करण से निपटने के लिए आप ssl सत्यापन को क्यों अक्षम करेंगे?
पीटर

धन्यवाद, चाल यहाँ है: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE);
डायलन बी

46
$url= 'https://example.com';

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

यह आपको url से सामग्री प्राप्त करने की अनुमति देगा चाहे वह HTTPS हो


धन्यवाद! यह मेरे अंत पर काम किया। एफबी ओपन ग्राफ़ एपीआई :) को कॉल करने की कोशिश कर रहा है :)
डिकोडिंगपांडा

मैं केवल परीक्षण उद्देश्यों के लिए अमान्य प्रमाण पत्र के साथ मेरा डोमेन एक्सेस करने की कोशिश कर रहा था और भले ही यह एसएसएल सत्यापन को अक्षम करता है, यह वही था जो मुझे चाहिए था।
कार्ला

महान! मैं 5 दिनों से कोशिश कर रहा हूं कि मेरे XAMPP टेस्ट साइट पर file_get_contents का उपयोग करके एक airbnb कैलेंडर डाउनलोड किया जाए, इससे समस्या हल हो गई, धन्यवाद।
जॉनीबेगॉड

मेरे लिए काम किया है, जो वीटीएफ़टी पर वैध HTTP प्रमाण पत्र के बिना वैग्रांट टेस्ट बॉक्स से जुड़ने की कोशिश कर रहा है। PHP SSL संदर्भ विकल्पों के लिंक यहां दिए जा रहे हैं: php.net/manual/en/context.ssl.php ; वेरिफ़ाइड सत्यापित करें = उपयोग किए गए एसएसएल प्रमाणपत्र के सत्यापन की आवश्यकता; Ver_peer_name = सहकर्मी नाम के सत्यापन की आवश्यकता है।
एंथनी

यह एसएसएल प्रमाणीकरण नहीं तोड़ रहा है और एक सुरक्षा छेद है?
वेबचुन

10

यह संभवत: आपके लक्षित सर्वर के पास एक वैध एसएसएल प्रमाणपत्र नहीं होने के कारण है।


अनुरोध करने वाले सर्वर के पास SSL प्रमाणपत्र की आवश्यकता नहीं है।
ceejayoz

15
मैंने अनुरोध करने वाले सर्वर को नहीं कहा, मैंने लक्ष्य सर्वर कहा।
एमिल विक्रोत्तम

2
वह मुझे स्किम करना सिखाएगा। हे! कृपया मेरी क्षमा याचना और उत्थान करें।
ceejayoz

लक्ष्य सर्वर में एक मान्य एसएसएल प्रमाणपत्र है।
जेम्स सिम्पसन

@ नाम, क्या आपको इसके बजाय cURL से कनेक्ट करने का प्रयास करने पर कोई त्रुटि मिलती है? या कि पूरी कोशिश करना असंभव है?
एमिल विक्रोत्तम

6

बस अपनी php.ini फ़ाइल में दो लाइनें जोड़ें।

extension=php_openssl.dll

allow_url_include = On

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


1
आप शायद मतलब है allow_url_fopenक्योंकि सवाल चिंताओं को खोलना शामिल है, शामिल नहीं।
शुक्शिन.जीवन

5

मेरी भी यही त्रुटि थी। स्थापना allow_url_include = Onमें php.iniयह मेरे लिए तय की।


5

यदि आप ओपनएसएसएल के समर्थन में संकलित हैं तो HTTPS PHP 4.3.0 से शुरू होने का समर्थन करता है। यह भी सुनिश्चित करें कि लक्ष्य सर्वर के पास एक वैध प्रमाण पत्र है, फ़ायरवॉल आउटबाउंड कनेक्शन की अनुमति देता है और allow_url_fopenphp.ini में सेट है।


मेरे पास ओपनएसएसएल समर्थन के साथ PHP 5.2.8 है। मुझे इसके साथ वही त्रुटि मिल रही है, और लक्ष्य सर्वर के पास एक वैध प्रमाणपत्र है।
जेम्स सिम्पसन

2
आउटबाउंड https कनेक्शन की अनुमति देने के लिए फ़ायरवॉल कॉन्फ़िगर किया गया है? आमतौर पर, वेबसर्वर रनिंग https 80 पोर्ट पर नहीं चलता है। क्या 'ओपन स्ट्रीम में विफल' के अलावा त्रुटि में कुछ और है?
गॉर्डन

1
जहां तक ​​मुझे पता है कि यह करता है, यह पूरी त्रुटि है: चेतावनी: fopen (https: // ...) [function.fopen]: स्ट्रीम खोलने में विफल: ऐसी कोई फ़ाइल या निर्देशिका / घर / उपयोगकर्ता / public_html / में नहीं test.php पर लाइन 993
जेम्स सिम्पसन

और php.ini में allow_url_fopen क्या सेट है?
गॉर्डन

अजीब है कि। क्या आप HTTP और HTTPS url पर GET कर सकते हैं यह देखने के लिए कि क्या काम करता है? धारा के संदर्भ के बिना?
गॉर्डन

3

मेरे मामले में, Apache की तुलना में WAMP के लिए CLI के लिए एक अलग php.ini का उपयोग करने के कारण समस्या थी, इसलिए WAMP मेनू के माध्यम से की गई आपकी सेटिंग CLI पर लागू नहीं होती है। बस CLI php.ini को संशोधित करें और यह काम करता है।


1

कभी-कभी एक सर्वर http अनुरोध हेडर (जैसे कि एक उपयुक्त उपयोगकर्ता एजेंट) में जो देखता है या नहीं देखता है, उसके आधार पर प्रतिक्रिया नहीं करने का चयन करेगा। यदि आप एक ब्राउज़र से कनेक्ट कर सकते हैं, तो हेडर को भेजें जो इसे भेजता है और आपके स्ट्रीम संदर्भ में उनकी नकल करता है।


0

मैं IIS पर गैर कार्यात्मक https के साथ फंस गया था। इसके साथ हल:

file_get_contents ('https ..) लोड नहीं होगा।

  • https://curl.haxx.se/docs/caextract.html डाउनलोड करें
  • के तहत स्थापित करें ..phpN.N / अतिरिक्त / ssl
  • इसके साथ php.ini संपादित करें:

    curl.cainfo = "C: \ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem" खुलता है ।l.cafile = "C: \ Program Files \ PHP \ v7.3 \ extras / ssl \ cacert.pem"

आखिरकार!


-1

यदि कोई URL उत्तर प्रदेश या नहीं है तो चेक करे

आपके प्रश्न के कोड को एक कार्यशील संस्करण के रूप में फिर से लिखा जा सकता है:

function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = 'curl -k '.$url;
return exec($command, $output, $retValue);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.