PHP - SSL-Zertifikatfehler: Lokales Ausstellerzertifikat kann nicht abgerufen werden


187

Ich verwende PHP Version 5.6.3 als Teil von XAMPP unter Windows 7.

Wenn ich versuche, die Mandrill-API zu verwenden, wird folgende Fehlermeldung angezeigt:

Nicht erfasste Ausnahme 'Mandrill_HttpError' mit der Meldung 'API-Aufruf von Nachrichten / Sendevorlage fehlgeschlagen: SSL-Zertifikatsproblem: Lokales Ausstellerzertifikat kann nicht abgerufen werden'

Ich habe bereits alles ausprobiert, was ich in StackOverflow gelesen habe, einschließlich des Hinzufügens der folgenden Datei zur Datei php.ini:

curl.cainfo = "C:\xampp\php\cacert.pem"

Und natürlich hat die Datei cacert.pem von http://curl.haxx.se/docs/caextract.html an diesen Speicherort heruntergeladen

Nach all dem wurde XAMPP und Apache Server neu gestartet, es wurde jedoch immer noch der gleiche Fehler angezeigt.

Ich weiß wirklich nicht, was ich sonst noch versuchen soll.

Kann mir jemand raten, was ich sonst noch versuchen kann?



3
Stellen Sie außerdem sicher, dass Sie diese Zeile auskommentiert haben, indem Sie das Startzeichen ';' entfernen. es sollte curl.cainfo = "C: \ xampp \ php \ cacert.pem" sein und nicht; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
Jon Tan

Wird die Verwendung von HTTPS über HTTP ebenfalls diesen Fehler verursachen?
javiniar.leonard

Antworten:


363

Endlich hat das geklappt!

  1. Laden Sie das Zertifikatspaket herunter .

  2. Stell es irgendwo hin. In meinem Fall war das c:\wamp\Verzeichnis (wenn Sie Wamp 64 Bit verwenden, ist es c:\wamp64\).

  3. Aktivieren Sie mod_sslin Apache und php_openssl.dllin php.ini(kommentieren Sie sie aus, indem Sie sie ;am Anfang entfernen ). Aber seien Sie vorsichtig, mein Problem war, dass ich zwei php.iniDateien hatte und dies in beiden tun muss. Eine ist die, die Sie über Ihr WAMP-Taskleistensymbol erhalten, und eine andere ist in meinem Fall inC:\wamp\bin\php\php5.5.12\

  4. Fügen Sie diese Zeilen in beiden php.iniDateien zu Ihrem Zertifikat hinzu :

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. Starten Sie die Wamp-Dienste neu.


3
In meinem Fall war das c: \ xamp \ Verzeichnis und seine Windows 7 und diese Lösung funktioniert perfekt ... vielen Dank ...
Manu RS

1
Das neueste Zertifikatspaket kann von der ursprünglichen Curl-Site curl.haxx.se/docs/caextract.html heruntergeladen werden
Paul

1
In meinem Fall hatte die Zeile ;am Anfang ein und es dauerte Stunden, bis mir klar wurde, dass es sich um einen Kommentar handelt. so für noobs wie ich, braucht man die entfernen ;und
abhyudayasrinet

1
@ SurajNeupane nicht sicher, ich habe damals viel Zeit damit verbracht, diese zu bekommen. Ich benutze virtuelle Maschinen wie Homestead und muss mich nicht darum kümmern. Dies war ein Sonderfall
Mladen Janjetovic

1
Dies ist der SchlüsselBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

Haftungsausschluss: Dieser Code macht Ihren Server unsicher.

Ich hatte das gleiche Problem in der Datei Mandrill.php nach Zeile 65, in der $ this-> ch = curl_init () steht.

Fügen Sie die folgenden zwei Zeilen hinzu:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

Dies löste mein Problem und schickte auch E-Mails mit localhost, aber ich empfehle, es NICHT in der Live-Version live zu verwenden. Auf Ihrem Live-Server sollte der Code ohne diesen Code funktionieren.


1
Gibt es Dinge, die ich versuchen kann, damit meine Entwicklerumgebung ohne diesen Bypass funktioniert?
Dor Dadush

4
für mich mit nur Einstellung CURLOPT_SSL_VERIFYPEERzu falsearbeiten.
Francisco Corrales Morales

29
Während Sie technisch korrekt sind, ist das Deaktivieren von SSL eine schlechte Idee. Selbst auf localhost ist es besser, die Zertifikate wie in der anderen Antwort angegeben ordnungsgemäß zu laden.
Wirbelsäule

Während Sie technisch korrekt sind, ist das Deaktivieren von SSL eine schlechte Idee. Selbst wenn es vehement widerstandsfähig ist, auf andere Weise zu arbeiten, ist es besser, den Job zu verlieren, als Dinge auf nicht ordnungsgemäße Weise als Systemadministrator zu tun. @ Spinal

