Я разрабатываю пару клиент-сервер, где сервер основан на 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)
Кто-нибудь знает, что здесь происходит не так?