file_get_contents(): SSL-Operation mit Code 1 fehlgeschlagen, Krypto konnte nicht aktiviert werden

Lesezeit: 8 Minuten

file get contents SSL Operation mit Code 1 fehlgeschlagen Krypto konnte nicht aktiviert
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.

  • 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

file get contents SSL Operation mit Code 1 fehlgeschlagen Krypto konnte nicht aktiviert
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; ?>

  • dies bricht die SSL-Zertifizierung und ist eine Sicherheitslücke

    – hypery2k

    5. Dezember 2014 um 20:37 Uhr

1646948048 318 file get contents SSL Operation mit Code 1 fehlgeschlagen Krypto konnte nicht aktiviert
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.

  • Es gibt auch eine hilfreiche Funktion stream_context_set_default die verwendet werden kann, damit Sie sie nicht jedes Mal an file_get_contents übergeben müssen

    – Ken Koch

    17. August 2016 um 16:02 Uhr

  • Wenn Sie Probleme haben, dies zum Laufen zu bringen, können Sie versuchen, hinzuzufügen "capture_peer_cert_chain" => true zu $arrContextOptions. Dann enthält der Aufruf von file_get_contents auch die Zertifikatskette des Hosts, mit dem Sie eine Verbindung herstellen möchten (Base64-codiert). Ich glaube, das letzte in der Ausgabe aufgeführte Zertifikat ist das Stammzertifikat, und dieses Zertifikat muss sich in der von Ihnen verwendeten Zertifikatsdatei befinden, damit dies funktioniert. Beachten Sie, dass es möglicherweise ein anderes Problem mit der Host- oder Client-Seite gibt, das dazu führt, dass es fehlschlägt (z. B. abgelaufenes Host-Zertifikat, Client-Zeit ist falsch usw.).

    – Elitehäuptling21

    13. April 2017 um 16:00 Uhr


  • Ich fand das extrem hilfreich. Bessere Antwort als die akzeptierte. Unser Server hat ein Zertifikat von RapidSSL, wo es für PHP auf keinem Rechner vorhanden ist, mit dem wir versuchen, eine Verbindung zum Server herzustellen. Also müssen wir die rapidssl2017.pem entfernen und php wissen lassen (dank dieser Antwort). In der Lage zu sein, file_get_contents() mitzuteilen, wo danach gesucht werden soll … ist viel schöner, als curl zum Greifen zu verwenden.

    – Unglaublicher Hut

    10. Oktober 2017 um 23:05 Uhr

  • Nachdem ich in meinem vorherigen Kommentar vom 10. Oktober alles zum Laufen gebracht habe, komme ich heute leider aus dem Urlaub zurück und es funktioniert nicht mehr. Das Verknüpfen oder Abrufen einer PEM-Datei funktioniert nicht. Musste vorübergehend auf die Deaktivierung der Überprüfung zurückgreifen 🙁 Ich werde irgendwann hier eine brandneue Frage zu unserem spezifischen Problem mit diesen beschissenen RapidSSL-Zertifikaten stellen.

    – Unglaublicher Hut

    30. Oktober 2017 um 18:06 Uhr

  • Aus Sicherheitssicht: Neben der Verwendung der Option cafile stream context kann es sehr wichtig sein, auch die erlaubten Chiffren in der Option ciphers stream context zu definieren und die als angreifbar bekannten SSL-Versionen zu verbieten. Außerdem wird empfohlen, die Stream-Kontextoption disable_compression auf „true“ zu setzen, um den CRIME-Angriffsvektor abzuschwächen.

    – Josef Glatz

    25. September 2018 um 10:08 Uhr

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

  • Ich habe die gleiche Methode mit PHP 7 auf IIS verwendet und die heruntergeladen cert.pem Datei und setze die php.ini so, und es funktionierte: openssl.cafile=D:\Tools\GnuWin32\bin\cacert.pem

    – David Refoua

    24. Februar 2017 um 11:13 Uhr

  • Ich habe die PEM-Datei von heruntergeladen curl.haxx.se/docs/caextract.html – Das Problem wurde für mich unter Windows mit einer bestimmten gstatic.com-URL behoben.

    – Jake

    12. Juni 2018 um 17:24 Uhr

  • Herunterladen der PEM-Datei von curl.haxx.se/docs/caextract.html hat bei mir unter Centos 7 nicht funktioniert. Ich habe ein Bundle-Zertifikat erstellt, indem ich das Hauptzertifikat und pkcs7 verkettet und auf dem Server abgelegt und dann den Pfad der Datei openssl.cafile angegeben habe. +1 für die richtige Antwort und Richtung.

    – Arvin K.

    14. Februar 2019 um 14:36 ​​Uhr


  • Vergessen Sie beim Erstellen eines Pakets nicht, pkcs in eine pem-Datei zu konvertieren, bevor Sie es mit der Hauptzertifizierung verknüpfen

    – Arvin K.

    14. Februar 2019 um 14:38 Uhr

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.

file get contents SSL Operation mit Code 1 fehlgeschlagen Krypto konnte nicht aktiviert
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.

1646948050 924 file get contents SSL Operation mit Code 1 fehlgeschlagen Krypto konnte nicht aktiviert
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

  • Damit hat das absolut nichts zu tun cURL.

    –Andreas

    15. Mai 2016 um 18:55 Uhr

  • Die Installation der PHP-Curl sollte die richtige Antwort sein! Für mein Mac-System verwende ich port, und der Befehl lautet: sudo port install php70-curl

    – Heil

    23. September 2016 um 0:45 Uhr


989050cookie-checkfile_get_contents(): SSL-Operation mit Code 1 fehlgeschlagen, Krypto konnte nicht aktiviert werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy