
Jo
Ich habe versucht, von einer PHP-Seite, die ich auf unserem Server erstellt habe, auf diesen speziellen REST-Dienst 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 den folgenden Fehlern:
- Warnung: file_get_contents(): SSL-Operation mit Code 1 fehlgeschlagen. OpenSSL-Fehlermeldungen: Fehler: 14090086: SSL-Routinen: SSL3_GET_SERVER_CERTIFICATE: Zertifikatsüberprüfung fehlgeschlagen in …php in Zeile 2
- Warnung: file_get_contents(): Krypto konnte in …php in Zeile 2 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 auf PHP Version 5.6 aktualisiert. Es war nach dem Upgrade, als dieses Problem auftrat.
Ich fand, wenn ich den REST-Dienst durch eine Adresse wie ersetzte https://www.google.com
; Meine Seite funktioniert einwandfrei.
In einem früheren Versuch habe ich eingestellt “verify_peer”=>false
, und übergab das als Argument an file_get_contents, wie hier beschrieben: file_get_contents ignoring verify_peer=>false? Aber wie der Autor bemerkte; es machte keinen Unterschied.
Ich habe einen unserer Serveradministratoren gefragt, ob diese Zeilen in unserer php.ini-Datei existieren:
- extension=php_openssl.dll
- allow_url_fopen = Ein
Er sagte mir, dass, da wir auf Gentoo sind, openssl kompiliert wird, wenn wir bauen; und es ist nicht in der php.ini-Datei festgelegt.
Das habe ich auch bestätigt allow_url_fopen
funktioniert. Aufgrund der speziellen Natur dieses Problems; Ich finde nicht viele Informationen für Hilfe. Ist jemand von euch auf so etwas gestoßen? Danke.

Jo
Dies war ein enorm hilfreicher Link zu finden:
http://php.net/manual/en/migration56.openssl.php
Ein offizielles Dokument, das die Änderungen an open ssl in PHP 5.6 beschreibt Von hier erfuhr ich von einem weiteren Parameter, den ich auf false hätte setzen sollen: “verify_peer_name”=>false
Notiz: Das hat sehr erhebliche Auswirkungen auf die Sicherheit. Das Deaktivieren der Überprüfung ermöglicht möglicherweise a MITM-Angreifer um die Anfragen mit einem ungültigen Zertifikat abzuhören. Während dies in der lokalen Entwicklung sinnvoll sein kann, sollten in der Produktion andere Ansätze verwendet werden.
Mein Arbeitscode sieht also so aus:
<?php
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$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", false, stream_context_create($arrContextOptions));
echo $response; ?>

Elitechef21
Sie sollten die Überprüfung nicht einfach deaktivieren. Vielmehr sollten Sie ein Zertifikatspaket herunterladen, vielleicht das kräuseln Bundle reicht?
Dann müssen Sie es nur auf Ihrem Webserver ablegen und dem Benutzer, der PHP ausführt, die Berechtigung geben, die Datei zu lesen. Dann sollte dieser Code für Sie funktionieren:
$arrContextOptions= [
'ssl' => [
'cafile' => '/path/to/bundle/cacert.pem',
'verify_peer'=> true,
'verify_peer_name'=> true,
],
];
$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',
false,
stream_context_create($arrContextOptions)
);
Hoffentlich befindet sich das Root-Zertifikat 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 es in Ihre Zertifikatsdatei einfügen.
Ich habe dies behoben, indem ich sichergestellt habe, dass OpenSSL auf meinem Computer installiert war, und dies dann zu meiner php.ini hinzugefügt habe:
openssl.cafile=/usr/local/etc/openssl/cert.pem
Sie können dieses Problem umgehen, indem Sie eine benutzerdefinierte Funktion schreiben, die curl verwendet, wie in:
function file_get_contents_curl( $url ) {
$ch = curl_init();
curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE );
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE );
$data = curl_exec( $ch );
curl_close( $ch );
return $data;
}
Dann einfach verwenden file_get_contents_curl
anstatt file_get_contents
wenn Sie eine URL aufrufen, die mit https beginnt.

Dipti
Für mich arbeite ich mit PHP 5.6. Die Openssl-Erweiterung sollte aktiviert sein und beim Aufrufen von Google Map API verify_peer falsch machen. Der folgende Code funktioniert für mich.
<?php
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$url = "https://maps.googleapis.com/maps/api/geocode/json?latlng="
. $latitude
. ","
. $longitude
. "&sensor=false&key="
. Yii::$app->params['GOOGLE_API_KEY'];
$data = file_get_contents($url, false, stream_context_create($arrContextOptions));
echo $data;
?>
Grundsätzlich müssen Sie die Umgebungsvariable SSL_CERT_FILE auf den Pfad der PEM-Datei des SSL-Zertifikats setzen, das Sie über den folgenden Link herunterladen: http://curl.haxx.se/ca/cacert.pem.
Ich habe viel Zeit gebraucht, um das herauszufinden.

Stich
Wenn Ihre PHP-Version 5 ist, versuchen Sie, cURL zu installieren, indem Sie den folgenden Befehl im Terminal eingeben:
sudo apt-get install php5-curl
9890500cookie-checkfile_get_contents(): SSL-Operation mit Code 1 fehlgeschlagen, Krypto konnte nicht aktiviert werdenyes
Wenn Sie Kaspersky verwenden, überprüfen Sie dies: stackoverflow.com/a/54791481/3549317
– cespon
20. Februar 2019 um 16:58 Uhr
Ich habe festgestellt, dass ich diesen Fehler nur erhalte, wenn ich innerhalb derselben Website (nicht lokal) scrape, dh: das Scrapen einer anderen Website, auf der das Skript ausgeführt wird, funktionierte perfekt.
– WilliamK
22. Juli 2020 um 22:44 Uhr
Für diejenigen unter Ihnen, die dies im Jahr 2021 erhalten, lesen Sie bitte diese Ausgabe: stackoverflow.com/questions/69413223/…
– Glücksweb
2. Oktober 2021 um 2:02 Uhr