45

Danke @Mladen Janjetovic,

Ihr Vorschlag hat bei mir auf einem Mac mit installierten Ampps funktioniert.

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

Zu: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

Und php.inimit diesem Pfad aktualisiert und Apache neu gestartet:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

Und die gleiche Einstellung in der Windows AMPPS-Installation angewendet und es hat auch perfekt funktioniert.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: Gleiches gilt für Wamp.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

Wenn Sie ein neues SSL-Zertifikat mit SAN für localhost generieren möchten, haben die Schritte in diesem Beitrag für mich funktioniert Centos 7 / Vagrant / Chrome Browser.


18

Wenn Sie die Seite http://curl.haxx.se/docs/caextract.html anzeigen , werden Sie in großen Buchstaben einen Abschnitt mit dem Namen:

RSA-1024 entfernt

Lesen Sie es und laden Sie die Version der Zertifikate herunter, die die 'RSA-1024'-Zertifikate enthält. https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Diese werden mit Mandrill arbeiten.

Das Deaktivieren von SSL ist eine schlechte Idee.


1
Dies hat ein Problem mit AWS / Guzzle / cURL behoben, mit dem ich den ganzen Tag zu kämpfen hatte. Danke dir!
Voidstate

@voidstate Ich weiß, dass dies alt ist, aber Sie können es auch in guzzle umgehen, indem Sie dieses ['verify' => false] verwenden. Das vollständige Dokument zu ssl / curl / guzzle finden Sie hier guzzle.readthedocs.org/en/latest/…
John

@ John, aber das würde die SSL-Überprüfung deaktivieren, was nicht das ist, was Sie tun möchten, also würde ich nicht vorschlagen, dies zu tun.
Arturo Alvarado

1
Unter Windows müssen Sie die Dateien auf Ihrem Server speichern (z. B. in C: \ curl \ curl-ca-bundle.crt) und dann Folgendes zu Ihrer php.ini hinzufügen: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate

Ich hatte dies erst, nachdem es ewig perfekt funktioniert hatte (ich habe sogar einen Serverwechsel überlebt), aber ich habe Probleme, genau zu verstehen, was hier vor sich geht. Ist es so, dass curl oder openssl aktualisiert wurde und das Ca-Bundle in ein Paket geändert wurde, das nicht mit Mailchimp kompatibel ist?
Sammaye

11

Die obigen Schritte waren zwar hilfreich, funktionierten jedoch unter Windows 8 nicht. Ich kenne die Beziehung nicht, aber die folgenden Schritte haben funktioniert. Grundsätzlich eine Änderung in der Datei cacert.pem. Hoffe das hilft jemandem.

  • Laden Sie die Datei cacert.pem hier herunter: http://curl.haxx.se/docs/caextract.html
  • Speichern Sie die Datei in Ihrem PHP-Installationsordner. (Beispiel: Wenn Sie xampp verwenden, speichern Sie es in c: \ Installation_Dir \ xampp \ php \ cacert.pem.)
  • Öffnen Sie Ihre php.ini-Datei und fügen Sie die folgenden Zeilen hinzu:
  • curl.cainfo = "C: \ Installationsverzeichnis \ xampp \ php \ cacert.pem" openssl.cafile = "C: \ Installationsverzeichnis \ xampp \ php \ cacert.pem"
  • Starten Sie Ihren Apache-Server neu und das sollte das Problem beheben (Stoppen und starten Sie die Dienste einfach nach Bedarf).

11

Ich habe eine neue Lösung gefunden, für die keine Zertifizierung erforderlich ist, um Curl aufzurufen. Fügen Sie nur zwei Zeilen hinzu.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
Dies kann zwar funktionieren, wird jedoch überhaupt nicht empfohlen. Sie sagen im Grunde, vertrauen Sie allen Zertifikaten ... und es öffnet Ihre Anwendung auch für mögliche Angriffe, wenn Sie es vergessen und Ihr Code es mit dieser Änderung in die Produktion schafft ... es ist wirklich nicht viel Arbeit, das CA-Bundle herunterzuladen und füge Punkt PHP hinzu.
user919426

Das ist Curl-Konzept. Wenn Sie also Curl verwenden, fügen Sie den obigen Code hinzu
Manish Sharma

8

Wenn Sie keinen Zugriff auf php.ini haben, funktioniert das Hinzufügen dieses Codes (nach Ihrer $ch = curl_init();Zeile) für mich:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

Dann müssen Sie nur noch ca-bundle.crt herunterladen und an dem von Ihnen angegebenen Ort speichern $certificate_location.


3

