OpenSSl (unable to get local issuer certificate) mit gSOAP (Linux geht, Windows nicht)

OP #5192163
Lesenswert?

Hallo,
ich arbeite mit der Paypal api mit gsoap in C++.

Unter Linux funktioniert mein Programm, unter Windows bekomme ich immer 
"unable to get local issuer certificate" von meiner Apifunktion 
("paypalProxy.GetBalance") zurück.

Das Problem hängt damit zusammen, dass OpenSSL keine passende Liste der 
trusted CAs hat, weil wenn ich folgendes unter Windows und Linux laufen 
lasse:
1
openssl s_client -connect api-3t.sandbox.paypal.com:443 -showcerts | egrep -wi "G5|return"

- linux: 'Verify return code: 0 (ok)'.
- windows 'unable to get local issuer certificate'.

Mit zusätzlicher Option '-CAfile .\cabundle.crt' in windows:
'Verify return code: 0 (ok)',

dabei ist "cabundle.crt" das mozilla certificate bundle von: 
http://curl.haxx.se/docs/caextract.html

Ich muss openssl also klar machen, wo das crt File liegt, am besten 
Systemweit, weil unter Linux geht es ja auch.

Ich habe auch schon versucht, das .crt unter "C:\OpenSSL-Win32\certs" zu 
den anderen Zertifikaten von openSSL zu legen, leider ohne Erfolg
1
    int main(int argc, char* argv[])
2
    {
3
      std::string strSignature;
4
      PayPalAPISoapBindingProxy paypalProxy("https://api-3t.sandbox.paypal.com/2.0/");
5
      struct soap *soap = soap_new(); // create a new context
6
      soap_init(soap);
7
    
8
      paypalProxy.header = new SOAP_ENV__Header;
9
      paypalProxy.header->ns1__RequesterCredentials = new ns3__CustomSecurityHeaderType;
10
      paypalProxy.header->ns1__RequesterCredentials->eBayAuthToken = NULL;
11
      paypalProxy.header->ns1__RequesterCredentials->Credentials = new ns3__UserIdPasswordType;
12
      paypalProxy.header->ns1__RequesterCredentials->Credentials->AppId = NULL;
13
      paypalProxy.header->ns1__RequesterCredentials->Credentials->DevId = NULL;
14
      paypalProxy.header->ns1__RequesterCredentials->Credentials->AuthCert = NULL;
15
    
16
      paypalProxy.header->ns1__RequesterCredentials->Credentials->Username = soap_strdup(soap, "XXXXXX");
17
      paypalProxy.header->ns1__RequesterCredentials->Credentials->Password = soap_strdup(soap, "XXXXXX");
18
      strSignature = soap_strdup(soap, "XXXXXX"); // Sandbox env
19
      paypalProxy.header->ns1__RequesterCredentials->Credentials->Signature = &strSignature;
20
    
21
      _ns1__GetBalanceReq ns1__GetBalanceReq;
22
      ns1__GetBalanceResponseType ns1__GetBalanceResponse;
23
    
24
      ns1__GetBalanceReq.GetBalanceRequest = new ns1__GetBalanceRequestType; 
25
      ns1__GetBalanceReq.GetBalanceRequest->DetailLevel.push_back(ns3__DetailLevelCodeType__ReturnAll);
26
    
27
      soap_ssl_init();
28

29
      if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacert.crt", NULL, NULL))
30
      {
31
        soap_print_fault(soap, stderr);
32
        exit(1);
33
      }
34
      char buf[1024];
35
      int res = paypalProxy.GetBalance(&ns1__GetBalanceReq, ns1__GetBalanceResponse);
36
      if (res != SOAP_OK)
37
      {
38
        soap_sprint_fault(soap, buf, 1024);
39
      }
40
      else
41
      {
42
        std::ostringstream oss;
43
        oss << ns1__GetBalanceResponse.Balance << std::endl;
44
        std::cout << oss.str() << std::endl;
45
        oss << ns1__GetBalanceResponse.BalanceTimeStamp;
46
        std::cout << oss.str() << std::endl;
47
        //std::cout << ns1__GetBalanceResponse.BalanceHoldings. ->soap_serialize << std::endl;
48
        //std::cout << ns1__GetBalanceResponse.BalanceTimeStamp soap_serialize << std::endl;
49
      }
OP #5193001
Lesenswert?

Das mit OPENSSL_CONF  habe ich schon versucht, das klappt leider nicht.

Das OPENSSLDIR wird auch nicht übernommen, wenn man es per 
UMgebungsvariable setzt. Wenn ich openssl version -d mache, kommt immer 
/etc/ssl. Erst nachdem ich OpenSSL selbst von Source gebaut habe und 
dabei openssl-dir angegeben hatte, hat sich der Wert geändert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren