2015-04-29 3 views
1

Вызов soap_ssl_accept всегда приводит к ошибке SSL23_GET_CLIENT_HELLO:unknown protocol. Я сделал это как можно проще и повернул аутентификацию сервера, установив SOAP_SSL_NO_AUTHENTICATION. Я разбил его на следующий код сервера и клиента. Можете ли вы помочь мне получить рабочий пример?Простой сервер gSoap и клиент с SSL

стороне сервера:

#include <cstdio> 
#include "ADService.nsmap" // get namespace bindings 
#include "stdsoap2.h" 
#include "soapH.h" 

int ns1__add(struct soap *soap, xsd__int a, xsd__int b, xsd__int& c) { 
    c = a + b; 
    return SOAP_OK; 
} 


int main() { 
    int m, s; 
    struct soap soap; 
    soap_ssl_init(); // init OpenSSL (just once) 
    soap_init(&soap); 
    if (soap_ssl_server_context(&soap, 
     SOAP_SSL_NO_AUTHENTICATION, 
     NULL, // keyfile: required when server must authenticate to clients 
     NULL, // password to read the key file 
     NULL, // optional cacert file to store trusted certificates 
     NULL, // optional capath to directory with trusted certificates 
     NULL, // DH file name or DH key len bits 
     NULL, // if randfile!=NULL: use a file with random data 
     NULL)) { 
     soap_print_fault(&soap, stderr); 
     exit(1); 
    } 
    m = soap_bind(&soap, NULL, 18000, 100); // use port 18000 
    if (m < 0) { 
     soap_print_fault(&soap, stderr); 
     exit(1); 
    } 
    printf("Socket connection successful: master socket = %d\n", m); 
    for (;;) { 
     s = soap_accept(&soap); 
     printf("Socket connection successful: slave socket = %d\n", s); 
     if (s < 0) { 
      soap_print_fault(&soap, stderr); 
      break; 
     } 
     if (soap_ssl_accept(&soap)) 
      soap_print_fault(&soap, stderr); 
     else 
      soap_serve(&soap); 
     soap_destroy(&soap); 
     soap_end(&soap); 
     soap_free(&soap); // done and free context 
    } 
    soap_done(&soap); /* deallocates SSL context */ 
    return 0; 
} 

стороне клиента:

#include <iostream> 
#include "soapH.h" // obtain the generated stub 
#include "ADService.nsmap" // obtain the namespace mapping table 

int main(int argc, const char* argv[]) { 
    soap soap; 
    soap_ssl_init(); 
    soap_init(&soap); 
    if (soap_ssl_client_context(&soap, 
     SOAP_SSL_NO_AUTHENTICATION, 
     NULL, // keyfile: required only when client must authenticate to server 
     NULL, // password to read the key file (not used with GNUTLS) 
     NULL, // cacert file to store trusted certificates 
     NULL, // capath to directory with trusted certificates 
     NULL // if randfile!=NULL: use a file with random data to seed randomness 
    )) { 
     soap_print_fault(&soap, stderr); 
     return 1; 
    } 
    xsd__int result; 
    if(soap_call_ns1__add(
     &soap, "localhost:18000", 0, 1, 2, result) != SOAP_OK) { 
     soap_print_fault(&soap, stderr); 
     soap_print_fault_location(&soap, stderr); 
     return 1; 
    } 
    printf("Result = %d", result); 
    soap_destroy(&soap); 
    soap_end(&soap); 
    soap_done(&soap); 
    return 0; 
} 

Выход на стороне сервера:

Socket connection successful: master socket = 1916
Socket connection successful: slave socket = 1912
Error 30 fault: SOAP-ENV:Server [no subcode]
"SSL_ERROR_SSL
error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown > protocol"
Detail: SSL_accept() failed in soap_ssl_accept()
Press any key to continue

+0

Возможно ли захватить tcpdump и посмотреть, что происходит с клиентом? – Prabhu

+1

Часто это означает, что HTML-текст с открытым текстом передается через порт, а не HTTPS. То есть сервер отправляет ' ', и клиент пытается интерпретировать его как запись SSL/TLS. Используйте 'openssl s_client -connect : -tls1 -servername -debug' для подтверждения. Вы увидите, что ASCII на клиенте читает (а не двоичный). – jww

ответ

0

Вызов soap_call_ns1__add с именем хоста https://localhost:18000 решил.

0

Это не окончательный ответ. Но может помочь. Как я закончил с ошибкой, что вы видите:

3077928696:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:628

Это происходит, когда на успешном соединении TCP с сервером, клиент отправляет в некорректных client_hello сообщения. Я в основном в своем тесте отправил байт-байт после TCP-соединения.

Capture tcpdump b/w сервер и клиент и посмотреть, что происходит с клиентом.

+0

Благодарим вас за вашу идею. Это может быть моим следующим шагом. Прежде чем отладить функцию gSoap. –

Смежные вопросы