it-swarm.com.de

Verbindung zu HTTPS-Site kann nicht mithilfe von cURL hergestellt werden. Gibt stattdessen den Längeninhalt zurück. Was kann ich machen?

Ich habe eine Site, die mit cURL (neueste Version) eine Verbindung zu einem sicheren Gateway zur Zahlung herstellt.

Das Problem ist, dass cURL immer den Inhalt mit der Länge 0 zurückgibt. Ich bekomme nur Kopfzeilen. Und nur, wenn ich cURL so eingestellt habe, dass Header zurückgegeben werden. Ich habe die folgenden Flaggen.

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, $gatewayURI);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_POST, 1);

Der zurückgegebene Header lautet

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Tue, 25 Nov 2008 01:08:34 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 0
Content-Type: text/html
Set-Cookie: ASPSESSIONIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/
Cache-control: private

Ich habe auch versucht, verschiedene Sites zu cURLen, und sie geben den Inhalt gut zurück. Ich denke, das Problem könnte etwas mit der https-Verbindung zu tun haben.

Ich habe mit der Firma gesprochen und sie sind nicht hilfreich.

Hat jemand diesen Fehler erfahren und eine Problemumgehung kennen? Soll ich cURL aufgeben und fsockopen() verwenden?

Vielen Dank. :)

61
alex

Sie sollten auch versuchen, die Fehlermeldungen in curl_error () zu überprüfen. Möglicherweise müssen Sie dies einmal nach jeder curl_ * -Funktion tun.

http://www.php.net/curl_error

33
too much php

Ich hatte heute das gleiche Problem .. _. Curl verfügt über eine veraltete Datei, um HTTPS-Zertifikate zu authentifizieren.

holen Sie sich das Neue von:

http://curl.haxx.se/ca/cacert.pem

speichern Sie es in einem Verzeichnis auf Ihrer Website 

und hinzufügen 

curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); 

Zu jeder Anfrage :-)

IGNORE irgendwelche dummen Kommentare zum Deaktivieren von CURLOPT_VERIFYPEER und CURLOPT_VERIFYHOST !! Dadurch ist Ihr Code für die Angriffe von Menschen anfällig!

Dezember 2016 edit:

Lösen Sie dies richtig, indem Sie die unten erwähnte Methode von Jasen verwenden.

füge curl.cainfo=/etc/ssl/certs/ca-certificates.crt zu deiner php.ini hinzu

Oktober 2017 edit:

Es gibt jetzt ein Composer-Paket, mit dem Sie die ca-Zertifikate verwalten können, sodass Sie nicht verwundbar sind, wenn cacert.pem aufgrund des Sperrens von Zertifikaten veraltet ist.

https://github.com/paragonie/certainty -> composer require paragonie/certainty:dev-master

97
SchizoDuckie

Hinweis: Dies ist strikt keine Verwendung in der Produktion. Wenn Sie schnell debuggen möchten, kann dies hilfreich sein. Ansonsten verwenden Sie bitte die Antwort von @ SchizoDuckie. 

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);     
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 

Fügen Sie sie einfach hinzu. Es klappt. 

28
mixdev

Hatte gerade ein sehr ähnliches Problem und löste es durch Hinzufügen

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

Anscheinend holt die Site Weiterleitungen an einen anderen Speicherort und php-curl folgt standardmäßig nicht der Weiterleitung.

6
Cobra_Fast

Ich hatte eine Situation, in der dies half: (PHP 5.4.16 unter Windows)

curl_setopt($ch, CURLOPT_SSLVERSION, 3);
4
user203319

Wann immer ich etwas mit PHP/Curl teste, probiere ich es zuerst von der Kommandozeile aus, finde heraus, was funktioniert und portiere meine Optionen dann zu PHP.

3
Issac Kelly

Manchmal müssen Sie Ihre Curl-Zertifikate auf die neueste Version aktualisieren, um keine Fehler mit https zu erhalten.

2
Elzo Valugi

Ich habe file_get_contents mit stream_create_context verwendet und es funktioniert gut:

