Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Soap-Schnittstelle mit lokaler WSDL-Datei und Client-Zertifikat

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Soap-Schnittstelle mit lokaler WSDL-Datei und Client-Zertifikat

    Hallo Community,

    ich sitze hier vor einem Problem, welches mich nun schon nahezu eine Woche beschäftigt. Unzählige Google-Suchen führten nicht zu dem gewünschten Ergebnis.
    Ich muss vorweg erwähnen, dass es sich bei der Schnittstelle und der Zusammenarbeit mit dem Kunden um ein streng vertrauliches Projekt handelt, für das ich auch unterschreiben musste, ich kann daher keine Links oder internen Infos raus geben, bin aber bemüht alle relevanten Infos zu liefern.

    Folgende Ausgangsstellung:
    - Kunde stellt eine SOAP-Schnittstelle zur Verfügung, mit der Kundendaten abgefragt werden können.

    Auszug aus der Schnittstellenbeschreibung:
    • Der Datentransport erfolgt über XML und SOAP, die Verbindungen werden dabei als verschlüsselte HTTP-Verbindungen (HTTPS) ausgeführt.
    • Es wird die XML-Version 1.0 vorausgesetzt. Als Zeichensatz dient UTF8. Sonderzeichen
      sind maskiert zu übertragen
    • Auf Seiten des Kunden werden die Kompatibilität der WSDL-Beschreibungen und der empfangenen SOAP-Messages gegen WS-I Basic Profile 1.1 Compatibility Test Kit (http://www.ws-
      i.org/) getestet.
    • Die Validierung der empfangenen Datenstrukturen gegen die spezifizierten XML-Schema
      wird auf Seiten des Kunden vom Webservice Security Proxy IBM Datapower XS40 vorgenommen.
    • Web Service Nachrichten müssen mit einer Signatur gemäß dem Standard "Web Services
      Security – X.509 Certificate Token Profile" (http://docs.oasis-open.org/wss/v1.1/wss-v1.1-spec-os-
      x509TokenProfile.pdf) versehen sein. Dabei ist im Sinne maximaler Interoperabilität der Standard Webservice Security 1.0 einzuhalten. Es ist zwingend erforderlich, dass ein signierter Timestamp im
      SOAP-Header mit übertragen wird. Dies geschieht über die Attribute <wsu:created> und
      <wsu:expires>. Der Expire-Timestamp darf dabei nicht mehr als 300 Sekunden in der Zukunft vom
      Created-Timestamp liegen. Der SOAP-Body ist ebenfalls zu signieren. Der Request muss das verwen-
      dete digitale Zertifikat dem Standard folgend beinhalten. Unterstützt werden alle Zertifikate, die von
      einer offiziellen CA oder vom Kundeneigenen CA signiert sind. Signaturen sind mit dem
      Algorithmus rsa-sha1 zu erstellen.
      Zertifikate für SSL (HTTPS), WS-S Signaturen und gegebenenfalls WS-S Encryption müssen auf unter-
      schiedlichen Key-Pairs basieren und sind daher implizit unterschiedlich.
    Nun habe ich auf unserem Server ein CSR erstellt und an den Kunden geschickt. Zurück kam mein Signaturzertifikat und eine CA-Chain. Datei-Endungen sind .cer.

    Ich habe über den PHP-Soap-Client und mithilfe von CURL versucht auf die Schnittstelle zu zu greifen, jedoch ohne Erfolg.

    Code:
    try {
        $wsdl = "definition.wsdl"
        $connection_params = array(
            "location" => "https://kunde.de/schnittstelle/service/",
            "trace" => true,
            'local_cert' => "client.cer");
    
        $soap_client = new SoapClient($wsdl, $connection_params);
    
        $params = array(
          "security" => array(
               "authentication" => array(
               'login' => 'username',
               'password' => 'password'
               )
            )
        );
    
        $result = $soap_client->searchCustomer($params);
    } catch (SoapFault $exception) {
        echo $exception->getMessage();
    }
    Da bekomme ich
    Code:
    ["faultstring"]=>
      string(25) "Could not connect to host"
      ["faultcode"]=>
      string(4) "HTTP"
    Wenn ich local_cert auskommentiere bekomme ich

    Code:
    ["faultstring"]=>
      string(28) "Internal Error (from client)"
      ["faultcode"]=>
      string(10) "env:Client"
    Kann mir jemand Hilfestellung geben, das Problem zu lösen? Ich bin ziemlich ratlos. Ich weiß leider auch nicht so recht wo ich ansetzen muss, wo die .cer Dateien abgespeichert werden müssen und so weiter. Bin über jede Hilfe dankbar, da mich der Support des Kunden mit den Worten "wir haben nur die Schnittstelle gebaut, den Client müssen Sie selber bauen" abgespeist hat

    lg
    Maddin

  • #2
    Warum gibst du die location manuell an obwohl du eine wsdl verwendest? Als erstes musst du überhaupt eine Verbindung aufbauen können. Also finde raus was du dazu brauchst host, http, https, credentials, client cert usw... das kannst du z.B. mit dem Browser testen, oder um das Client Zertifikat zu testen mit openssl s_link. Wenn du das hast (erkennbar an einem SOAP Fehler, WSDL oder weißen Seite) kannst du dich wieder SOAP zu wenden. Ab da wirds dann intreressant...

    Web Service Nachrichten müssen mit einer Signatur gemäß dem Standard "Web Services
    Security – X.509 Certificate Token Profile" (http://docs.oasis-open.org/wss/v1.1/wss-v1.1-spec-os-
    x509TokenProfile.pdf) versehen sein. Dabei ist im Sinne maximaler Interoperabilität der Standard Webservice Security 1.0 einzuhalten. Es ist zwingend erforderlich, dass ein signierter Timestamp im
    SOAP-Header
    mit übertragen wird. Dies geschieht über die Attribute <wsu:created> und
    <wsu:expires>. Der Expire-Timestamp darf dabei nicht mehr als 300 Sekunden in der Zukunft vom
    Created-Timestamp liegen. Der SOAP-Body ist ebenfalls zu signieren. Der Request muss das verwen-
    dete digitale Zertifikat dem Standard folgend beinhalten. Unterstützt werden alle Zertifikate, die von
    einer offiziellen CA oder vom Kundeneigenen CA signiert sind. Signaturen sind mit dem
    Algorithmus rsa-sha1 zu erstellen.
    Zertifikate für SSL (HTTPS), WS-S Signaturen und gegebenenfalls WS-S Encryption müssen auf unter-
    schiedlichen Key-Pairs basieren
    und sind daher implizit unterschiedlich.
    Signierte SOAP Nachrichten mit PHP? Viel erfolg...

    Kommentar


    • #3
      Zitat von erc Beitrag anzeigen
      Warum gibst du die location manuell an obwohl du eine wsdl verwendest?
      Der Kunde verwendet die WSDLs auch intern, daher ist dort als Ziel eine Localhost-Adresse hinterlegt. Desweiteren kann die WSDL verwendet werden um auf die Test- und Live-Umgebung zugreifen zu können.

      Zitat von erc Beitrag anzeigen
      Signierte SOAP Nachrichten mit PHP? Viel erfolg...
      Du machst mir nicht viel Hoffnung. Gibt es eine Alternative zum PHP SoapClient? Kommandozeile, 3rd Party Software, o.ä.?

      edit

      Zitat von erc Beitrag anzeigen
      Als erstes musst du überhaupt eine Verbindung aufbauen können.
      Folgendes habe ich jetzt via Shell versucht:
      Code:
      root@server:# openssl s_client -connect kunde.de:443 -CAfile \CAChain-des-Kunden.cer -state
      Ergebnis:
      Code:
      CONNECTED(00000003)
      SSL_connect:before/connect initialization
      SSL_connect:SSLv2/v3 write client hello A
      SSL_connect:SSLv3 read server hello A
      depth=2 /C=DE/O=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx
      verify return:1
      depth=1 /C=DE/O=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx
      verify return:1
      depth=0 /C=DE/O=xxxxxxxx/OU=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx/emailAddress=xxxxxxxx@kunde.de
      verify return:1
      SSL_connect:SSLv3 read server certificate A
      SSL_connect:SSLv3 read server certificate request A
      SSL_connect:SSLv3 read server done A
      SSL_connect:SSLv3 write client certificate A
      SSL_connect:SSLv3 write client key exchange A
      SSL_connect:SSLv3 write change cipher spec A
      SSL_connect:SSLv3 write finished A
      SSL_connect:SSLv3 flush data
      SSL_connect:SSLv3 read finished A
      ---
      Certificate chain
       0 s:/C=DE/O=xxxxxxxx/OU=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx/emailAddress=xxxxxxxx@kunde.de
         i:/C=DE/O=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx
       1 s:/C=DE/O=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx
         i:/C=DE/O=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx
      ---
      Server certificate
      -----BEGIN CERTIFICATE-----
      xxxxxxxx
      -----END CERTIFICATE-----
      subject=/C=DE/O=xxxxxxxx/OU=xxxxxxxx/OU=GHS SSL/CN=xxxxxxxx/emailAddress=xxxxxxxx@kunde.de
      issuer=/C=DE/O=xxxxxxxx/OU=xxxxxxxx/CN=xxxxxxxx
      ---
      No client certificate CA names sent
      ---
      SSL handshake has read 2982 bytes and written 459 bytes
      ---
      New, TLSv1/SSLv3, Cipher is AES256-SHA
      Server public key is 2048 bit
      Secure Renegotiation IS supported
      Compression: NONE
      Expansion: NONE
      SSL-Session:
          Protocol  : TLSv1
          Cipher    : AES256-SHA
          Session-ID: 34D97D78SDLFKSLDF453RK493D94934DKR3KDR93K49RKD49RKD3RKD93A7F46B7DFD73
          Session-ID-ctx: 
          Master-Key: 706D34RMDM94MRI349RIRD39IRM349349RX.349R349MI349RIM34R93C4IR03V94R91F0FD0003B7F0E276D7F407423AB14D
          Key-Arg   : None
          Start Time: 1417093324
          Timeout   : 300 (sec)
          Verify return code: 0 (ok)
      ---
      wqeweqw
      qweqweqwe
      
      HTTP/1.1 500 Error
      X-Backside-Transport: FAIL FAIL
      Content-Type: text/xml
      Connection: close
      
      SSL3 alert read:warning:close notify
      closed
      SSL3 alert write:warning:close notify
      Heißt das jetzt, dass ich verbunden bin? Wie übertrage ich die gewonnene Erkenntnis in PHP?

      Danke für Eure Unterstützung.

      Kommentar

      Lädt...
      X