2011-12-09 24 views
46

सारांश:
वहाँ एक अमान्य प्रमाणपत्र के साथ एक सर्वर के लिए खत्म हो HTTPS कनेक्ट करने के लिए PHP में SoapClient श्रेणी में बनाया मजबूर करने के लिए एक तरीका है?अक्षम प्रमाण पत्र सत्यापन

मैं ऐसा क्यों करना चाहूंगा?
मैंने एक ऐसे सर्वर पर एक नया एप्लीकेशन तैनात किया है जिसमें अभी तक कोई DNS प्रविष्टि या प्रमाणपत्र नहीं है। मैं से पहले डीओएन एंट्री सेट करने और प्रमाणपत्र को ठीक करने से पहले सोप क्लाइंट से कनेक्ट करने का प्रयास करना चाहता हूं, और ऐसा करने का सबसे उचित तरीका क्लाइंट को परीक्षण के दौरान प्रमाण पत्र को अनदेखा करना है।

क्या मुझे एहसास नहीं है कि यह एक बड़ा सुरक्षा जोखिम है?
यह केवल परीक्षण के लिए है। जब सेवा उत्पादन में जाती है, तो वहां एक वैध प्रमाण पत्र होगा, और ग्राहक को इसे सत्यापित करने के लिए मजबूर किया जाएगा।

+1

मुझे वास्तव में दिलचस्पी है यदि stream_context_create() के साथ यह विचार आपके लिए काम करता है। अगर आपको कुछ बदलना पड़ा, तो कृपया हमें बताएं ताकि अन्य इसका भी लाभ उठा सकें। – Kaii

+0

मुझे यह भी रूचि है कि सुझाए गए समाधान –

उत्तर

72

SoapClient अपने पैरामीटर में धारा संदर्भ लेता है, जिसे आप स्वयं बना सकते हैं। इस तरह आप परिवहन परत के लगभग हर पहलू को नियंत्रित कर सकते हैं:

$context = stream_context_create([ 
    'ssl' => [ 
     // set some SSL/TLS specific options 
     'verify_peer' => false, 
     'verify_peer_name' => false, 
     'allow_self_signed' => true 
    ] 
]); 

$client = new SoapClient(null, [ 
    'location' => 'https://...', 
    'uri' => '...', 
    'stream_context' => $context 
]); 

प्रलेखन:

+1

दुर्भाग्यवश यह काम नहीं कर रहा है, और verify_peer विकल्प पहले से ही झूठे (http://php.net/manual/en/context.ssl.php) पर डिफ़ॉल्ट रूप से डिफ़ॉल्ट है। – zpon

+1

@zpon: यह सामान्य रूप से काम करता है। चेकआउट आप एक अलग एसएसएल sublayer का उपयोग नहीं कर रहे हैं जिसमें अलग-अलग विकल्प हैं। यह भी जांचें कि आप एक PHP बग में नहीं चलते हैं, एक संबंधित प्रश्न देखें: [Php SoapClient stream_context विकल्प] (http: // stackoverflow।कॉम/प्रश्न/9 0 9 2 9 32/php-soapclient-stream-context-option) – hakre

+2

'allow_self_signed'' के बारे में क्या 'सत्य' पर सेट है? 'False' के साथ-साथ –

2

पीएचपी 5.6 के लिए सही सूची। 8

है 10

'ssl' => सरणी ('verify_peer_name' => झूठी, 'allow_self_signed' => true),

10

स्वीकार किए जाते हैं जवाब काम करता है, लेकिन केवल गैर डबल्यूएसडीएल मोड में। यदि आप इसे WSDL मोड में उपयोग करने का प्रयास करते हैं (i। ई। आप पहली तर्क के रूप में एक डब्लूएसडीएल फ़ाइल यूआरएल पास करते हैं) तो आप इस तथ्य का सामना करेंगे कि WSDL फ़ाइलों को डाउनलोड करते समय स्ट्रीम संदर्भ को अनदेखा किया जाता है। तो यदि डब्लूएसडीएल फ़ाइल टूटी हुई सर्टिफिकेट वाले सर्वर पर भी स्थित है, तो यह असफल हो जाएगी, संदेश failed to load external entity संदेश को फेंकने की संभावना है। अधिक here और here देखें।

जैसा कि सुझाव दिया गया है, WSDL फ़ाइल को मैन्युअल रूप से डाउनलोड करने और स्थानीय प्रतिलिपि को साबुन क्लाइंट को पास करने का सबसे आसान तरीका है। स्वीकार्य उत्तर से बहुत ही स्ट्रीम संदर्भ का उपयोग करके आप इसे file_get_contents के साथ उदाहरण के लिए डाउनलोड कर सकते हैं।

ध्यान दें कि आपको साबुन सर्वर बनाने के दौरान भी ऐसा करना होगा।

+3

मैं PHP7 में स्वीकार किए जाते हैं जवाब की कोशिश की है और यह डबल्यूएसडीएल मोड में काम किया। तो शायद वह समस्या ठीक हो गई थी। –

संबंधित मुद्दे