Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PHP Soap mit TLS Zertifikat [API abfrage}

5 views
Skip to first unread message

Timo

unread,
Sep 9, 2022, 10:12:29 PM9/9/22
to
Guten Abend,

kurz eine kleine Vorabinfo:

Ich nutze IoT SIM Karten zur Überwachung meiner Weidezäune,
da es bei uns im Ort nicht so gut ankommt, wenn meine Schafherde mal
kurz einen Ausflug macht... ;-)

Da es mir leider schon zweimal passiert ist, dass das Datenvolumen
einzelner Karten aufgebraucht war und somit keine Datenübertragung
stattfinden konnte, möchte ich einmal am Tag die API des IoT Portals
abfragen, jedoch bin ich in Bezug auf "SOAP" nackter Anfänger.

Zum Problem:
Wenn ich den Echo Test der API wie folgt über die Shell abfrage,
bekomme ich eine korrekte Antwort.

==============
curl -X POST -H "Content-Type: application/json" \
-H "Accept-Encoding: gzip,deflate" \
-H "Cache-Control: no-cache" \
--cert customer-USER.cer \
--key customer-USER.key \
https://kiteplatform-api.telefonica.com:8010/services/REST/GlobalM2M/Echo/v1/r12/echo
-d '{"data":"test"}'
==============

Mein Problem ist jetzt, wie ich das in php bewerkstelligen kann.
Der Server läuft mit php8.0 und die Erweiterung php8.0-soap ist auch
installiert.

Leider findet man fast schon zu viele Beispiele zum SOAP_Client,
welche in Bezug auf TLS1.2 und dem übergeben der Zertifikate recht
schlecht dokumentiert sind. Gleiches gilt für php-curl.

Leider haben die ganzen Dokus und Manuals dazu geführt, dass ich jetzt
komplett nur noch Bahnhof verstehe im Bezug auf dem SOAP_Client.

Hat jemand von Euch eine Idee oder einen Lösungsansatz, den ich
verfolgen sollte?

Danke.

Gruß
Timo

Timo

unread,
Sep 9, 2022, 11:05:09 PM9/9/22
to
Am 10.09.2022 um 04:12 schrieb Timo:
>
> Hat jemand von Euch eine Idee oder einen Lösungsansatz, den ich
> verfolgen sollte?
>

Ein Lösungsansatz war php-curl zu Beginn, da ich damit bereits andere
API's abrufe, jedoch scheitere ich hier bei der Einbindung das
Zertifikats und dem Schlüssel für die Authentifizierung:

==========================================
$url =
'https://kiteplatform-api.telefonica.com:8010/services/REST/GlobalM2M/Echo/v1/r12/echo';
$data = array(
"data" => "test"
);
$data_string = json_encode($data);
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array(
'Content-Type:application/json',
'Content-Length: ' . strlen($data_string)
)
);

$result = curl_exec($ch);
curl_close($ch);
==========================================

Ein weiterer Ansatz war dann via SoapClient, wobei es allerdinst auch
nicht wirklich funktioniert hat.

==========================================
$api_url =
"https://kiteplatform-api.telefonica.com:8010/services/REST/GlobalM2M/Echo/v1/r12/echo";

$stream_context_opts = array(
'http'=>array(
'method'=>"POST /services/REST/GlobalM2M/Echo/v1/r12/echo",
'header'=> "Content-Type: application/soap+xml; charset=utf-8\r\n",
'data' => "test\r\n"
)
);

$soap_stream_context = stream_context_create($stream_context_opts);

$soap_options = array(
'cache_wsdl' => WSDL_CACHE_NONE,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
'exceptions' => true,
'trace' => true,
'local_cert' => '/etc/certs/customer-USER.cer',
'soap_version' => 'SOAP_1_2',
stream_context' => $soap_stream_context,
'authentication' => SOAP_AUTHENTICATION_DIGEST
);

try {
$client = new SoapClient( $api_url, $options );
} catch (SoapFault $e) {
echo $e->getMessage();
}
==========================================

Gruß
Timo

Arno Welzel

unread,
Sep 10, 2022, 2:43:53 AM9/10/22
to
Timo, 2022-09-10 04:12:

> Guten Abend,
>
> kurz eine kleine Vorabinfo:
>
> Ich nutze IoT SIM Karten zur Überwachung meiner Weidezäune,
> da es bei uns im Ort nicht so gut ankommt, wenn meine Schafherde mal
> kurz einen Ausflug macht... ;-)
>
> Da es mir leider schon zweimal passiert ist, dass das Datenvolumen
> einzelner Karten aufgebraucht war und somit keine Datenübertragung
> stattfinden konnte, möchte ich einmal am Tag die API des IoT Portals
> abfragen, jedoch bin ich in Bezug auf "SOAP" nackter Anfänger.
>
> Zum Problem:
> Wenn ich den Echo Test der API wie folgt über die Shell abfrage,
> bekomme ich eine korrekte Antwort.
>
> ==============
> curl -X POST -H "Content-Type: application/json" \
> -H "Accept-Encoding: gzip,deflate" \
> -H "Cache-Control: no-cache" \
> --cert customer-USER.cer \
> --key customer-USER.key \
> https://kiteplatform-api.telefonica.com:8010/services/REST/GlobalM2M/Echo/v1/r12/echo
> -d '{"data":"test"}'
> ==============
>
> Mein Problem ist jetzt, wie ich das in php bewerkstelligen kann.
> Der Server läuft mit php8.0 und die Erweiterung php8.0-soap ist auch
> installiert.

