2011-06-11 18 views
6

मुझे सी ++ में gsoap लाइब्रेरी का उपयोग करने की आवश्यकता है और मुझे https का उपयोग करने की आवश्यकता है। प्रलेखन का कहना है कि सी में एचटीटीपीएस के साथ कैसे काम करना है, लेकिन सी ++ में नहीं (http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.20)। विशेष रूप से, मेरे पास soap_ssl_init(); फ़ंक्शन पर संकलन त्रुटि है। मैंने देखा/usr/lib/libgsoap * फ़ाइलें और ligsoapssl ++ पाया। एक फ़ाइल और इसके खिलाफ जुड़ा हुआ है। यह त्रुटि चली गई है, लेकिन मुझे error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed मिल गया है। इसका मतलब है कि मुझे soap_ssl_client_context func पर कॉल करने की आवश्यकता है, लेकिन सी ++ जेनरेटेड क्लास में नहीं है। मुझे क्या करना चाहिए?सी ++ जीएसओएपी जेनरेटेड कक्षाओं में एसएसएल का उपयोग कैसे करें

यूपीडी: मैंने स्वयं को इस समस्या को हल कर लिया है। लेकिन यह quirky, बहुत quirky तरीका है। gSOAP struct साबुन से विरासत में मिली सी ++ वर्गों उत्पन्न करता है, यह निम्नलिखित attrs शामिल:

BIO *bio; 
SSL *ssl; 
SSL_CTX *ctx; 
unsigned short ssl_flags; 
const char *keyfile; 
const char *password; 
const char *dhfile; 
const char *cafile; 
const char *capath; 
const char *crlfile; 
const char *randfile; 
SSL_SESSION *session; 

तो हम कर सकते सेटअप आवश्यक attrs (झंडे, पैरामीटर) अपने आप से OpenSSL लाइब्रेरी में के रूप में। सरल मामले में soap_ssl_init() को एक बार कॉल करने के लिए पर्याप्त है और ssl_flags = SOAP_SSL_NO_AUTHENTICATION सेट करें। इससे मेरा काम बनता है। अगर कोई बेहतर तरीके से जानता है तो मुझे देखकर खुशी होगी।

+2

क्या है त्रुटि आपको मिलने वाला:

soap_ssl_client_context(m_proxy.soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL); 

जहां m_proxy ग्राहक प्रॉक्सी का एक उदाहरण है gSOAP उपयोग करते हुए उत्पन्न? – Mat

+0

'soap_ssl_init अपरिभाषित संदर्भ'। मैंने देखा/usr/lib/libgsoap * फ़ाइलें और ligsoapssl ++ पाया। एक फ़ाइल और इसके खिलाफ जुड़ा हुआ है। यह त्रुटि चली गई है, लेकिन मुझे 'त्रुटि मिलती है: 140 9 0086: एसएसएल दिनचर्या: SSL3_GET_SERVER_CERTIFICATE: प्रमाण पत्र सत्यापित विफल '। इसका मतलब है कि मुझे 'soap_ssl_client_context' func को कॉल करने की आवश्यकता है, लेकिन सी ++ जेनरेटेड क्लास में नहीं है। मुझे क्या करना चाहिए? – milo

उत्तर

0

मैंने अपने आप से इस समस्या को हल किया है। लेकिन यह quirky, बहुत quirky तरीका है। gSOAP उत्पन्न सी ++ struct soap से विरासत में मिली कक्षाएं, यह निम्नलिखित attrs शामिल हैं:

BIO *bio; 
SSL *ssl; 
SSL_CTX *ctx; 
unsigned short ssl_flags; 
const char *keyfile; 
const char *password; 
const char *dhfile; 
const char *cafile; 
const char *capath; 
const char *crlfile; 
const char *randfile; 
SSL_SESSION *session; 

