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
| 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
| sudo cp cerfificate.crt /usr/local/share/ca-certificate
|
kopiert und dann
| sudo update-ca-certificates
|
das update durchgeführt In der PHP Datei index.php sieht es so aus:
| $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
starte wird eine Fehlermeldung ausgegeben.
| 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: | 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
| 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?
| 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)
Anmeldungsdatum: 15. Dezember 2009
Beiträge: 405
Wohnort: Rotkreuz
|
Cranvil schrieb: holimatic schrieb:
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
| $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
kommt die Fehlermeldung:
| 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)
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
| 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)
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
Ehemalige
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)
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
| 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
Ehemalige
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)
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
Ehemalige
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)
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
Ehemalige
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)
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)
- Download mytrace
|