Klaus1: Keine XML-Antwort bei Rest API Zugriff über cURL

Hallo,

ich versuche über die Rest API unseres Cisco ISE Daten abzufragen. Mit einem Rest-Client (Firefox-Addon) bekomme ich die Daten sauber zurückgeliefert. Der cURL-Aufruf aus dem Rest-Client sieht wie folgt aus:

curl -X GET -k -H 'Accept: application/vnd.com.cisco.ise.identity.adminuser.1.0+xml' -H 'Authorization: Basic AAJzBBRtaW12SksjCCJzKzIeMaE=' -i 'https://x.x.x.x:9060/ers/config/adminuser'

Als Antwort erhalte ich dann korrekt (gekürzt):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns3:searchResult total="4" xmlns:ns5="ers.ise.cisco.com" xmlns:ers-v2="ers-v2" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns3="v2.ers.ise.cisco.com">
  <ns3:resources>
    <ns5:resource description="Default Admin User" id="f2a1124e-2c49-1851-9880-23c3811cece7" name="admin">

Das versuche ich wie folgt in PHP nachzubauen:

$url = "https://x.x.x.x:9060/ers/config/adminuser";
$headers = array('Accept: application/vnd.com.cisco.ise.identity.adminuser.1.0+xml');
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLAUTH_BASIC);
curl_setopt($handle, CURLOPT_USERPWD, $username.':'.$password);
curl_setopt($handle, CURLOPT_HEADER, 1);
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($handle);
print_r ($response);

Anstatt einer erwarteten XML-Antwort mit allen angelegten Admin-Usern, erhalte ich:

HTTP/1.1 200 OK Cache-Control: no-cache, no-store, must-revalidate Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONIDSSO=9AFFE13A0A686133CCD10C57A2CF5B90; Path=/; Secure; HttpOnly Set-Cookie: APPSESSIONID=C4B2DF214523E6F78CC3D66570A00361; Path=/ers; Secure; HttpOnly Pragma: no-cache X-Frame-Options: SAMEORIGIN Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; X-XSS-Protection: 1; mode=block Date: Wed, 05 Jan 2022 07:18:00 GMT Content-Type: application/vnd.com.cisco.ise.ers.searchresult.2.0+xml;charset=utf-8 Transfer-Encoding: chunked Server:

Ebenso über

exec("curl -X GET -k -H 'Accept: application/vnd.com.cisco.ise.identity.adminuser.1.0+xml' -H 'Authorization: Basic AAJzBBRtaW12SksjCCJzKzIeMaE=' -i 'https://x.x.x.x:9060/ers/config/adminuser'",$out);
print_r($out);

Hat jemand eine Idee was ich falsch mache bzw. wie ich die Daten auch über PHP sauber gelesen bekomme?

LG Klaus

  1. Tach!

    HTTP/1.1 200 OK Cache-Control: no-cache, no-store, must-revalidate Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONIDSSO=9AFFE13A0A686133CCD10C57A2CF5B90; Path=/; Secure; HttpOnly Set-Cookie: APPSESSIONID=C4B2DF214523E6F78CC3D66570A00361; Path=/ers; Secure; HttpOnly Pragma: no-cache X-Frame-Options: SAMEORIGIN Strict-Transport-Security: max-age=31536000; includeSubDomains X-Content-Type-Options: nosniff X-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; X-XSS-Protection: 1; mode=block Date: Wed, 05 Jan 2022 07:18:00 GMT Content-Type: application/vnd.com.cisco.ise.ers.searchresult.2.0+xml;charset=utf-8 Transfer-Encoding: chunked Server:

    Diese Stringwurst ist unlesbar. Zeileumbrüche wären nett gewesen. Aber das ist vermutlich auch ein Indiz auf das Problem.

    Hat jemand eine Idee was ich falsch mache bzw. wie ich die Daten auch über PHP sauber gelesen bekomme?

    Wenn du Text im Kontext HTML ausgibst - sprich: in den Browser -, werden alle Whitespaces als einfache Leerzeichen ausgegeben. Und im Kontext HTML wird auch der Inhalt interpretiert, also alles was in <> eingefasst ist, wird als HTML-Element zu interpretieren versucht. XML sind unbekannte Elemente, die einfach ignoriert werden.

    Schau in die Quelltextansicht, da wirst du alles in voller Schönheit sehen. Und bei Ausgaben, auch wenn es sich nur um eine Debug-Ausgabe handelt, solltest du den Kontextwechsel beachten.

    dedlfix.

    1. Hallo delfix,

      die Welt kann so einfach sein 😀

      Ich bin tatsächlich nicht auf die Idee gekommen, in den Quelltext zu schauen. Ich dachte, dass Ausgaben über print_r nicht mehr interpretiert werden. Ich hatte auch schon mit Content-type experimentiert, aber war nicht weiter gekommen.

      So kann ich das Ganze jetzt in den XML-Parser geben und auswerten.

      Vielen Dank Dir. Du hast mir entscheidend weitergeholfen!

      LG Klaus

      1. Hallo Klaus,

        Ich dachte, dass Ausgaben über print_r nicht mehr interpretiert werden.

        mit kurzem Nachdenken hättest du darauf kommen können, dass das nicht stimmen kann. Woher soll denn der Browser wissen, wie und womit die Ausgabe (oder gar nur ein Teil davon) erzeugt wurde?

        Ich hatte auch schon mit Content-type experimentiert, aber war nicht weiter gekommen.

        Vermutlich hattest du schon eine Ausgabe gemacht, bevor du mit header() versucht hast, einen Content-Type zu setzen.

        Immer eine Handbreit Wasser unterm Kiel
         Martin

        --
        Wenn ich den See seh, brauch ich kein Meer mehr.
      2. Ich bin tatsächlich nicht auf die Idee gekommen, in den Quelltext zu schauen.

        Hm. DAS hat mich jetzt einige Zeit gekostet. Immerhin ist es theoretisch möglich, dass der Server eine unvollständig-falsche Antwort mit dem falschen Statuscode im Header (war 200 OK) und leerem Payload (Inhalt) liefert weil ihm z.B. der User-Agent und/oder die sofortige Übergabe der Zugangsdaten nicht gefallen…

        Cisco hat ja seinen Ruf...

        1. Ps.S. Aus dem Grund teste ich wichtige Teile meiner Skripte IMMER in einer Shell. Die Ausgabe via Webserver und Browser und daraus erzeugte Fehler (oder hier: vermeintliche Fehler) sind dann immer außen vor…

    2. Hallo dedlfix,

      Diese Stringwurst ist unlesbar. Zeileumbrüche wären nett gewesen.

      dachte ich auch - ich hatte die nicht beachtete Markdown-Syntax hier im Forum im Verdacht und wollte das schon der Lesbarkeit zuliebe richten. Aber dann habe ich auch gesehen, dass Klaus tatsächlich eine "Stringwurst" ohne Umbrüche hier angeliefert hat.

      Schau in die Quelltextansicht, da wirst du alles in voller Schönheit sehen. Und bei Ausgaben, auch wenn es sich nur um eine Debug-Ausgabe handelt, solltest du den Kontextwechsel beachten.

      Ich denke, das ist sauber analysiert und erklärt.

      Was darüber hinaus auch noch nützlich ist: HTTP-Header zu erkennen, wenn man welche sieht.

      Immer eine Handbreit Wasser unterm Kiel
       Martin

      --
      Wenn ich den See seh, brauch ich kein Meer mehr.