ubuntuusers.de

php und curl im Terminal

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

holimatic

Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

Hallo Zusammen,

Ich habe folgendes Problem mit PHP und curl auf meinem Server:

  • Auf dem LAMP Server ist PHP 7.0, CURL 7.47.0 und JSON 1.4.0, alles immer uptodate gehalten installiert.

  • Nun muss ich für einen neuen Dienst Daten im Json Format von einem anderen mit SSL geschützten Server abholen

  • Dabei habe ich festgestellt, dass die Daten mit dem Browser egal welcher problemlos abgeholt werden können

  • Das gleiche geht auch auf dem Terminal mit curl direkt

  • Wenn ich aber die curl Befehle in eine php Datei reintue bekomme ich eine Fehlermeldung

1
2
In der Terminal Zeile
curl https://username:password@url/measurement/measurements

Das gleiche geht auch im lokalen Browser und ich bekomme die Daten im json Format geliefert.

Zuvor habe ich das Certificate nach

1
sudo cp cerfificate.crt /usr/local/share/ca-certificate

kopiert und dann

1
sudo update-ca-certificates

das update durchgeführt

In der PHP Datei index.php sieht es so aus:

1
2
3
4
5
6
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://username:password@".$host.$path.$param);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type:application/json","Connection:Keep-Alive"));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

Wenn ich das im Terminal mit

1
php index.php

starte wird eine Fehlermeldung ausgegeben.

1
cURL Error #:SSL certificate problem: self signed certificate;

Das zeigt doch, dass php mit curl das Certificate nicht auflösen kann.

Hat da jemand eine Lösung oder besser was fehlt auf meinem Server?

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

holimatic schrieb:

  • Wenn ich aber die curl Befehle in eine php Datei reintue bekomme ich eine Fehlermeldung

1
2
In der Terminal Zeile
curl https://username:password@url/measurement/measurements

An dieser Stelle wird es für mich unverständlich (falsche Formatierung?): Bekommst du die ganz am Ende angegebene Fehlermeldung oder eine andere? Oder hast du eingangs eine Fehlermeldung bekommen und bekommst nun die am Ende angegebene? Welche Fehlermeldung hast du vorher erhalten?

Zuvor habe ich das Certificate nach

1
sudo cp cerfificate.crt /usr/local/share/ca-certificate

Welches Zertifikat hast du kopiert? Ein Zertifizierungsstellenzertifikat? Das Zertifikat des Hosts, von dem du die JSON-Daten abholen sollst? Auf welchem Host hast du dieses Zertifikat an diese Stelle kopiert? Aus welchem Grund hast du dich entschieden, das einzelne Zertifikat genau an diese Stelle zu kopieren?

1
cURL Error #:SSL certificate problem: self signed certificate;

Das zeigt doch, dass php mit curl das Certificate nicht auflösen kann.

Die Meldung bedeutet, dass der Teilnehmer seinen eigenen Pass unterschrieben hat. Kam auch eine Sicherheitsmeldung, als du das erste Mal mit deinem Webbrowser auf den Dienst zugegriffen hast? Was sagt dir das Zertifikat, wenn du die Seite im Browser öffnest und dir die Zertifikatsinformationen anzeigen lässt? Hier ist vor allem die Zertifizierungsstelle wichtig.

Hast du die Zertifizierungsstelle herausgefunden, solltest du noch überprüfen, ob dein System (oder genauer: deine php/php-curl/curl-Installation) dieser Zertifizierungsstelle wirklich vertrauen. In der PHP-Doku gibt es eine Seite darüber, wie du Informationen über den OpenSSL-Zertifikatsspeicher abrufen kannst (Link). Vielleicht ist das auch die richtige Position für cURL im Kontext von PHP - da fehlt mir gerade das notwendige Wissen.

holimatic

(Themenstarter)
Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

Cranvil schrieb:

holimatic schrieb:

  • Wenn ich aber die curl Befehle in eine php Datei reintue bekomme ich eine Fehlermeldung

An dieser Stelle wird es für mich unverständlich (falsche Formatierung?): Bekommst du die ganz am Ende angegebene Fehlermeldung oder eine andere? Oder hast du eingangs eine Fehlermeldung bekommen und bekommst nun die am Ende angegebene? Welche Fehlermeldung hast du vorher erhalten?

Sorry, das war jetzt ein bisschen unverständlich. In der index.php steht

