it-swarm.com.de

cURL-Fehler 60: SSL-Zertifikat: Zertifikat des lokalen Ausstellers kann nicht abgerufen werden

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');
}
164

arbeitslösung:

  • Angenommen unter Windows 

XAMPP-Server

Ähnliches für andere Umgebungen - Download und Extrahieren für cacert.pem hier (ein sauberes Dateiformat/Daten) 

https://curl.haxx.se/docs/caextract.html

  • stell es hier ab 

C:\xampp\php\extras\ssl\cacert.pem

  • fügen Sie in Ihrer php.ini diese Zeile in diesen Abschnitt ein ("c:\xampp\php\php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  • starten Sie Ihren Webserver/Apache neu

Problem gelöst!

(Quelle: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )

419
Dung

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 .

Herausfinden, wo PHP/Guzzle nach Zertifikaten sucht

Sie können ausgeben, wohin PHP sucht:

 var_dump(openssl_get_cert_locations());

Ein Zertifikat-Bundle erhalten

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

PHP mitteilen, wo sich die Zertifikate befinden

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.)

35
Loren

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.

enter image description here

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

31
Rami Nour

Guzzle, das von cartalyst/stripe verwendet wird, sucht auf folgende Weise ein ordnungsgemäßes Zertifikatsarchiv, um ein Serverzertifikat darauf zu prüfen:

  1. Prüfen Sie, ob openssl.cafile in Ihrer php.ini-Datei festgelegt ist.
  2. Prüfen Sie, ob curl.cainfo in Ihrer php.ini-Datei festgelegt ist.
  3. Überprüfen Sie, ob /etc/pki/tls/certs/ca-bundle.crt vorhanden ist (Red Hat, CentOS, Fedora; wird vom ca-certificate-Paket bereitgestellt).
  4. Überprüfen Sie, ob /etc/ssl/certs/ca-certificates.crt vorhanden ist (Ubuntu, Debian; wird vom ca-certificate-Paket bereitgestellt)
  5. Überprüfen Sie, ob /usr/local/share/certs/ca-root-nss.crt vorhanden ist (FreeBSD; wird vom Paket ca_root_nss bereitgestellt)
  6. Prüfen Sie, ob /usr/local/etc/openssl/cert.pem (OS X; von Homebrew bereitgestellt).
  7. Prüfen Sie, ob C:\windows\system32\curl-ca-bundle.crt existiert (Windows)
  8. Prüfen Sie, ob 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.

11
Ja͢ck

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);
10
mvandillen

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.

6
George Donev

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

5
Iruku Kagika

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".

5
Daydream Nation

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. 

1

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 ...

1
bernie

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: 

https://whatsmychaincert.com/

1
Tobias K.

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.
1

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. *

0
Mohsen Molaei

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.

0
Mike Miller

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

0
Nicholas