mikrocontroller.net

Forum: PC-Programmierung OpenSSl (unable to get local issuer certificate) mit gSOAP (Linux geht, Windows nicht)


Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht 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:
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
    int main(int argc, char* argv[])
    {
      std::string strSignature;
      PayPalAPISoapBindingProxy paypalProxy("https://api-3t.sandbox.paypal.com/2.0/");
      struct soap *soap = soap_new(); // create a new context
      soap_init(soap);
    
      paypalProxy.header = new SOAP_ENV__Header;
      paypalProxy.header->ns1__RequesterCredentials = new ns3__CustomSecurityHeaderType;
      paypalProxy.header->ns1__RequesterCredentials->eBayAuthToken = NULL;
      paypalProxy.header->ns1__RequesterCredentials->Credentials = new ns3__UserIdPasswordType;
      paypalProxy.header->ns1__RequesterCredentials->Credentials->AppId = NULL;
      paypalProxy.header->ns1__RequesterCredentials->Credentials->DevId = NULL;
      paypalProxy.header->ns1__RequesterCredentials->Credentials->AuthCert = NULL;
    
      paypalProxy.header->ns1__RequesterCredentials->Credentials->Username = soap_strdup(soap, "XXXXXX");
      paypalProxy.header->ns1__RequesterCredentials->Credentials->Password = soap_strdup(soap, "XXXXXX");
      strSignature = soap_strdup(soap, "XXXXXX"); // Sandbox env
      paypalProxy.header->ns1__RequesterCredentials->Credentials->Signature = &strSignature;
    
      _ns1__GetBalanceReq ns1__GetBalanceReq;
      ns1__GetBalanceResponseType ns1__GetBalanceResponse;
    
      ns1__GetBalanceReq.GetBalanceRequest = new ns1__GetBalanceRequestType; 
      ns1__GetBalanceReq.GetBalanceRequest->DetailLevel.push_back(ns3__DetailLevelCodeType__ReturnAll);
    
      soap_ssl_init();

      if (soap_ssl_client_context(soap, SOAP_SSL_DEFAULT, NULL, NULL, "cacert.crt", NULL, NULL))
      {
        soap_print_fault(soap, stderr);
        exit(1);
      }
      char buf[1024];
      int res = paypalProxy.GetBalance(&ns1__GetBalanceReq, ns1__GetBalanceResponse);
      if (res != SOAP_OK)
      {
        soap_sprint_fault(soap, buf, 1024);
      }
      else
      {
        std::ostringstream oss;
        oss << ns1__GetBalanceResponse.Balance << std::endl;
        std::cout << oss.str() << std::endl;
        oss << ns1__GetBalanceResponse.BalanceTimeStamp;
        std::cout << oss.str() << std::endl;
        //std::cout << ns1__GetBalanceResponse.BalanceHoldings. ->soap_serialize << std::endl;
        //std::cout << ns1__GetBalanceResponse.BalanceTimeStamp soap_serialize << std::endl;
      }

Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also keine Idee. Scheint kein spezielles gsoap Problem zu sein, sondern 
eher OpenSSL.

Wie gesagt, wenn ich das CAfile angebe, habe ich die gleiche Kette an 
trusted CAs wie unter Linux

Autor: Hmmm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. C. schrieb:
> Ich muss openssl also klar machen, wo das crt File liegt, am besten
> Systemweit, weil unter Linux geht es ja auch.

Im Source Code von OpenSSL solltest Du die Defaults beider Plattformen 
finden.

Ansonsten gibt es noch openssl.conf/openssl.cfg.

Autor: Thomas Z. (thomas_z41)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OpenSSL bietet dir die Möglichkeit ein CA Bundle anzugeben: 
https://www.openssl.org/docs/man1.1.0/ssl/SSL_load...

Guck mal ob du an den OpenSSL Context herankommst, dann kannst du das 
darüber lösen.

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Windows kann man normalerweise per Umgebungsvariable OPENSSL_CONF 
den Pfad zur openssl-Konfigurationsdatei vorgeben.

Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dr. Google (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Microsoft Implementierung der SOAP-Schnittstelle weicht deutlich vom 
Standard ab. Namespaces werden anders behandelt und auch v.a. der 
"AnyType"für variant Datentypen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.