1
2
3
4
5
6
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://username:password@".$host.$path.$param);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type:application/json","Connection:Keep-Alive"));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

und nach Aufruf von

1
php index.php

kommt die Fehlermeldung:

1
cURL Error #:SSL certificate problem: self signed certificate;

Welches Zertifikat hast du kopiert? Ein Zertifizierungsstellenzertifikat?

Nein, das Zertifizierungsstellenzertifikat gibt es schon auf meinem Server. Das ist DigiCert Baltimore CA-2 G2

Das Zertifikat des Hosts, von dem du die JSON-Daten abholen sollst?

Ja, das habe ich mir vom Aufruf mit dem Browser runterkopiert und dann auf meinen Server kopiert.

Auf welchem Host hast du dieses Zertifikat an diese Stelle kopiert?

Auf meinem Host

Aus welchem Grund hast du dich entschieden, das einzelne Zertifikat genau an diese Stelle zu kopieren?

Das habe ich im inet gefunden. https://www.techrepublic.com/article/how-to-install-ca-certificates-in-ubuntu-server/ Ich würde nicht ausschliessen, dass es bessere Orte gibt, aber so hat es im Browser und auf der Terminal Zeile funktioniert.

Warum es jetzt mit dem php Aufruf nicht funzt ist mein Problem. Ich muss mit php im 5 Min. Takt diese Daten holen können. Das json Format kann ich dann weiterverarbiten.

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Es wäre nochmal ganz nützlich, wenn du nach dem Speicherort für Zertifikate suchst, den PHP für die Verbindung verwendet (siehe meinen letzten Beitrag). Sobald dieser bekannt ist, können wir anfangen, uns mit der Frage zu beschäftigen, welche Zertifikate dort bereits liegen und welche dort vielleicht noch fehlen.

Ergänzend könntest du dieses Serverzertifikat aus deinem Speicher wieder rauswerfen, da es sich sowieso nicht um ein CA-Zertifikat handelt, und stattdessen das Zertifikat der Zertifizierungsstelle beschaffen und dort ablegen. Vielleicht ändert sich die Fehlermeldung ja.

holimatic

(Themenstarter)
Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

Cranvil schrieb:

Es wäre nochmal ganz nützlich, wenn du nach dem Speicherort für Zertifikate suchst, den PHP für die Verbindung verwendet (siehe meinen letzten Beitrag). Sobald dieser bekannt ist, können wir anfangen, uns mit der Frage zu beschäftigen, welche Zertifikate dort bereits liegen und welche dort vielleicht noch fehlen.

Standardmässig liegt der Speicherort für die Zertifikate unter /etc/ssl/certs und da liegen auch die CA's drin z.B. auch das DigiCert Baltimore CA-2 G2. Ich habe deshalb mein Zertifikat (*.pem was der öffentliche Schlüssel ist) auch dorthin verschoben und das update-ca-certificates laufen lassen. Dieses update macht auch im Standard Verzeichnis das pem File bekannt. Insofern geht also auch mein /usr/local/share/ca-certificate Verzeichnis, weil das update das im Standard Verzeichnis mit einem Link bekannt macht. Deshalb hat sich jetzt bei meiner php/curl Abfrage nichts geändert, es geht immer noch nicht. Die curl Abfrage in der Konsole funzt immer noch einwandfrei.

Ergänzend könntest du dieses Serverzertifikat aus deinem Speicher wieder rauswerfen, da es sich sowieso nicht um ein CA-Zertifikat handelt, und stattdessen das Zertifikat der Zertifizierungsstelle beschaffen und dort ablegen. Vielleicht ändert sich die Fehlermeldung ja.

Mein .pem Zertifikat ist kein CA Zertifikat, das ist ja schon drin und bekannt.

Weiterhin habe ich auf der Konsole

1
openssl s_client -connect url.com:443

ausgeführt und einwandfreie Resultate erhalten. Also auch da kein Hinweis warum es mit php/curl nicht gehen sollte. Offensichtlich ist also curl auf der Konsole und curl in php nicht dasselbe. Ich müsste in php/curl irgendwie meinen öffentlich Schlüssel bekannt machen können? Bis dato habe ich in php und curl immer ohne ssl verwendet und das geht ohne Probleme.

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Dritter Hinweis auf:

Cranvil schrieb:

In der PHP-Doku gibt es eine Seite darüber, wie du Informationen über den OpenSSL-Zertifikatsspeicher abrufen kannst (Link). Vielleicht ist das auch die richtige Position für cURL im Kontext von PHP

