Связь между клиентом gSOAP и веб-сервисом Java по HTTPS - PullRequest
0 голосов
/ 23 октября 2018

Я разрабатываю пару клиент-сервер, где сервер основан на Java, а клиент - на C ++ (gSOAP).Связь прекрасно работает с использованием HTTP.Теперь я хочу реализовать зашифрованное соединение на основе HTTPS.

Поэтому я следовал руководству по gSOAP на

https://www.genivia.com/tutorials.html#cert

Для создания самозаверяющих сертификатов: один для клиентаодин для веб-службы.

Затем я преобразовал файлы .pem, используя OpenSSL, как показано здесь:

openssl pkcs12 -export -in Servicecert.pem -inkey Servicekey.pem -certfile cacert.pem -out Service -name "service"

Кроме того, я экспортировал сертификат клиента x.509 следующим образом:

openssl x509 -outform der -in Clientcert.pem -out Clientcert.der
keytool -import -alias client -keystore Client -file Clientcert.der

Эти два файла, которые я использую как хранилище ключей (Служба) и хранилище доверенных сертификатов (Клиент)

Теперь используем пример кода gSOAP на стороне клиента, например:

using namespace std;
int main()
{
   struct soap* soap = soap_new();
soap->fsslverify = ssl_verify;
   soap_register_plugin(soap, soap_wsse);

   CountriesPortSoap11Proxy service("https://localhost:9443/ws");// = new              CountriesPortSoap11Proxy("https://localhost:9443/ws");

    _ns1__getCountryRequest* request = new _ns1__getCountryRequest;
    _ns1__getCountryResponse response;

    soap_ssl_init();

    if (soap_ssl_client_context(soap,
       SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, // requires server authentication
      "Client.pem",// keyfile for client authentication to server
      "password",             // the keyfile password
      "cacert.pem",// cafile CA certificates to authenticate the server
      NULL,// capath CA directory path to certificates
      NULL))
    {
       cout << "Zertifikat" << endl;
       soap_print_fault(soap, stderr);
       exit(1); 
    }

    request->name = "Poland";
    request->soap = soap;

  if (soap_ssl_accept((struct soap*)soap))
 cout << "ok" << endl;
    else
 cout << "fail" << endl;; 



    if(service.getCountry(request, response)==SOAP_OK)
    cout << "ok" << endl;
    else{
          cout << "fail" << endl;
    service.soap_stream_fault(std::cerr);
    }   
 cout << response.country->currency << endl;

    return 0;
 }

Затем я получаю следующий код ошибки

ok
fail
SOAP 1.1 fault SOAP-ENV:Server[no subcode]
"SSL_ERROR_SSL
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
unable to get local issuer certificate"
Detail: SSL_connect() error in tcp_connect()
segmentation fault (Speicherabzug geschrieben)

Кто-нибудь знает, что здесь происходит не так?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Мне пришлось конвертировать файлы PEM, чтобы использовать их в веб-сервисе java, который использует keytool.Этот keytool понимает только сертификаты PKCS12, насколько я знаю.Кроме того, мне пришлось использовать сертификаты клиента, поскольку сервер использует сертификат клиента x.509 в хранилище доверенных сертификатов.

0 голосов
/ 15 ноября 2018

Не уверен, почему вам пришлось конвертировать файлы PEM, как вы описали.Сценарий cert.sh создает файл ключа PEM и файл сертификата PEM.Этот сценарий может использоваться на стороне сервера для генерации server.pem и cacert.pem.Сценарий cert.sh находится в gsoap/samples/ssl в пакете программного обеспечения gSOAP.Файл cacert.pem - это сертификат сервера, подписанный корнем (root.pem, созданный с помощью сценария root.sh).Этот cacert.pem файл - единственный файл, необходимый на стороне клиента для проверки подлинности сервера с использованием самозаверяющего сертификата.Используйте файл server.pem на стороне сервера.client.pem не требуется, если только вы не принудительно установите аутентификацию клиента на стороне сервера с помощью SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION, чтобы инициализировать контекст SSL с помощью soap_ssl_server_context.Файл server.pem на самом деле представляет собой объединение закрытого ключа сервера и его сертификата, когда он создается cert.sh.

...