Was spricht dagegen, obiges einfach mit shell_exec() auszuführen?

Siehe auch <https://www.php.net/manual/de/function.shell-exec.php>


--
Arno Welzel
https://arnowelzel.de

Timo

unread,
Sep 10, 2022, 3:20:56 PM9/10/22
to
Hallo Arno,
danke für Deine Antwort.

Am 10.09.2022 um 08:43 schrieb Arno Welzel:
>
> Was spricht dagegen, obiges einfach mit shell_exec() auszuführen?
>
> Siehe auch <https://www.php.net/manual/de/function.shell-exec.php>
>
>
Nachdem ich jetzt mehrere Stunden damit vergeigt habe,
den SOAPClient zum Laufen zu bekommen, habe ich dann aber gesehen,
dass es auch eine REST API gibt, womit ich dann doch etwas besser klar
komme.

Mit php curl ist es die ganze Zeit an den Zertifikaten gescheitert,
die ich zur Authentifizierung übergeben muss.

Daher bin ich dann zu der Version via shell_exec übergegangen,
wobei dies zwar auf meinem Server aktiviert ist, aber bei vielen Hostern
ist dies natürlich gesperrt. Daher hatte ich es auch erst nicht in
Betracht gezogen. Aber jetzt läuft es.

============
$abfrage = 'curl -X GET -H "Content-Type: application/json" -H
"Accept-Encoding: gzip,deflate" -H "Cache-Control: no-cache" --cert
/var/api-certs/cert.pem --key /var/api-certs/cert.key
https://kiteplatform-api.telefonica.com:8010/serv...';

$output = shell_exec($abfrage);
============

Da bastel ich mir jetzt noch eine Classe drum herum und schon habe ich
alles was ich brauche, auch wenn es über shell_exec nicht die Beste
Lösung ist.

Gruß
Timo

Tim Ritberg

unread,
Sep 10, 2022, 4:51:16 PM9/10/22
to
Am 10.09.22 um 21:20 schrieb Timo:
> Hallo Arno,
> danke für Deine Antwort.
>
> Am 10.09.2022 um 08:43 schrieb Arno Welzel:
> >
> > Was spricht dagegen, obiges einfach mit shell_exec() auszuführen?
> >
> > Siehe auch <https://www.php.net/manual/de/function.shell-exec.php>
> >
> >
> Nachdem ich jetzt mehrere Stunden damit vergeigt habe,
> den SOAPClient zum Laufen zu bekommen, habe ich dann aber gesehen,
> dass es auch eine REST API gibt, womit ich dann doch etwas besser klar
> komme.
>
> Mit php curl ist es die ganze Zeit an den Zertifikaten gescheitert,
> die ich zur Authentifizierung übergeben muss.
>
Also ein Client-Zertifikat?
Schon mal versucht auch die CA mitanzugeben?

https://stackoverflow.com/questions/11308270/using-curl-in-php-with-client-certificate-and-private-key-in-separate-files

Tim


Arno Welzel

unread,
Sep 11, 2022, 8:01:20 AM9/11/22
to
Timo, 2022-09-10 21:20:

[...]
> ============
> $abfrage = 'curl -X GET -H "Content-Type: application/json" -H
> "Accept-Encoding: gzip,deflate" -H "Cache-Control: no-cache" --cert
> /var/api-certs/cert.pem --key /var/api-certs/cert.key
> https://kiteplatform-api.telefonica.com:8010/serv...';
>
> $output = shell_exec($abfrage);
> ============
>
> Da bastel ich mir jetzt noch eine Classe drum herum und schon habe ich
> alles was ich brauche, auch wenn es über shell_exec nicht die Beste
> Lösung ist.

Wenn die Nutzung fertige Bibliotheken kein Problem ist, wäre Guzzle noch
eine Alternative zu curl:

<https://docs.guzzlephp.org/en/stable/>

Da ist die Übergabe von Zertifikaten prinzipiell auch vorgesehen:

<https://docs.guzzlephp.org/en/stable/request-options.html#cert>

Timo

unread,
Sep 13, 2022, 9:35:12 PM9/13/22
to
Am 10.09.2022 um 22:51 schrieb Tim Ritberg:
> Also ein Client-Zertifikat?

Genau.
Das hatte trotz CA-Zert. undauch mit CA-Bundle nicht wirklich
funktioniert. Daher lasse ich es vorerst über shell_exec läufen und
werde mich später noch einmal dran setzen.

Gruß
Timo


Timo

unread,
Sep 13, 2022, 9:36:15 PM9/13/22
to
Am 11.09.2022 um 14:01 schrieb Arno Welzel:

> Wenn die Nutzung fertige Bibliotheken kein Problem ist, wäre Guzzle noch
> eine Alternative zu curl:
>
> <https://docs.guzzlephp.org/en/stable/>
>
> Da ist die Übergabe von Zertifikaten prinzipiell auch vorgesehen:
>
> <https://docs.guzzlephp.org/en/stable/request-options.html#cert>
>

Danke. Die Bibliothek werde ich mir mal ansehen.

Gruß
Timo




0 new messages