तो हम कर सकते सेटअप आवश्यक attrs (झंडे, पैरामीटर) अपने आप से OpenSSL लाइब्रेरी में के रूप में। सरल मामले में soap_ssl_init() को एक बार कॉल करने के लिए पर्याप्त है और ssl_flags = SOAP_SSL_NO_AUTHENTICATION सेट करें। इससे मेरा काम बनता है। अगर कोई बेहतर तरीके से जानता है तो मैं

+1

ऐसा करके, आप सर्वर प्रमाण पत्र सत्यापन अक्षम करते हैं, जो एक सुरक्षित SSL कनेक्शन स्थापित करने की आवश्यकता है। – Bruno

+0

हाँ, मुझे पता है। लेकिन आप उचित ध्वज 'ssl_flags' और' const char * keyfile', 'const char * cafile', आदि में keyfiles के पथ को सेट कर सकते हैं – milo

+0

लेकिन सेवा का उपयोग करने से पहले, आप soap_ssl_init() को कब कॉल करते हैं? –

0

मैंने अपने सी ++ प्रोग्राम में जीएसएपी पर एसएसएल समर्थन का उपयोग किया है, और मुझे कोई समस्या नहीं है। मैंने स्रोत फ़ाइल stdsoap2.cpp (जो gsoap के साथ आता है) को संकलित किया, -DWITH_OPENSSL निर्देश के साथ (क्या आपको यह याद आया?)। मैंने ओबीजे फ़ाइल का इस्तेमाल किया, और इसके साथ अपने कार्यक्रम को जोड़ा।

0

मुझे आज भी यही समस्या का अनुभव हुआ है। मैं वर्चुअलबॉक्स और गॉसप 2.8.21 पर उबंटू 14.04 का उपयोग कर रहा था।

मैं सी ++ प्रॉक्सी वर्गों उत्पन्न कमांड के साथ:

soapcpp2 -1 -I/opt/libraries/gsoap/build/2.8.21/share/gsoap/import -C -j temporary.h 

एक पहली जगह में, मैं ऊपर उल्लिखित समाधान का इस्तेमाल किया और SOAP_SSL_NO_AUTHENTICATION को ssl_flags निर्धारित किया है। इस त्रुटि के लिए धन्यवाद गायब हो गया।

इसके अलावा मैंने देखा कि SOAP_TLSv1 में ध्वज बदलने के दौरान, यह त्रुटियों को गायब कर देता है। सिरदर्द का कारण बनने वाला ध्वज SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION था जो डिफ़ॉल्ट रूप से SOAP_SSL_DEFAULT ध्वज के अंदर सेट होता है।

सब कुछ ठीक लग रहा था, जब तक कि मैंने ध्वज - सक्षम-डीबग के साथ स्रोत से gsoap recompiled। इसके तुरंत बाद मैं देखना शुरू कर दिया की तरह कुछ: यह सत्यापित

SSL त्रुटि या गहराई 1 में प्रमाण पत्र के साथ चेतावनी: असमर्थ स्थानीय जारीकर्ता प्रमाण पत्र प्राप्त करने

सबसे अच्छा समाधान मैं अब तक पाया cacerts.pem डाउनलोड करने के लिए है gsoap साइट https://www.cs.fsu.edu/~engelen/cacerts.pem.zip से फ़ाइल और अपने निष्पादन योग्य के बगल में उन्हें अनजिप करें।

और हां अपने कोड में आप के लिए कुछ इसी तरह होना चाहिए की:

soap *soap = soap_new(); 
soap->ssl_flags = SOAP_SSL_DEFAULT; 

soap_register_plugin(soap, soap_wsse); 
soap->cafile = "cacerts.pem"; 

तब सभी चेतावनी और त्रुटि संदेश गायब हो जाते हैं।

1

यह मेरे लिए काम करता है:

wsdl2h.exe -o MyWebservice.h ..\MyWebservice.wsdl 
soapcpp2.exe -IC:\gsoap-2.8\gsoap\import -j MyWebservice.h -C -1 -SL 
संबंधित मुद्दे

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