2015-10-22 5 views
6

मैं php में लागू साबुन सर्वर पर साबुन अनुरोध के लिए हस्ताक्षर सत्यापित करना चाहता हूं।डब्ल्यूएस * सर्वर कार्यान्वयन में हस्ताक्षर की जांच

सर्वर कोड:

$Server = new SoapServer(); 

$d = new DOMDocument(); 
$d->load('php://input'); 

$s = new WSSESoapServer($d); 
try { 
    if($s->process()) { 
     // Valid signature 
     $Server->handle($s->saveXML()); 
    } else { 
     throw new Exception('Invalid signature'); 
    } 
} catch (Exception $e) { 
    echo "server exception: " . $e; 
} 

त्रुटि:

exception 'Exception' with message 'Error loading key to handle Signature' in /<path>/wse/src/WSSESoapServer.php:146 

मैं इस लाइब्रेरी का उपयोग कर सोप अनुरोध पर हस्ताक्षर करने के एक ग्राहक को लागू किया है: https://github.com/robrichards/wse-php। सर्वर को कार्यान्वित करने के तरीके के कोई उदाहरण नहीं हैं ...

हस्ताक्षर की जांच करने के लिए मैं सार्वजनिक कुंजी कैसे लोड करूं?

[संपादित करें] मैं अब

$key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'public')); 
    $key->loadKey(CERT, true); 

जब हस्ताक्षर मान्य मैं अब एक त्रुटि संदेश मिल रहा है का उपयोग कर आपूर्ति की कुंजी लोड करने में सक्षम है:

$x = new XMLSecurityDSig(); 
$d = $x->locateSignature($soapDoc); 
$valid = $x->verify($key); 

हालांकि, मान्य $ हमेशा झूठा है। मुझे नहीं पता कि ऐसा इसलिए है क्योंकि कुंजी गलत है या वास्तव में अमान्य है। मुझे PHP के साथ एक SOAP सर्वर को लागू करने पर बहुत कम जानकारी मिल सकती है और एक SOAP सर्वर को लागू करने पर कोई जानकारी नहीं है जो हस्ताक्षरित अनुरोध की जांच करने पर निर्भर करता है।

स्पष्टीकरण

  1. एक दूरस्थ वेब सेवा से मेरे क्लाइंट बात करती है और एक रसीद हो जाता है।

  2. फिर दूरस्थ सर्वर को मेरे अनुरोध को संसाधित करने में कुछ समय लगता है।

  3. एक दूरस्थ ग्राहक (जिसका मेरा कोई नियंत्रण नहीं है) तो मेरी सेवा का अनुरोध करता है।

अंतिम चरण जहां मैं मुसीबत हस्ताक्षर

+0

ऐसा लगता है कि WSSESoapServer स्वचालित रूप से एक साबुन संदेश के भीतर हस्ताक्षर का पता लगा रहा है और मान्य कर रहा है। तो आपका पहला दृष्टिकोण ठीक होना चाहिए, आपको मैन्युअल रूप से कुंजी लोड करने या सत्यापित करने की आवश्यकता नहीं है। लेकिन: WSSESoapServer की आवश्यकता है कि हस्ताक्षरित साबुन संदेश में हस्ताक्षर सत्यापित करने के लिए हस्ताक्षर और सार्वजनिक कुंजी शामिल है। – smat88dd

+0

क्या आप अभी भी किसी समाधान पर रूचि रखते हैं या आप इसे स्वयं ठीक कर सकते हैं? मैंने एक परीक्षण क्लाइंट और सर्वर स्थापित किया है, और इसे उत्तर के रूप में पोस्ट कर सकता हूं! वैसे भी, मैं इसे चलाने के लिए मिल सकता है, wsse सर्वर त्रुटि के बिना हस्ताक्षर मान्य कर रहा है। – smat88dd

+0

@ smat88dd मुझे लगता है कि मेरा आखिरी संपादन हस्ताक्षर लोड करके इसे ठीक करता है। मेरा अनुरोध करने वाले क्लाइंट पर मेरा कोई नियंत्रण नहीं है।मुझे लगता है कि मेरे पास सार्वजनिक कुंजी अमान्य हो सकती है क्योंकि यह हमेशा झूठी मूल्यांकन करती है। यदि आपका समाधान मेरा से अलग है, तो भी मैं इसे देखना चाहूंगा। अगर केवल * कुछ * दस्तावेज संदर्भित करने के लिए है। – soulfreshner

उत्तर

0

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

<?php 
require 'soap-server-wsse.php'; 

try { 
    // get soap message 
    $xmlSoap = DOMDocument::load('php://input'); 

    // validate signature 
    $validateSignature = new WSSESoapServer($xmlSoap); 
    if(!$validateSignature->process()) 
     file_put_contents("log.txt", "soapserver: SIGNATURE VALIDATION ERROR - CONTINUING WITHOUT SIGNATURE\n", FILE_APPEND); 
     //throw new Exception('Invalid Signature'); # this would cancel the execution and not send an answer 

    $sServer = new SoapServer($wsdl); 
    // actually process the soap message and create & send answer 
    //$sServer->setClass() or setObject() or set setFunction() 
    $sServer->handle($validateSignature->saveXML()); 
} catch (Exception $fault) { 
    file_put_contents("log.txt", "soapserver soapfault: ".print_r($fault, true), FILE_APPEND); 
} 
?> 
+0

ओह, बीटीडब्ल्यू - यह कोड वास्तव में काम करता है, लेकिन केवल तभी जब हस्ताक्षर की सार्वजनिक कुंजी साबुन संदेश में शामिल की जाती है। अगर कोई सार्वजनिक कुंजी स्वयं प्रदान करना चाहता है, तो 'WSSESoapServer' में परिवर्तन निरंतर हैं। – smat88dd

+0

.. लेकिन यह सवाल का जवाब नहीं देता है। मेरी पूरी समस्या हस्ताक्षर की जांच करने के लिए सार्वजनिक कुंजी लोड करने के साथ है। क्या परिवर्तन की जरूरत है? फ़िर भी सहायता के लिए धन्यवाद। कम से कम मैं देख सकता हूं कि मैं सही ट्रैक पर हूं – soulfreshner

+0

मुझे खेद है, मुझे स्पष्टीकरण दें: WSSESoapServer के पास सार्वजनिक कुंजी लोड करने का कोई विकल्प नहीं है। यह साबुन संदेश के अंदर से कुंजी प्राप्त करने के लिए बनाया जाता है। मेरा जवाब सिर्फ आंशिक था, क्योंकि आपने यह भी पूछा था कि WSSESoapServer के साथ सर्वर कैसे बनाना है, क्योंकि कोई उदाहरण नहीं थे। – smat88dd

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