Kann file_get_contents oder cURL nicht über HTTPS verarbeiten

9

Ich habe file_get_contents verwendet, um den Inhalt einer Site seit Jahren zu erfassen.

Vor kurzem haben sie ihre URL auf HTTPS und file_get_contents aufgehört zu arbeiten aktualisiert.

Ich habe vorhergehende Fragen gelesen und markierte Lösungen versucht, aber nichts hat funktioniert.

Zum Beispiel habe ich dies versucht und Folgendes zurückgegeben:

%Vor%

Also versuchte ich diese Lösung mit file_get_contents , ohne Erfolg.

Ich versuchte dann diese Lösung mit cURL , um die Verschlüsselung ganz zu ignorieren, ohne Erfolg

Egal welche Lösung ich versuche, nichts wird zurückgegeben.

Ich habe nicht hinzugefügt extension=php_openssl.dll und allow_url_include = On zu PHP.ini nach diese a> Da sich diese bestimmte Site auf einem freigegebenen Host befindet und das Hosting-Unternehmen die Bearbeitung des PHP.ini-Files nicht zulässt, obwohl sie möglicherweise bereits standardmäßig aktiviert ist.

Ich habe andere HTTPS -Websites ausprobiert, und einige arbeiten und manche nicht und ich bin mir nicht sicher warum.

Ich habe von einem anderen Server (und einer anderen IP) auf demselben Web-Host versucht und es hat auch nicht mit der Ziel-Seite HTTPS funktioniert.

Wie kann ich dieses Problem beheben und beheben?

UPDATE:

phpinfo zeigt:

curl cURL support enabled cURL Information libcurl/7.36.0 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 libssh2/1.8.0

openssl OpenSSL support enabled OpenSSL Version OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

    
ProgrammerGirl 11.02.2017, 10:58
quelle

6 Antworten

1

ENDGÜLTIGE ANTWORT

Wenn Ihr ISP openSSL nicht auf TLS 1.2 aktualisiert, sollten Sie ernsthaft einen anderen ISP in Erwägung ziehen. Sie sollten Ihren Server mit dem untenstehenden Link "SSL SERVER TEST" testen. Ihr Server hat wahrscheinlich SSL-Sicherheitslücken.

Der Server, mit dem Sie eine Verbindung herstellen möchten, unterstützt nur TLS 1.2 und TLS 1.1 Unterstützt nicht: TLS 1.0, SSL 3, SSL2.

Wenn eine SSL-Anforderung als Teil des SSL-Protokolls erstellt wird, stellt curl dem Host-Server eine Liste von Verschlüsselungen bereit. Der Server wählt dann basierend auf der von curl dargestellten Liste aus, welches Chiffreprotokoll zu verwenden ist.

Der Host, den Sie versuchen zu beenden, unterstützt diese Chiffrier-Suites

%Vor%

Da Ihr openSSL im Juli 2008 veröffentlicht wurde und TLSv1.2 im folgenden Monat, August 2008, veröffentlicht wurde, ist das beste, was Sie haben, TLSv1.1

MÖGLICH TEMPORARY FIX bis zum Upgrade

Ich habe kein hohes Maß an Vertrauen, das wird für Sie funktionieren.

Sie sollten das SSL Ihres eigenen Servers mit so etwas wie diesem SSL-SERVER-TEST

testen

Wenn Ihr Server TLS1.1 unterstützt, können Sie Folgendes versuchen. Ich kann das nicht testen, weil ich nicht die gleiche Version von curl wie auf dem alten Server mit Ihrer Version von openSSL habe.

Verwenden Sie die curl-Option CURLOPT_SSL_CIPHER_LIST, um zu verhindern, dass der Host-Server etwas anderes als TLS 1.1

verwendet %Vor%

Wenn nicht, dann versuche:

%Vor%

UNTERE LINIE

Aus mehr Gründen als diesem Problem müssen Sie Ihr openSSL aktualisieren.

%Vor%

VORHERIGE FEHLERBEHEBUNG UNTER DIESEM PUNKT

Als erstes deaktiviere ich Javascript im Browser. Wenn ich die Seite mit einem Browser ohne Javascript abrufen kann, weiß ich, dass ich es mit PHP bekommen kann.

Ich erstelle die Anfrage so, dass sie genauso aussieht wie im Browser. Ich gehe zur Registerkarte "Netzwerk" des Inspektors und bearbeite den Anforderungs-Header und kopiere ihn und füge ihn in meinen Code ein.

%Vor%

Initalize curl

%Vor%

Fügen Sie die Anforderungsparameter hinzu

%Vor%

Sagen Sie curl, um die Header aufzunehmen

%Vor%

Gib die Antwort zurück

%Vor%

Folgen Sie Weiterleitungen Redirects können eine Falle sein. Möglicherweise müssen Sie die Antwort NICHT verfolgen und analysieren. Oft sind die Weiterleitungen dazu da, Cookies zu setzen.

%Vor%

Lassen Sie die Curl-Handle-Komprimierung

%Vor%

Legen Sie Timeout-Parameter fest

%Vor%

Machen Sie die Anfrage und erhalten Sie Antwort

