Ich verwende WAMP in einer lokalen Entwicklungsumgebung und versuche, eine Kreditkarte zu belasten, erhalte jedoch die folgende Fehlermeldung:
cURL-Fehler 60: SSL-Zertifikatproblem: Lokales Ausstellerzertifikat kann nicht abgerufen werden
Ich habe viel bei Google gesucht und viele Leute schlagen vor, diese Datei herunterzuladen: cacert.pem , sie irgendwo abzulegen und in meiner php.ini zu referenzieren. Dies ist der Teil in meiner php.ini:
curl.cainfo = "C:\Windows\cacert.pem"
Selbst nach mehrmaligem Neustart meines Servers und Ändern des Pfads wird dieselbe Fehlermeldung angezeigt.
Ich verwende WAMP aus 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?
Jetzt folge ich diesem Fix: So beheben Sie PHP CURL Fehler 60 SSL
Was darauf hindeutet, 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.
BEARBEITEN
Dies ist der Code, den ich ausführe:
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');
}
Antworten:
Arbeitslösung unter der Annahme, dass Sie unter Windows XAMPP verwenden:
Starten Sie Ihren Webserver / Apache neu
Problem gelöst!
(Referenz: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )
quelle
curl.cainfo = "C:/cacert.pem"
und musste auch meinen Computer neu starten, damit er funktioniert. Es reichte nicht aus, den Webserver neu zu starten. Hoffentlich hilft das:]curl.cainfo
(Gesichtspalme)Achtung Wamp / Wordpress / Windows-Benutzer. Ich hatte dieses Problem stundenlang und nicht einmal die richtige Antwort hat es für mich getan, weil ich die falsche php.ini-Datei bearbeitet habe, weil die Frage an XAMPP beantwortet wurde und nicht für WAMP-Benutzer, obwohl die Frage für WAMP war.
Hier ist was ich getan habe
Laden Sie die Zertifikatspaket .
Legen Sie es in
C:\wamp64\bin\php\your php version\extras\ssl
Stellen Sie sicher, dass die Datei
mod_ssl.so
befindetC:\wamp64\bin\apache\apache(version)\modules
Aktivieren
mod_ssl
inhttpd.conf
innerhalb von Apache - VerzeichnisC:\wamp64\bin\apache\apache2.4.27\conf
Aktivieren
php_openssl.dll
inphp.ini
. Seien Sie sich bewusst, dass mein Problem darin bestand, dass ich zwei php.ini-Dateien hatte und dies in beiden tun muss. Das 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 Zeilecurl.cainfo =
und geben Sie einen Pfad wie diesen ancurl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"
Speichern Sie nun die Dateien und starten Sie Ihren Server neu. Sie sollten bereit sein
quelle
Wenn Sie PHP 5.6 mit Guzzle verwenden, hat Guzzle die automatische Erkennung der PHP-Bibliotheken für Zertifikate anstelle des Prozesses ( ref ) verwendet. PHP beschreibt die Änderungen hier .
Finden Sie heraus, wo PHP / Guzzle nach Zertifikaten sucht
Sie können sichern, wo PHP sucht, indem Sie Folgendes verwenden:
Ein Zertifikatspaket erhalten
Für OS X-Tests können Sie mit homebrew openssl installieren
brew install openssl
und dannopenssl.cafile=/usr/local/etc/openssl/cert.pem
in Ihren Einstellungen für php.ini oder Zend Server (unter OpenSSL) verwenden.Ein Zertifikatspaket ist auch bei curl / Mozilla auf der curl-Website erhältlich: https://curl.haxx.se/docs/caextract.html
PHP mitteilen, wo sich die Zertifikate befinden
Sobald Sie ein Bundle haben, platzieren Sie es entweder dort, wo PHP bereits sucht (was Sie oben herausgefunden haben) oder aktualisieren Sie es
openssl.cafile
in der php.ini. ( Im Allgemeinen/etc/php.ini
oder/etc/php/7.0/cli/php.ini
oder/etc/php/php.ini
auf Unix.)quelle
openssl_get_cert_locations
, es hat das Debuggen viel einfacher gemacht. Es sieht so aus, als ob WAMP für Apache PHP eine andere INI-Datei verwendet als für Console PHP. In meinem Fall musste ichopenssl.cafile="c:/_/cacert.pem"
für konsolenbasiertes PHP hinzufügen . Als ich es das letzte Mal über Apache verwendet habe, musste ichcurl.cainfo="c:/_/cacert.pem"
dafür sorgen, dass es funktioniert.Guzzle, das von Cartalyst / Stripe verwendet wird , führt die folgenden Schritte aus , um ein geeignetes Zertifikatarchiv zu finden, anhand dessen ein Serverzertifikat überprüft werden kann:
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 (Red Hat, CentOS, Fedora; im Paket mit den Ca-Zertifikaten enthalten)./etc/ssl/certs/ca-certificates.crt
existiert (Ubuntu, Debian; bereitgestellt durch das ca-certificates-Paket)/usr/local/share/certs/ca-root-nss.crt
vorhanden (FreeBSD; bereitgestellt vom Paket ca_root_nss)./usr/local/etc/openssl/cert.pem
(OS X; bereitgestellt von Homebrew)C:\windows\system32\curl-ca-bundle.crt
vorhanden (Windows)C:\windows\curl-ca-bundle.crt
vorhanden (Windows)Sie sollten sicherstellen, dass die Werte für die ersten beiden Einstellungen richtig definiert sind, indem Sie einen einfachen Test durchführen:
Versuchen Sie alternativ, die Datei an die durch # 7 oder # 8 angegebenen Speicherorte zu schreiben.
quelle
Wenn Sie die php.ini nicht ändern können, können Sie auch aus folgendem Code auf die Datei cacert.pem verweisen:
quelle
Was ich getan habe, war die Verwendung
var_dump(openssl_get_cert_locations()); die;
in einem PHP-Skript, das mir die Informationen über die Standardeinstellungen gab, die mein lokales PHP verwendete:Wie Sie sehen können, habe ich die ini_cafile oder die ini-Option curl.cainfo gesetzt. In meinem Fall würde curl jedoch versuchen, die "default_cert_file" zu verwenden, die nicht vorhanden war.
Ich habe die Datei von https://curl.haxx.se/ca/cacert.pem an den Speicherort für "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem) kopiert und konnte sie abrufen arbeiten.
Dies war die einzige Lösung für mich.
quelle
Ich hatte dieses Problem eines Tages aus heiterem Himmel, als ein Guzzle (5) -Skript versuchte, über SSL eine Verbindung zu einem Host herzustellen. Sicher, ich könnte die Option VERIFY in Guzzle / Curl deaktivieren, aber das ist eindeutig nicht der richtige Weg.
Ich habe alles versucht, was hier und in ähnlichen Threads aufgeführt ist, und bin dann schließlich mit openssl zum Terminal gegangen, um die Domain zu testen, mit der ich mich verbinden wollte:
... und erhielt die ersten Zeilen mit folgenden Angaben:
... während beim Ausprobieren anderer Ziele (z. B. google.com usw.) alles gut funktioniert hat
Dies veranlasste mich, Kontakt mit der Domain aufzunehmen, zu der ich versucht hatte, eine Verbindung herzustellen, und tatsächlich hatten sie ein Problem an ihrem Ende, das sich eingeschlichen hatte. Es wurde behoben und mein Skript funktionierte wieder.
Also ... wenn Sie sich die Haare ausreißen, versuchen Sie es mit openssl und prüfen Sie, ob die Antwort von dem Ort, an dem Sie eine Verbindung herstellen möchten, stimmt. Vielleicht ist das Problem doch manchmal nicht so "lokal".
quelle
Ich habe eine Lösung gefunden, die für mich funktioniert. Ich habe von der neuesten Version auf Version ~ 4.0 heruntergestuft und es hat funktioniert.
Fügen Sie in composer.json "guzzlehttp / guzzle" hinzu: "~ 4.0"
Hoffe es hilft jemandem
quelle
Stellen Sie sicher, dass Sie die
php.ini
Datei direkt in Ihrem Fenster-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.Dann bearbeiten Sie das
php.ini
:und
Nach dem Speichern müssen
php.ini
Sie im Wamp-Symbol nicht "Alle Dienste neu starten" oder CMD schließen / erneut öffnen.quelle
Hast du es versucht..
Wenn Sie eine vertrauenswürdige Quelle verwenden, müssen Sie das SSL-Zertifikat möglicherweise nicht überprüfen.
quelle
Ich habe zu viel Zeit damit verbracht, dieses Problem für mich herauszufinden.
Ich hatte PHP Version 5.5 und musste auf 5.6 aktualisieren.
In Versionen <5.6 verwendet Guzzle eine eigene Datei cacert.pem, in höheren Versionen von PHP jedoch die Datei cacert.pem des Systems.
Ich habe auch die Datei von hier https://curl.haxx.se/docs/caextract.html heruntergeladen und in php.ini eingestellt.
Antwort in der Guzzles StreamHandler.php-Datei https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437 gefunden
quelle
Alle Antworten sind richtig; Aber das Wichtigste ist, dass Sie die richtige php.ini-Datei finden müssen. Überprüfen Sie diesen Befehl in cmd "php --ini" ist nicht die richtige Antwort um die richtige php.ini-Datei zu finden.
wenn Sie bearbeiten
und prüfe
dann sollte curl.cainfo einen Wert haben. Wenn nicht, dann ist das nicht die richtige php.ini-Datei.
* Ich empfehle Ihnen, * .ini in wamp / bin oder xxamp / bin oder einem beliebigen Server zu suchen und diese nacheinander zu ändern und zu überprüfen. * *
quelle
Ich habe gerade das gleiche Problem 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 überprüft, und ich erhielt dieselbe Meldung "Fehler 60".Wenn Sie sich wie ich auf einem Shared Hosting ohne Zugriff befinden,
php.ini
sind die anderen Lösungen nicht möglich. In jedem Fall hat Guzzle diesen Client, der Code initialisiert, der höchstwahrscheinlich diephp.ini
Auswirkungen zunichte machen würde :Hier erzwingt Guzzle die Verwendung seiner eigenen internen cacert.pem-Datei, die wahrscheinlich veraltet ist, anstatt die von der cURL-Umgebung bereitgestellte zu verwenden . Durch Ändern dieser Zeile (zumindest unter Linux) wird Guzzle so konfiguriert, dass die Standard-SSL-Überprüfungslogik von cURL verwendet wird, und mein Problem wurde behoben:
Sie können dies auch festlegen,
false
wenn Sie sich nicht um die Sicherheit Ihrer SSL-Verbindung kümmern, dies ist jedoch keine gute Lösung.Da die Dateien in
vendor
nicht manipuliert werden sollen, wäre es eine bessere Lösung, den Guzzle-Client bei Verwendung zu konfigurieren. Dies war jedoch in Laravel 4 einfach zu schwierig.Hoffe, das erspart jemand anderem ein paar Stunden Debugging ...
quelle
Dies mag ein Randfall sein , aber in meinem Fall war das Problem nicht das Client-Conf (das ich bereits
curl.cainfo
konfiguriert hattephp.ini
), sondern der Remote-Server, der nicht richtig konfiguriert wurde:Es wurden keine Zwischenzertifikate in der Kette gesendet . Es gab keinen Fehler beim Durchsuchen der Website mit Chrome, aber mit PHP wurde der folgende Fehler angezeigt.
Nachdem die Zwischenzertifikate in die Remote-Webserver-Konfiguration aufgenommen wurden, funktionierte es.
Auf dieser Site können Sie die SSL-Konfiguration Ihres Servers überprüfen:
https://whatsmychaincert.com/
quelle
Wenn ich laufe,
'var_dump(php_ini_loaded_file());'
bekomme ich diese Ausgabe auf meiner Seite'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'
und damit PHP meine Zertifizierungsdatei lädt, musste ich die Datei php.ini in diesem Pfad bearbeiten
'C:\Development\bin\apache\apache2.4.33\bin\php.ini'
und hinzufügen,openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"
wo ich meine Zertifizierungsdatei heruntergeladen hatte, und sie unter https://curl.haxx.se/docs/caextract.html ablegenbin auf Windows 10, mit Drupal 8, Wamp und PHP7.2.4
quelle
Ich habe eine ordnungsgemäße Lösung für dieses Problem. Lassen Sie uns versuchen, die Hauptursache für dieses Problem zu verstehen. Dieses Problem tritt auf, wenn die SSL von Remoteservern nicht mithilfe von Stammzertifikaten im Zertifikatspeicher Ihres Systems überprüft werden kann oder die SSL von Remoteservern nicht zusammen mit Kettenzertifikaten installiert ist. Wenn Sie ein Linux-System mit Root-SSH-Zugriff haben, können Sie in diesem Fall versuchen, Ihren Zertifikatspeicher mit dem folgenden Befehl zu aktualisieren:
update-ca-certificates
Wenn dies immer noch nicht funktioniert, müssen Sie das Stamm- und Zwischenzertifikat des Remote-Servers in Ihrem Zertifikatspeicher hinzufügen. Sie können Root- und Zwischenzertifikate herunterladen und im Verzeichnis / usr / local / share / ca-certificates hinzufügen und dann den Befehl ausführen
update-ca-certificates
. Dies sollte den Trick tun. Ebenso können Sie für Windows suchen, wie Sie Stamm- und Zwischenzertifikate hinzufügen.Die andere Möglichkeit, dieses Problem zu lösen, besteht darin, das Remoteserver-Team zu bitten, das SSL-Zertifikat als Bündel aus Domänenstammzertifikat, Zwischenzertifikat und Stammzertifikat hinzuzufügen.
quelle
Wenn Sie Windows verwenden, ist Ihr Pfadtrennzeichen "\" (und "/" unter Linux). Versuchen Sie es mit der Konstante
DIRECTORY_SEPARATOR
. Ihr Code wird portabler.Versuchen:
BEARBEITEN: und schreiben Sie den vollständigen Pfad. Ich hatte einige Probleme mit relativen Pfaden (vielleicht wird Curl von einem anderen Basisverzeichnis ausgeführt?)
quelle
Wenn Sie WAMP verwenden, sollten Sie auch die Zertifikatzeile in der php.ini für Apache hinzufügen (neben der Standarddatei php.ini):
funktioniert für php5.3 +
quelle