Ошибка SSL при запуске клиента веб-службы, созданного с помощью gSOAP

Я написал клиент для веб-службы experttexting с использованием C++ и gSOAP. В настоящее время этот клиент должен вызвать процедуру SendSMS и отправить одно текстовое сообщение sms на номер, указанный вместо «TO» (см. код ниже). Программа работает без сбоев, но смс-сообщение не доставляется. В ходе расследования я обнаружил, что линия

int message_status_code=service.SendSMS("https://www.experttexting.com/exptapi/exptsms.asmx","SendSMS",request_packet,request_packet_response);

дает код ошибки, значение которого равно SOAP_SSL_ERROR.

Чтобы исправить эту проблему, я использовал флаг -DWITH_OPENSSL при компиляции с использованием g++, но безрезультатно.

Пожалуйста, помогите мне отладить эту проблему.

#include "soapH.h"
#include "ExptTextingAPISoap.nsmap"
#include "soapExptTextingAPISoapProxy.h"

int main(){
   struct soap soap;
   soap_init(&soap);
   string UserID="MY USER Id";
   string PWD="MY PASSWORD";
   string APIKEY="MY API KEY";
   string FROM="FROM";
   string TO="RECEIVER";
   string MSG="MY MESSAGE";
   _ns1__SendSMS* request_packet=soap_new_set__ns1__SendSMS(&soap,&UserID,&PWD,&APIKEY,&FROM,&TO,&MSG);
   _ns1__SendSMSResponse* request_packet_response=soap_new__ns1__SendSMSResponse(&soap);
   ExptTextingAPISoapProxy service(soap);
   int message_status_code=service.SendSMS("https://www.experttexting.com/exptapi/exptsms.asmx","SendSMS",request_packet,request_packet_response);
   service.destroy();
   return 0;
}

person Syed Daniyal Shah    schedule 01.03.2015    source источник
comment
Кажется, что сервер ожидает SSL-соединение, но на стороне клиента его нет. Где ваш код для SSL-соединения?   -  person Kahn    schedule 02.03.2015
comment
У меня нет кода для SSL-соединения. Я вызвал ту же веб-службу на php, используя SoapClient, и это сработало.   -  person Syed Daniyal Shah    schedule 02.03.2015
comment
Я мало что знаю о SoapClient, но я не вижу никакого рукопожатия SSL в этом коде. Вы пробовали рукопожатие SSL?   -  person Kahn    schedule 02.03.2015


Ответы (1)


Перед вызовом службы необходимо предоставить контекст ssl. Если сервер не требует аутентификации клиента, вы можете использовать приведенный ниже код, в противном случае вам необходимо предоставить сертификат клиента и ключ.

if (soap_ssl_client_context(&soap,
    /* SOAP_SSL_NO_AUTHENTICATION, */ /* for encryption w/o authentication */
    /* SOAP_SSL_DEFAULT | SOAP_SSL_SKIP_HOST_CHECK, */  /* if we don't want the host name checks since these will change from machine to machine */
    SOAP_SSL_DEFAULT,   /* use SOAP_SSL_DEFAULT in production code */
    NULL,       /* keyfile (cert+key): required only when client must authenticate to server (see SSL docs to create this file) */
    NULL,       /* password to read the keyfile */
    "cacert.pem",   /* optional cacert file to store trusted certificates, use cacerts.pem for all public certificates issued by common CAs */
    NULL,       /* optional capath to directory with trusted certificates */
    NULL        /* if randfile!=NULL: use a file with random data to seed randomness */ 
  ))
  { soap_print_fault(&soap, stderr);
    exit(1);
  }
person Kahn    schedule 02.03.2015