$postdataStr = http_build_query($postdataArr);

$context_options = array (
        'http' => array (    <blink> // this will allways be http!!!</blink>
            'method' => 'POST',
            'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                . "Content-Length: " . strlen($postdataArr) . "\r\n"
                . "Cookie: " . $cookies."\r\n"
            'content' => $postdataStr
            )
        );

$context = stream_context_create($context_options);
$HTTPSReq = file_get_contents('https://www.example.com/', false, $context);
1
adyphp

Die beste Möglichkeit, https zu verwenden und Sicherheitsprobleme zu vermeiden, besteht darin, Firefox (oder ein anderes Tool) zu verwenden und das Zertifikat auf Ihren Server herunterzuladen. Diese Webseite hat mir sehr geholfen , und diese Schritte haben bei mir funktioniert:

1) Öffnen Sie in Firefox die URL, die Sie mit CURL verwenden möchten

2) Klicken Sie in der Adressleiste auf padlock> more information (FF-Versionen können unterschiedliche Menüs haben, finden Sie sie einfach). Drücke den View certificate button> Details tab.

3) Markieren Sie das "richtige" Zertifikat in Certificate hierarchy. In meinem Fall war es das zweite von drei, "cPanel, Inc. Certification Authority". Ich habe gerade die richtige durch "Versuch und Irrtum" -Methode entdeckt.

4) Klicken Sie auf Export Taste. In meinem Fall war derjenige, der arbeitete, der Dateityp "PEM mit Ketten" (ebenfalls durch Versuch und Irrtum).

5) Fügen Sie dann in Ihrem PHP -Skript Folgendes hinzu:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);    
curl_setopt($ch, CURLOPT_CAINFO, [PATH_TO_CRT_FILE]);

Außerdem muss darauf geachtet werden, dass diese Schritte möglicherweise einmal im Jahr oder bei jedem Austausch oder jeder Erneuerung des URL-Zertifikats erneut durchgeführt werden müssen.

0
Heitor

in Ihrem Webhosting-Unternehmen kann ein Problem auftreten, bei dem Sie die sichere Kommunikation für das Gateway testen und möglicherweise das nicht zulassen.

möglicherweise muss auch ein Benutzername und ein Kennwort angegeben werden, bevor Sie eine Verbindung zum Remote-Host herstellen können.

möglicherweise muss sich Ihre IP-Adresse in der Liste der genehmigten IP-Adressen befinden, damit der Remote-Server die Kommunikation initiieren kann.

0

Ich habe diesen Fehler in einem aktuellen Anwendungsprojekt entdeckt. Ich habe geschrieben, um von der Befehlszeile oder vom Browserfenster aus zu laufen, also habe ich die Servererkennung verwendet, um die relative URL des Dokuments zu erhalten, nach dem ich gefragt habe. Das Problem war, dass die Site https ist, und jedes Mal, wenn ich versuchte, auf http: // (gleicher server) zuzugreifen, wurde es von cURL hilfreich in https geändert.

Dies funktioniert vom Browser aus problemlos, aber von der Befehlszeile aus würde ich dann einen SSL-Fehler erhalten, obwohl beide Verify-Werte auf false gesetzt sind. Was ich tun musste, war 

1) Überprüfen Sie $ _SERVER ['HTTP_Host']. Falls vorhanden, verwenden Sie ($ _SERVER ['HTTPS']? "Https: //": "http: //"). $ _ SERVER ['HTTP_Host']

2) Überprüfen Sie $ _SERVER ['COMPUTERNAME'], und geben Sie die https-URL an, wenn sie mit dem Produktionsserver übereinstimmt. (" https: // (servername) ")

3) Wenn keine der Bedingungen erfüllt ist, bedeutet dies, dass ich die Befehlszeile auf einem anderen Server ausführen und " http: // localhost " verwenden.

Nun, das hat funktioniert, aber es ist ein Hack. Ich habe auch nie herausgefunden, warum cURL auf einem Server (https) meine URL geändert hat, während auf dem anderen (auch https) meine URL allein gelassen wurde. 

Seltsam.

0
Michael