2011-06-11 63 views
6

我需要在C++中使用gsoap庫,我需要使用https。文檔說明如何在C中使用HTTPS,但不使用C++(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,但在C++生成的類中沒有。我該怎麼辦?如何在C++ gSOAP中使用SSL生成的類

UPD:我自己解決了這個問題。但它古怪,非常古怪的方式。 gSOAP的生成從結構皁繼承C++類,它包含以下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(標誌,則params),如由我們自己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 2011-06-11 12:50:54

+0

'soap_ssl_init undefined reference'。我查看了/ usr/lib/libgsoap *文件並找到了ligsoapssl ++。文件並與之鏈接。這個錯誤已經消失了,但是我得到錯誤:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:證書驗證失敗。這意味着我需要調用'soap_ssl_client_context' func,但是沒有C++生成的類。我該怎麼辦? – milo 2011-06-11 13:21:55

回答

0

我自己解決了這個問題。但它古怪,非常古怪的方式。 gSOAP的生成從struct soap繼承C++類,它包含以下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; 

所以我們可以在自行OpenSSL庫設置必要ATTRS(標誌,則params)。在簡單情況下,撥打soap_ssl_init()一次並設置ssl_flags = SOAP_SSL_NO_AUTHENTICATION就足夠了。這個對我有用。如果有人知道更好的方式我會gla

+1

通過這樣做,可以禁用服務器證書驗證,這是建立安全SSL連接的要求。 – Bruno 2011-06-12 12:29:48

+0

是的,我知道。但是你可以在'const char * keyfile','const char * cafile'等設置合適的標誌爲'ssl_flags'和路徑到keyfiles。 – milo 2011-06-13 03:32:08

+0

但是在你使用服務之前何時調用soap_ssl_init()? – 2011-06-13 14:52:19

0

我已經在我的c + +程序gsoap上使用SSL支持,我沒有任何問題。我使用-DWITH_OPENSSL指令編譯了源文件stdsoap2.cpp(它帶有gsoap)(你錯過了這個嗎?)。我使用了obj文件,並將它與我的程序連接起來。

0

我今天經歷過同樣的問題。我在VirtualBox和Gsoap 2.8.21上使用Ubuntu 14.04。

我生成的C++代理類與命令:

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

在第一位置中,我使用的上述溶液,並設置ssl_flags到SOAP_SSL_NO_AUTHENTICATION。由於這個錯誤消失了。

此外,我觀察到,雖然將標誌更改爲SOAP_TLSv1,但它也使錯誤消失。引起頭痛的標誌是SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION,它在SOAP_SSL_DEFAULT標誌內默認設置。

一切似乎都很好,直到我重新編譯gsoap從標誌--enable-debug源。不久後,我開始看到的東西,如:

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