Ich habe eine sehr einfache Lösung für dieses Problem. Sie können dies ohne Zertifikatdatei tun.

Mach weiter Laravel Root Folder -> Vender -> guzzlehttp -> guzzle -> src

öffnen Client.php

find $ defaults Array. das sieht so aus ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

Jetzt besteht die Hauptaufgabe darin, den Wert des Überprüfungsschlüssels zu ändern .

'verify'          => false,

Danach wird das SSL-Zertifikat nicht mehr auf CURL-Anforderungen überprüft ... Diese Lösung funktioniert für mich. Ich finde diese Lösung nach vielen Recherchen ...


2

Ausarbeitung der obigen Antworten für die Serverbereitstellung.

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

sollte den Trick für die Entwicklungsumgebung tun, ohne den Server bei der Bereitstellung zu gefährden.


Das Ausführen verschiedener Teile Ihres Codes in verschiedenen Umgebungen klingt nicht nach einem guten Konzept - es erschwert das Debuggen
Nico Haase

2

Ich habe versucht, es funktioniert

öffnen

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

und ändern Sie dies

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

dazu

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0

Ich hatte das gleiche Problem beim Erstellen meiner App in AppVeyor.

  • Laden Sie https://curl.haxx.se/ca/cacert.pem auf herunterc:\php
  • Aktiviere openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • Suchen Sie das Zertifikatecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

Wenn keine der oben genannten Lösungen für Sie funktioniert, aktualisieren Sie Ihre XAMPP-Installation auf eine neuere Version.

Ich habe XAMPP mit PHP 5.5.11 ausgeführt, der gleiche exakte Code hat nicht funktioniert, ich habe ein Upgrade auf XAMPP mit PHP 5.6.28 durchgeführt und die oben genannten Lösungen haben funktioniert.

Außerdem hat nur das Aktualisieren von PHP nicht funktioniert. Dies scheint eine Kombination aus Apache- und PHP-Einstellungen in dieser Version von XAMPP zu sein.

Hoffe es hilft jemandem.


0

Ich habe den Fehler bekommen wie:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Ich benutze Windows-Maschine. Also habe ich die folgenden Schritte befolgt.

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

Hoffe es kann jemandem helfen


0

Ich hatte ein solches Problem in meinem lokalen System, aber nicht auf dem Live-Server. Ich habe auf dieser Seite bereits eine andere Lösung erwähnt, die jedoch in localhost nicht funktioniert hat. Suchen Sie daher eine neue Lösung, die auf dem localhost-WAMP-Server funktioniert .

cURL-Fehlernummer: Problem mit dem SSL-Zertifikat: Lokales Ausstellerzertifikat kann nicht abgerufen werden

Manchmal konnte das System Ihre cacert.pem nicht in Ihrem Laufwerk finden. Sie können dies also in Ihrem Code definieren, in dem Sie CURL verwenden möchten

Beachten Sie, dass ich alle Bedingungen dafür erfülle, wie OPEN-SSL-Bibliothek aktiv und andere Dinge.

Überprüfen Sie diesen Code von CURL .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

Diese Lösung funktioniert jedoch möglicherweise nicht auf Live-Servern. wegen des absoluten Pfades von cacert.pem


0

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


-4

für guzzle können Sie dies versuchen:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

getestet an Guzzle / Guzzle 3. *


1
Gibt es einen Grund, eine 3 Jahre alte Frage zu beantworten, die eine akzeptierte Antwort mit mehr als 200 Upvotes hat?
TreyBake

Meine Antwort ist einfacher als die oben genannten. Sie werden sehen, dass ich für ein paar Monate 10 Upvotes bekomme ...
fico7489

1
Ich bezweifle es sehr, dass in OP keine Erwähnung von Verzehr zu sehen ist ... es ist also eine nicht verwandte Antwort. Es ist dasselbe, wenn jemand eine jQuery-Lösung für ein JavaScript-Problem bereitstellt. Es ist irrelevant.
TreyBake

das ändert nichts an der Tatsache, dass es hier nicht verwendet wird. Würden Sie einem Windows-Benutzer eine Linux-Lösung vorschlagen, da es sich um das am häufigsten verwendete Server-Betriebssystem handelt? Nicht jeder möchte Guzzle verwenden, ich persönlich habe es in meinen Jahren mit PHP noch nie verwendet. Für mich ist eine HTTP-Anfrage wirklich nicht so schwierig, ein Paket dafür zu benötigen.
TreyBake

1
voll bewusst - es wird einfach nicht benötigt .. lesen Sie einfach die Dokumente für Curl und es ist alles selbsterklärend. Es geht nicht darum, schlauer zu sein ... es geht darum, die Frage richtig zu beantworten
treyBake
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.