Ich habe versucht, über eine PHP-Seite, die ich auf unserem Server erstellt habe, auf diesen bestimmten REST-Service zuzugreifen. Ich habe das Problem auf diese beiden Zeilen eingegrenzt. Meine PHP-Seite sieht also so aus:
<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");
echo $response; ?>
Die Seite stirbt in Zeile 2 mit folgenden Fehlern:
- Warnung: file_get_contents (): SSL-Vorgang mit Code 1 fehlgeschlagen. OpenSSL-Fehlermeldungen: Fehler: 14090086: SSL-Routinen: SSL3_GET_SERVER_CERTIFICATE: Zertifikatüberprüfung in ... PHP in Zeile 2 fehlgeschlagen
- Warnung: file_get_contents (): Krypto in ... php in Zeile 2 konnte nicht aktiviert werden
- Warnung: file_get_contents (
https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json
): Stream konnte nicht geöffnet werden: Vorgang in ... php in Zeile 2 fehlgeschlagen
Wir verwenden einen Gentoo-Server. Wir haben kürzlich ein Upgrade auf PHP Version 5.6 durchgeführt. Es war nach dem Upgrade, als dieses Problem auftrat.
Ich habe festgestellt, wenn ich den REST-Service durch eine Adresse wie: https://www.google.com
Ersetze. Meine Seite funktioniert einwandfrei.
In einem früheren Versuch habe ich das festgelegt “verify_peer”=>false
und als Argument an file_get_contents übergeben, wie hier beschrieben: file_get_contents ignoriert verify_peer => false? Aber wie der Schriftsteller feststellte; es machte keinen Unterschied.
Ich habe einen unserer Serveradministratoren gefragt, ob diese Zeilen in unserer Datei php.ini vorhanden sind:
- extension = php_openssl.dll
- allow_url_fopen = Ein
Er sagte mir, dass openssl kompiliert wird, wenn wir bauen, da wir auf Gentoo sind. und es ist nicht in der Datei php.ini festgelegt.
Ich habe auch bestätigt, dass allow_url_fopen
das funktioniert. Aufgrund der Spezialität dieses Problems; Ich finde nicht viele Informationen für Hilfe. Ist jemand von euch auf so etwas gestoßen? Vielen Dank.
Antworten:
Dies war ein enorm hilfreicher Link zu finden:
http://php.net/manual/en/migration56.openssl.php
Ein offizielles Dokument, das die Änderungen beschreibt, die zum Öffnen von ssl in PHP 5.6 vorgenommen wurden. Von hier aus erfuhr ich von einem weiteren Parameter, den ich auf false hätte setzen sollen: "verify_peer_name" => false
Mein Arbeitscode sieht also so aus:
quelle
file_get_contents($url, false, stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false))));
Sie sollten die Überprüfung nicht einfach deaktivieren. Eher sollten Sie ein Zertifikatspaket herunterladen, vielleicht reicht das Curl- Bundle?
Dann müssen Sie es nur noch auf Ihren Webserver stellen und dem Benutzer, der PHP ausführt, die Berechtigung zum Lesen der Datei erteilen. Dann sollte dieser Code für Sie funktionieren:
Hoffentlich befindet sich das Stammzertifikat der Site, auf die Sie zugreifen möchten, im Curl-Bundle. Wenn dies nicht der Fall ist, funktioniert dies immer noch nicht, bis Sie das Stammzertifikat der Site erhalten und in Ihre Zertifikatdatei einfügen.
quelle
stream_context_set_default
die verwendet werden kann, damit Sie sie nicht jedes Mal an file_get_contents übergeben müssenIch habe dies behoben, indem ich sichergestellt habe, dass OpenSSL auf meinem Computer installiert ist, und dies dann zu meiner php.ini hinzugefügt habe:
quelle
cert.pem
Datei heruntergeladen undphp.ini
openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem
Sie können dieses Problem umgehen, indem Sie eine benutzerdefinierte Funktion schreiben, die Curl verwendet, wie in:
Verwenden Sie dann einfach
file_get_contents_curl
stattfile_get_contents
wann immer Sie eine URL aufrufen, die mit https beginnt.quelle
Ich arbeite für mich und verwende PHP 5.6. Die openssl-Erweiterung sollte aktiviert sein und beim Aufrufen von google map api verify_peer make false Der folgende Code funktioniert für mich.
quelle
Wenn Ihre PHP-Version 5 ist, versuchen Sie, cURL zu installieren, indem Sie den folgenden Befehl in das Terminal eingeben:
quelle
cURL
.sudo port install php70-curl
Grundsätzlich müssen Sie die Umgebungsvariable SSL_CERT_FILE auf den Pfad der PEM-Datei des SSL-Zertifikats setzen, das über den folgenden Link heruntergeladen wurde: http://curl.haxx.se/ca/cacert.pem .
Ich habe viel Zeit gebraucht, um das herauszufinden.
quelle
Die folgenden Schritte beheben dieses Problem.
curl.cainfo
dem absoluten Pfad, in den Sie das Zertifikat heruntergeladen haben, und fügen Sie ihn ein.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"
hoffentlich hilft das !!
quelle
Ich wollte nur etwas hinzufügen, da ich auf dasselbe Problem stieß und nichts, was ich irgendwo finden konnte, funktionieren würde (z. B. Herunterladen der Datei cacert.pem, Festlegen von cafile in php.ini usw.)
Wenn Sie NGINX verwenden und Ihr SSL-Zertifikat mit einem "Zwischenzertifikat" geliefert wird, müssen Sie die Zwischenzertifikatsdatei mit Ihrer Hauptdatei "mydomain.com.crt" kombinieren, und es sollte funktionieren. Apache hat eine spezielle Einstellung für Zwischenzertifikate, NGINX jedoch nicht. Sie muss sich in derselben Datei befinden wie Ihr reguläres Zertifikat.
quelle
Grund für diesen Fehler ist, dass PHP keine Liste vertrauenswürdiger Zertifizierungsstellen hat.
PHP 5.6 und höher versuchen, die vom System vertrauenswürdigen Zertifizierungsstellen automatisch zu laden. Probleme damit können behoben werden. Siehe http://php.net/manual/en/migration56.openssl.phpWeitere Informationen finden .
PHP 5.5 und frühere Versionen sind sehr schwer korrekt einzurichten, da Sie das CA-Bundle in jedem Anforderungskontext manuell angeben müssen, was Sie nicht um Ihren Code streuen möchten. Deshalb habe ich für meinen Code entschieden, dass für PHP-Versionen <5.6 die SSL-Überprüfung einfach deaktiviert wird:
quelle
Hatte den gleichen Fehler mit PHP 7 unter XAMPP und OSX.
Die oben erwähnte Antwort in https://stackoverflow.com/ ist gut, aber sie hat das Problem für mich nicht vollständig gelöst. Ich musste die vollständige Zertifikatkette bereitstellen, damit file_get_contents () wieder funktioniert. So habe ich es gemacht:
Holen Sie sich das Root- / Zwischenzertifikat
Zuerst musste ich herausfinden, was die Wurzel ist und das Zwischenzertifikat ist.
Der bequemste Weg ist vielleicht ein Online-Zertifizierungs-Tool wie der SSL-Shopper
Dort fand ich drei Zertifikate, ein Serverzertifikat und zwei Kettenzertifikate (eines ist die Wurzel, das andere anscheinend das Zwischenprodukt).
Ich muss nur im Internet nach beiden suchen. In meinem Fall ist dies die Wurzel:
DV SSL SHA256 CA auftauen
Und es führt zu seiner URL thawte.com . Also habe ich dieses Zertifikat einfach in eine Textdatei eingefügt und das Gleiche für die Zwischenstufe getan. Getan.
Holen Sie sich das Host-Zertifikat
Als nächstes musste ich mein Serverzertifikat herunterladen. Unter Linux oder OS X kann dies mit openssl erfolgen:
Jetzt bring sie alle zusammen
Führen Sie jetzt einfach alle in einer Datei zusammen. (Vielleicht ist es gut, sie einfach in einen Ordner zu legen, ich habe sie nur in einer Datei zusammengeführt). Sie können es so machen:
Sagen Sie PHP, wo sich die Kette befindet
Es gibt diese praktische Funktion openssl_get_cert_locations (), die Ihnen sagt, wo PHP nach Zertifizierungsdateien sucht. Und es gibt diesen Parameter, der file_get_contents () mitteilt, wo nach Zertifizierungsdateien gesucht werden soll. Vielleicht funktionieren beide Wege. Ich habe den Parameter Weg bevorzugt. (Im Vergleich zu der oben genannten Lösung).
Das ist jetzt mein PHP-Code
Das ist alles. file_get_contents () funktioniert wieder. Ohne CURL und hoffentlich ohne Sicherheitslücken.
quelle
chain.pem
? Ist daschain.crt
?Nachdem ich unter CentOS diesem Problem zum Opfer gefallen war, nachdem ich PHP auf PHP5.6 aktualisiert hatte, fand ich eine Lösung, die für mich funktionierte.
Holen Sie sich damit das richtige Verzeichnis für Ihre Zertifikate, das standardmäßig abgelegt werden soll
Verwenden Sie diese Option, um das Zertifikat abzurufen und an der Standardposition abzulegen, die im obigen Code angegeben ist
quelle
Hatte das gleiche SSL-Problem auf meinem Entwicklercomputer (PHP 7, XAMPP unter Windows) mit einem selbstsignierten Zertifikat, das versuchte, eine " https: // localhost / ..." - Datei zu öffnen . Offensichtlich hat die Root-Zertifikat-Assembly (cacert.pem) nicht funktioniert. Ich habe gerade manuell den Code aus der Datei apache server.crt-Datei in die heruntergeladene Datei cacert.pem kopiert und den Eintrag openssl.cafile = path / to / cacert.pem in php.ini ausgeführt
quelle
Eine andere Sache, die Sie versuchen sollten, ist die Neuinstallation,
ca-certificates
wie hier beschrieben .Sie können auch versuchen, das hier beschriebene Zertifikat der einen Site explizit zuzulassen, wie hier beschrieben (insbesondere, wenn die eine Site Ihr eigener Server ist und Sie die .pem-Datei bereits in Reichweite haben).
Nach dem Upgrade auf PHP 5.6 unter CentOS 6 trat genau dieser SO-Fehler auf, als ich versuchte, auf den Server selbst zuzugreifen, der über ein billiges Sicherheitszertifikat verfügt, das möglicherweise aktualisiert werden musste. Stattdessen installierte ich ein letsencrypt-Zertifikat und führte diese beiden obigen Schritte aus der Trick. Ich weiß nicht, warum der zweite Schritt notwendig war.
Nützliche Befehle
OpenSL-Version anzeigen:
Aktuelle Einstellungen für PHP cli ssl anzeigen:
quelle
In Bezug auf Fehler ähnlich wie
Haben Sie die Berechtigungen des Zertifikats und der Verzeichnisse überprüft, auf die openssl verweist?
Du kannst das
Um etwas Ähnliches zu bekommen
Dieses Problem hat mich eine Weile frustriert, bis mir klar wurde, dass mein Ordner "certs" 700 Berechtigungen hatte, obwohl er 755 Berechtigungen hätte haben sollen. Denken Sie daran, dass dies nicht der Ordner für Schlüssel, sondern für Zertifikate ist. Ich empfehle, diesen Link über SSL-Berechtigungen zu lesen.
Einmal habe ich getan
Das Problem wurde behoben, zumindest für mich.
quelle
Ich hatte das gleiche Problem für eine andere sichere Seite bei der Verwendung von
wget
oderfile_get_contents
. Viele Nachforschungen (einschließlich einiger Antworten auf diese Frage) führten zu einer einfachen Lösung - Installation von Curl und PHP-Curl - Wenn ich das richtig verstanden habe, hat Curl die Stammzertifizierungsstelle für Comodo, die das Problem behoben hatInstallieren Sie das Curl- und PHP-Curl-Addon und starten Sie Apache neu
Alles funktioniert jetzt.
quelle