2013-01-11 22 views
8

अनुमति दें HTTPS के लिए स्व-हस्ताक्षरित प्रमाण पत्र मूल रूप से मैं इस है:आवरण

function request($url) { 
    return file_get_contents($url, false, stream_context_create(array(
     "ssl" => array(
      "verify_peer" => true, 
      "allow_self_signed" => false, 
     ) 
    ))); 
} 

request("https://[A]"); 
request("https://[B]"); 

कहाँ [एक] एक 'असली' प्रमाण पत्र और [बी] के साथ ही एक से एक पर कुछ है के साथ एक सर्वर पर कुछ यूआरएल है स्वयं हस्ताक्षरित प्रमाणपत्र।

[एक] यह ठीक काम करता है, के साथ [बी] मैं इस मिल के साथ

:

file_get_contents(): Failed to enable crypto 

कौन सा ऐसा "सर्वर प्रमाणपत्र सत्यापन विफल" कुछ है, लेकिन ठीक किया जाना चाहिए था एक नहीं बल्कि दुर्भाग्यपूर्ण त्रुटि संदेश है। ..

अब मैंने सोचा: "ठीक है, [बी] अपने परीक्षण प्रणाली है - मैं प्रमाण पत्र के लिए परवाह नहीं है" और इस में संदर्भ बदल दिया है:

"verify_peer" => false, 
"allow_self_signed" => true, 

यह should अब एक स्वीकार एनई सर्वर प्रमाण पत्र, यहां तक ​​कि मेरे स्वयं ने हस्ताक्षर किए। लेकिन यह अभी भी वही व्यवहार है - [ए] काम करता है, [बी] नहीं करता है। क्यूं कर?


बीटीडब्ल्यू: मुझे पता है कि यह कर्ल एक्सटेंशन के साथ अच्छी तरह से काम करता है, लेकिन मैं इसके बिना इसे हरा देना चाहता हूं।

+0

कृपया परिभाषित करें * "[ए] के साथ यह ठीक काम करता है" * ... क्योंकि उनमें से किसी भी ने कभी काम नहीं करना चाहिए। आपने PHP को बताने के लिए "कैफीइल" या "कैपथ" निर्दिष्ट नहीं किया है जो सीए केर्ट्स का उपयोग करना है सहकर्मी सत्यापन के लिए और आपने स्वयं हस्ताक्षरित प्रमाणपत्रों को अस्वीकार कर दिया है। न तो [ए] न ही [बी] सफलतापूर्वक कनेक्ट हो सकता है यदि आप वास्तव में यहां दिखाए गए सटीक कोड का उपयोग कर रहे हैं। – rdlowrey

उत्तर

0
$contextOptions = array(
    'ssl' => array(
     'verify_peer'  => true, 
     'allow_self_signed'=> true 
    ) 
); 
$sslContext = stream_context_create($contextOptions); 

file_get_contents ("https: // ...., झूठे, $ SSLContext);

ऊपर ठीक काम करता है

+1

मुझे लगता है कि यदि आप एक एसएसएल एमआईटीएम प्रॉक्सी का उपयोग करते हैं तो 'verify_peer' को' false' पर सेट किया जाना चाहिए। – StanE

12

यह मेरे लिए काम करता गुड लक

$context = [ 'http' => [ 'method' => 'GET' ], 'ssl' => [ 'verify_peer' => false, 'allow_self_signed'=> true ] ]; 
$context = stream_context_create($context); 
$resp = file_get_contents('https://site/', false, $context); 
।।
+1

यह स्पष्ट रूप से काम करता है यदि आपके पास कोई एसएसएल नहीं है! मैंने इसे किसी एमएएमपी सर्वर पर किसी भी एसएसएल सेटअप के साथ करने की कोशिश की, और यह काम किया। बढ़िया है यदि आपको सिर्फ एक dev सर्वर पर चलने की आवश्यकता है :) – dmatamales

+0

मुझे काम पर स्वयं हस्ताक्षरित-प्रमाण प्राप्त करने के लिए 'query_peer_name' => false' विकल्प जोड़ना पड़ा – Fractalf