Ich verwende WAMP in einer lokalen Entwicklungsumgebung und versuche, eine Kreditkarte zu belasten, erhalte jedoch die Fehlermeldung:
cURL-Fehler 60: Problem mit SSL-Zertifikat: Kein lokales Ausstellerzertifikat abgerufen
Ich habe viel bei Google gesucht und viele Leute schlagen vor, diese Datei herunterzuladen: cacert.pem , irgendwo hinzustellen und in meiner php.ini darauf zu verweisen. Dies ist der Teil in meiner php.ini:
curl.cainfo = "C:\Windows\cacert.pem"
Selbst nachdem ich meinen Server mehrmals neu gestartet und den Pfad geändert habe, erhalte ich dieselbe Fehlermeldung.
Ich verwende WAMP von den Apache-Modulen und habe das ssl_module aktiviert. Und von den PGP-Erweiterungen habe ich php_curl aktiviert.
Immer noch die gleiche Fehlermeldung. Warum passiert das?
Nun folge ich diesem Fix: Wie PHP CURL Fehler 60 SSL beheben
Was bedeutet, dass ich diese Zeilen zu meinen cURL-Optionen hinzufüge:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
Wo füge ich meiner cURL Optionen hinzu? Anscheinend nicht über die Befehlszeile, da meine CLI den Befehl "curl_setopt" nicht findet.
EDIT
Dies ist der Code, den ich ausgeführt habe:
public function chargeStripe()
{
$stripe = new Stripe;
$stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));
$charge = $stripe->charges()->create([
'amount' => 2900,
'customer' => Input::get('stripeEmail'),
'currency' => 'EUR',
]);
dd($charge);
// echo $charge[Input::get('stripeToken')];
return Redirect::route('step1');
}
arbeitslösung:
XAMPP-Server
Ähnliches für andere Umgebungen - Download und Extrahieren für cacert.pem hier (ein sauberes Dateiformat/Daten)
C:\xampp\php\extras\ssl\cacert.pem
;;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
Problem gelöst!
Wenn Sie PHP 5.6 mit Guzzle verwenden, hat Guzzle die Bibliotheken von PHP automatisch für Zertifikate anstelle des Prozesses ( ref ) verwendet. PHP beschreibt die Änderungen hier .
Sie können ausgeben, wohin PHP sucht:
var_dump(openssl_get_cert_locations());
Für das Testen von OS X können Sie homebrew verwenden, um openssl brew install openssl
zu installieren, und anschließend openssl.cafile=/usr/local/etc/openssl/cert.pem
in Ihrer php.ini- oder Zend Server-Einstellung (unter OpenSSL) verwenden.
Ein Zertifikatspaket ist auch bei curl/Mozilla auf der curl-Website erhältlich: https://curl.haxx.se/docs/caextract.html
Wenn Sie ein Paket haben, platzieren Sie es entweder dort, wo PHP bereits sucht (was Sie oben herausgefunden haben), oder aktualisieren Sie openssl.cafile
in der php.ini. (Im Allgemeinen /etc/php.ini
oder /etc/php/7.0/cli/php.ini
oder /etc/php/php.ini
unter Unix.)
Achtung Wamp/Wordpress/Windows Benutzer. Ich hatte dieses Problem stundenlang und nicht einmal die richtige Antwort tat es für mich, weil ich die falsche php.ini-Datei bearbeitete, weil die Frage an XAMPP und nicht an WAMP-Benutzer beantwortet wurde, obwohl die Frage für WAMP war.
hier ist was ich getan habe
Laden Sie das Zertifikatspaket herunter.
Setzen Sie es in C:\wamp64\bin\php\your php version\extras\ssl
Stellen Sie sicher, dass sich die Datei mod_ssl.so
Innerhalb von C:\wamp64\bin\Apache\apache(version)\modules
befindet.
Aktivieren Sie mod_ssl
In httpd.conf
Im Apache-Verzeichnis C:\wamp64\bin\Apache\apache2.4.27\conf
Aktivieren Sie php_openssl.dll
In php.ini
. Beachten Sie, dass mein Problem darin bestand, dass ich zwei php.ini-Dateien hatte und dies in beiden tun muss. Die erste befindet sich hier in Ihrem WAMP-Taskleistensymbol.
und der andere befindet sich in C:\wamp64\bin\php\php(Version)
suchen Sie den Speicherort für beide php.ini
- Dateien, suchen Sie die Zeile curl.cainfo =
und geben Sie einen Pfad wie diesen ein
curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"
Speichern Sie nun die Dateien und starten Sie Ihren Server neu
Guzzle, das von cartalyst/stripe verwendet wird, sucht auf folgende Weise ein ordnungsgemäßes Zertifikatsarchiv, um ein Serverzertifikat darauf zu prüfen:
openssl.cafile
in Ihrer php.ini-Datei festgelegt ist.curl.cainfo
in Ihrer php.ini-Datei festgelegt ist./etc/pki/tls/certs/ca-bundle.crt
vorhanden ist (Red Hat, CentOS, Fedora; wird vom ca-certificate-Paket bereitgestellt)./etc/ssl/certs/ca-certificates.crt
vorhanden ist (Ubuntu, Debian; wird vom ca-certificate-Paket bereitgestellt)/usr/local/share/certs/ca-root-nss.crt
vorhanden ist (FreeBSD; wird vom Paket ca_root_nss bereitgestellt)/usr/local/etc/openssl/cert.pem
(OS X; von Homebrew bereitgestellt).C:\windows\system32\curl-ca-bundle.crt
existiert (Windows)C:\windows\curl-ca-bundle.crt
existiert (Windows)Sie müssen sicherstellen, dass die Werte für die ersten beiden Einstellungen richtig definiert sind, indem Sie einen einfachen Test durchführen:
echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";
Versuchen Sie alternativ, die Datei an den mit # 7 oder # 8 angegebenen Orten zu schreiben.
Wenn Sie die php.ini nicht ändern können, können Sie auch auf die Datei cacert.pem mit folgendem Code verweisen:
$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
Was ich tat, war var_dump(openssl_get_cert_locations()); die;
in jedem PHP-Skript, das mir Informationen über die Standardeinstellungen gab, die mein lokaler PHP-Server verwendete:
array (size=8)
'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
'ini_capath' => string '' (length=0)
Wie Sie feststellen können, habe ich ini_cafile oder die ini-Option curl.cainfo gesetzt. In meinem Fall würde curl versuchen, die "default_cert_file" zu verwenden, die nicht vorhanden war.
Ich habe die Datei von https://curl.haxx.se/ca/cacert.pem in den Speicherort für "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem) kopiert und das war ich fähig, es zur Arbeit zu bringen.
Dies war die einzige Lösung für mich.
Ich habe eine Lösung gefunden, die für mich funktioniert hat. Ich habe von der neuesten Version auf Version ~ 4.0 heruntergestuft und es hat funktioniert.
In composer.json füge "guzzlehttp/guzzle" hinzu: "~ 4.0"
Hoffe es hilft jemandem
Ich hatte dieses Problem an einem Tag, als ein Guzzle (5) -Skript versuchte, über SSL eine Verbindung zu einem Host herzustellen, aus dem Blauen heraus erscheinen. Klar, ich könnte die VERIFY-Option in Guzzle/Curl deaktivieren, aber das ist eindeutig nicht der richtige Weg.
Ich habe alles hier und in ähnlichen Threads ausprobiert und ging schließlich mit openssl zum Terminal, um die Domäne zu testen, mit der ich mich verbinden wollte:
openssl s_client -connect example.com:443
... und erhielt die ersten Zeilen mit folgenden Angaben:
CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1
... während alles gut funktioniert hat, wenn Sie andere Ziele ausprobieren (zB google.com usw.)
Dies veranlasste mich, Kontakt mit der Domäne aufzunehmen, mit der ich mich verbinden wollte, und tatsächlich hatten sie ein Problem an ihrem Ende, das sich eingeschlichen hatte. Es wurde gelöst und mein Skript funktionierte wieder.
Also ... Wenn Sie Ihre Haare herausziehen, geben Sie OpenSL eine Chance und sehen Sie, ob die Antwort des Ortes, an dem Sie eine Verbindung herstellen möchten, nicht stimmt. Vielleicht ist das Thema manchmal doch nicht so "lokal".
Stellen Sie sicher, dass Sie die php.ini
-Datei direkt über den Windows Explorer öffnen. (in meinem Fall: C:\DevPrograms\wamp64\bin\php\php5.6.25
).
Verwenden Sie nicht die Verknüpfung zu php.ini
im Menü des Wamp/Xamp-Symbols in der Taskleiste. Diese Verknüpfung funktioniert in diesem Fall nicht.
Bearbeiten Sie dann diesen php.ini
:
curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem"
und
openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
Nach dem Speichern von php.ini
müssen Sie im Wamp-Symbol nicht "Alle Dienste neu starten" oder CMD schließen/erneut öffnen.
Das gleiche Problem habe ich gerade mit dem Laravel 4 PHP-Framework erlebt, das das guzzlehttp/guzzle
-Composer-Paket verwendet. Aus irgendeinem Grund wurde das SSL-Zertifikat für Mailgun plötzlich nicht mehr validiert, und ich erhielt dieselbe Fehlermeldung "Fehler 60".
Wenn Sie wie ich auf einem Shared Hosting ohne Zugriff auf php.ini
arbeiten, sind die anderen Lösungen nicht möglich. In jedem Fall hat Guzzle diesen Client, der Code initialisiert, der die php.ini
-Effekte höchstwahrscheinlich aufheben würde:
// vendor/guzzlehttp/guzzle/src/Client.php
$settings = [
'allow_redirects' => true,
'exceptions' => true,
'decode_content' => true,
'verify' => __DIR__ . '/cacert.pem'
];
Hier erzwingt Guzzle die Verwendung seiner eigenen internen Datei cacert.pem, die wahrscheinlich nicht mehr aktuell ist, anstatt die von cURLs Umgebung bereitgestellte zu verwenden. Wenn Sie diese Zeile ändern (mindestens unter Linux), konfiguriert Guzzle die standardmäßige SSL-Überprüfungslogik von cURL und behebt das Problem:
'verify' => true
Sie können dies auch auf false
setzen, wenn Sie sich nicht für die Sicherheit Ihrer SSL-Verbindung interessieren. Dies ist jedoch keine gute Lösung.
Da die Dateien in vendor
nicht manipuliert werden sollen, wäre eine bessere Lösung die Verwendung von Konfigurieren des Guzzle-Clients , aber dies war in Laravel 4 einfach zu schwierig.
Hoffe, das erspart jemandem ein paar Stunden Debuggen ...
Dies könnte ein Edge-Fall sein, aber in meinem Fall war das Problem nicht das client conf (ich hatte bereits curl.cainfo
in php.ini
konfiguriert), sondern der Remote-Server wurde nicht ordnungsgemäß konfiguriert:
Es wurden keine certs in der Kette gesendet. Beim Durchsuchen der Site mit Chrome ist kein Fehler aufgetreten, aber mit PHP wurde der folgende Fehler angezeigt.
cURL-Fehler 60
Nachdem das Intermediate Certs in die Konfiguration des Remote-Webservers aufgenommen wurde, funktionierte es.
Sie können diese Site verwenden, um die SSL-Konfiguration Ihres Servers zu überprüfen:
Ich habe zu viel Zeit gebraucht, um dieses Problem für mich zu klären.
Ich hatte PHP Version 5.5 und musste auf 5.6 upgraden.
In Versionen <5.6 verwendet Guzzle seine eigene Datei cacert.pem, in höheren Versionen von PHP jedoch die Datei cacert.pem des Systems.
Ich habe auch eine Datei von hier https://curl.haxx.se/docs/caextract.html heruntergeladen und in php.ini eingestellt.
Antwort gefunden in der Guzzles StreamHandler.php-Datei https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437
// PHP 5.6 or greater will find the system cert by default. When // < 5.6, use the Guzzle bundled cacert.
Alle Antworten sind korrekt. aber das Wichtigste Sie müssen die richtige php.ini-Datei finden. Überprüfen Sie diesen Befehl in cmd "php --ini" ist nicht die richtige Antwort , um die richtige php.ini-Datei zu finden.
wenn du editierst
curl.cainfo ="PATH/cacert.pem"
und prüfe
var_dump(openssl_get_cert_locations());
dann sollte curl.cainfo einen Wert haben. wenn nicht, dann ist das nicht die php.ini-Datei;
* Ich empfehle Ihnen, * .ini in wamp/bin oder xxamp/bin oder einem anderen Server, den Sie verwenden, zu durchsuchen und sie nacheinander zu ändern und zu überprüfen. *
Hast du es versucht..
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
Wenn Sie eine vertrauenswürdige Quelle verwenden, müssen Sie das SSL-Zertifikat nicht verifizieren.
wenn ich 'var_dump(php_ini_loaded_file());'
.__ starte, bekomme ich diese Ausgabe auf meiner Seite 'C:\Development\bin\Apache\apache2.4.33\bin\php.ini' (length=50)'
und um php zu bekommen, um meine cert-Datei zu laden, musste ich die php.ini in diesem Pfad 'C:\Development\bin\Apache\apache2.4.33\bin\php.ini'
bearbeiten und openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"
hinzufügen, wo ich heruntergeladen hatte, und meine cert-Datei unter https://curl.haxx.se/docs platzieren /caextract.html
bin unter Windows 10, benutze Drupal 8, Wamp und PHP 7.2.4