Im Folgenden erhalten Sie alles, was Sie über die Anfragen wissen müssen. Die $ info wird auch alle Weiterleitungs-Header haben. Wenn Weiterleitungen vorgenommen wurden, hat der $ responseHeader alle Antwortheader.

UPDATE: Neuer vollständig getesteter Code

Das ist egal, weil das auch auf meinem Rechner funktioniert:

%Vor%

Wenn der Wechsel fehlschlägt, sollte Ihnen dieser Code einen Grund geben, WARUM er fehlgeschlagen ist.

Ändern Sie die URL. Diese gehört einem Client.

%Vor%

Wenn das oben genannte nicht funktionierte, führen Sie phpinfo ()

aus %Vor%

Es sollte einen curl-Abschnitt und openSSL geben.

--------------------------------------------------------------------

UPDATE ZWEI

Gute Nachrichten

Ich kenne das Problem und konnte die Fehler, die Sie bekommen haben, replizieren.

%Vor%

HINWEIS xxx war die Site von dem Link, den Sie mir gegeben haben, Sie können diese Nachricht jetzt löschen.

Lustige Sache, ich habe einen Server, den ich nicht aktualisiere. Und glücklicherweise hatte es ab Juli 2008 die gleiche Version von openSSL.

Sie müssen Ihr openSSL aktualisieren. Auch die Datei_get_contents () ist auf diesem Server ebenfalls fehlgeschlagen. Es funktionierte auf einer Version von openSSL im Februar 2013 sowie im Juni 2014.

Ich kann nicht sagen, ob noch etwas aktualisiert werden muss oder nicht, so wie die Funktionen, die openSSL verwenden, möglicherweise aktualisiert werden müssen (oder nicht müssen).

Ich gehe mit dem Sprichwort, wenn es nicht kaputt ist, repariere es nicht. Ich glaube, einige Upgrades sind tatsächlich schlechter. Ich bin immer noch auf XP. Aber es ist kaputt und du musst es reparieren.

Zumindest ist es kein Schuss im Dunkeln. Ich bin zuversichtlich, dass Sie upgraden müssen. Es war ein methodisches Verfahren zur Fehlerbehebung, mit dem Sie Ihre Fehler duplizieren konnten. Sie können auch file_get_contents() verwenden.

    
Misunderstood 12.02.2017, 08:18
quelle
1

benutze curl mit curl du kannst einfach jede Seite über https einfügen.

Beachten Sie diese Zeilen:

%Vor%

hier ist Arbeitscode, getestet für twitter und facebook

%Vor%

UPDATE 1: Verwenden Sie diesen Code, um die Datei zu speichern

%Vor%

hoffe, das hat dein Problem gelöst !!

Hier ist eine Demo auf meinem Server: Ссылка

    
EaBangalore 16.02.2017 05:01
quelle
0

Wenn in nothing ein leerer Antworttextkörper gemeint ist, klingt er nicht wie ein httpS-Problem. Wenn dies der Fall wäre, würde sich curl_exec beschweren, curl_exec () würde bool (false) zurückgeben, und curl_error () würde auf ein SSL-Problem hinweisen.

How can I debug and fix this?

Untersuchen Sie die von Ihrem Browser gesendete Anfrage, wenn Sie eine gültige Antwort erhalten (verwenden Sie hierzu die Browser-Tools Ihres Browsers, z. B. den Tab "Netzwerk" in Google Chrome Strg + Umschalt + i), und vergleichen Sie ihn mit der gesendeten Anfrage Wenn du eine ungültige Antwort erhältst (benutze CURLOPT_VERBOSE dafür), und 1 zu 1, füge alle Header hinzu, die der Browser sendet,

zum Beispiel, Sie werden feststellen, dass libcurl keine user-agent header sendet, während Ihr Browser etwas wie user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 sendet, also fügen Sie diese Überschrift hinzu. Sie werden auch bemerken, dass libcurl standardmäßig Accept: */* sendet, während Ihr Browser Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 sendet - also korrigieren Sie, dass curl die gleichen Header sendet.

Mach weiter so, bis die zwei Anfragen nicht mehr zu unterscheiden sind, und auf dem Weg wirst du den Unterschied finden, der die Locke blockiert.

meine Wette ist auf dem User-Agent-Header.

    
hanshenrik 11.02.2017 12:07
quelle
0

Manchmal hilft es, das Zertifikat und den Host nicht zu validieren, sondern einfach der Verschlüsselung in SSL zu vertrauen.

%Vor%     
powtac 14.02.2017 17:37
quelle
0

Hat die HTTPS-Site ein selbstsigniertes Zertifikat? Können Sie die Domänennamen für einige der Websites angeben, die funktionieren, und einige, die nicht funktionieren?

Haben Sie versucht, "allow_self_signed" => true in der Stream-Kontextkonfiguration zu verwenden?

So wird es wie folgt:

%Vor%     
peiiion 16.02.2017 19:09
quelle
0

Da es sich um ein Problem mit der SSL-Version handelt, könnten Sie CURL so einstellen, dass es mit CURLOPT_SSL_VERIFYPEER ignoriert wird.

Hier ist ein Skript, das mit der URL funktioniert, die Sie gepostet haben

%Vor%     
Iñaki Soria 18.02.2017 13:55
quelle

Tags und Links