Edit: Unter der Annahme, dass deine Datenquelle nicht geheim/vertraulich ist, um welche Domain handelt es sich?

holimatic

(Themenstarter)
Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

Cranvil schrieb:

Dritter Hinweis auf:

Cranvil schrieb:

In der PHP-Doku gibt es eine Seite darüber, wie du Informationen über den OpenSSL-Zertifikatsspeicher abrufen kannst (Link). Vielleicht ist das auch die richtige Position für cURL im Kontext von PHP

Ich bekomme die gleiche Ausgabe wie im Link angegegeben

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

holimatic schrieb:

Ich bekomme die gleiche Ausgabe wie im Link angegegeben

Was sagt denn

strace -e open php /pfad/zum/skript.php

holimatic

(Themenstarter)
Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

misterunknown schrieb:

holimatic schrieb:

Ich bekomme die gleiche Ausgabe wie im Link angegegeben

Was sagt denn

strace -e open php /pfad/zum/skript.php
1
2
strace: exec: Permission denied
+++ exited with 1 +++

Das verstehe ich nicht, ausgeführt als root und permission ist -rw-rw-r-- www-data www

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

holimatic schrieb:

Das verstehe ich nicht, ausgeführt als root und permission ist -rw-rw-r-- www-data www

Hast du eventuell einen Anbieter, bei dem der Kernel zwischen mehreren Kunden geshared wird? Also sowas wie OpenVZ-"Virtualisierung"? Dann kann es sein, dass man nicht mittracen kann. Im Endeffekt sieht man damit, welche Verzeichnisse und Dateien wirklich angefasst werden.

holimatic

(Themenstarter)
Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

misterunknown schrieb:

holimatic schrieb:

Das verstehe ich nicht, ausgeführt als root und permission ist -rw-rw-r-- www-data www

Hast du eventuell einen Anbieter, bei dem der Kernel zwischen mehreren Kunden geshared wird? Also sowas wie OpenVZ-"Virtualisierung"? Dann kann es sein, dass man nicht mittracen kann. Im Endeffekt sieht man damit, welche Verzeichnisse und Dateien wirklich angefasst werden.

Nein, das ist mein eigener Root Server.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

holimatic schrieb:

Nein, das ist mein eigener Root Server.

Hm, das ist in der Tat komisch. Eventuell mal den Pfad zu PHP angeben:

strace -e open /usr/bin/php /pfad/zum/skript.php

holimatic

(Themenstarter)
Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

misterunknown schrieb:

holimatic schrieb:

Nein, das ist mein eigener Root Server.

Hm, das ist in der Tat komisch. Eventuell mal den Pfad zu PHP angeben:

strace -e open /usr/bin/php /pfad/zum/skript.php

Sorry mein Fehler, hab nach open php nicht angegeben.

Jetzt kommen jede Menge ausgaben. Wahrscheinlich sehe ich vor lauter Wald die Bäume nicht mehr 😠

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

holimatic schrieb:

Jetzt kommen jede Menge ausgaben. Wahrscheinlich sehe ich vor lauter Wald die Bäume nicht mehr 😠

Möchtest du uns die vielleicht mit uns teilen? Du kannst das ganze auch gern nach /dev/null umleiten, denn strace schreibt seine Ausgaben nach STDERR. Alternativ kannst du nach strace auch -o mytrace angeben, um die Traces in die Datei zu schreiben.

PS: Das Skript sollte natürlich ausschließlich die Curl-Auführung beinhalten, also ein Minimalbeispiel sein.

holimatic

(Themenstarter)
Avatar von holimatic

Anmeldungsdatum:
15. Dezember 2009

Beiträge: 405

Wohnort: Rotkreuz

misterunknown schrieb:

holimatic schrieb:

Jetzt kommen jede Menge ausgaben. Wahrscheinlich sehe ich vor lauter Wald die Bäume nicht mehr 😠

Möchtest du uns die vielleicht mit uns teilen? Du kannst das ganze auch gern nach /dev/null umleiten, denn strace schreibt seine Ausgaben nach STDERR. Alternativ kannst du nach strace auch -o mytrace angeben, um die Traces in die Datei zu schreiben.

PS: Das Skript sollte natürlich ausschließlich die Curl-Auführung beinhalten, also ein Minimalbeispiel sein.

Ist im Anhang

mytrace (13.2 KiB)
Mytrace mit strace
Download mytrace
Antworten |