Eine erfolgreiche HTTPS-Anfrage erfordert die Validierung durch den HTTP-Client vom Server bereitgestelltes TLS-Zertifikat anhand einer Liste bekannter und vertrauenswürdiger Root-Zertifikate Zertifikate. Die PHP-Curl-Erweiterung ist nicht anders; die Locke Die Erweiterung verwendet libcurl, um die HTTPS-Anfrage zu stellen, und libcurl, das wiederum eine TLS-Bibliothek wie OpenSSL verwendet, um die Anfrage zu validieren.
Die Curl-Erweiterung erfordert eine gültige Datei mit alle vertrauenswürdige Stammzertifikate zur Vervollständigung der HTTPS-Validierung und PHP stellt dies als Direktive in der Datei php.ini bereit.
Unter Linux, BSD und macOS kann libcurl standardmäßig das Systemstammverzeichnis verwenden Dies ist jedoch unter Windows nicht möglich, da dies bei Windows der Fall ist wird nicht mit einer einzigen Datei geliefert, die das gesamte Systemstammverzeichnis enthält Zertifikate.
In diesem Artikel werden zwei mögliche Ansätze zum erfolgreichen Durchführen von HTTPS-Anfragen mit der Curl-Erweiterung erläutert, und was man nicht tun sollte, um HTTPS-Anfragen unsicher zu machen.
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); // false curl_error($ch); // SSL certificate problem: unable to get local issuer certificate
Wenn die Aufrufe von „curl_exec“ mit einer falschen Antwort fehlschlagen und „curl_error“ auf ein Problem mit dem SSL-Zertifikat hinweist: Der Fehler „Lokales Ausstellerzertifikat konnte nicht abgerufen werden“ bedeutet, dass Curl erfolgreich war Es wurde keine Datei bereitgestellt, die Stammzertifikate enthält, oder sie konnte nicht erkannt werden.
Dieser Fehler ist auf Linux-, BSD- und macOS-Systemen ungewöhnlich, aber durchaus üblich Dies ist unter Windows üblich, da es keine bestimmte Datei zum Abrufen des Stammverzeichnisses gibt Zertifikate, und PHP liefert keine Stammzertifikatsliste mit besitzen.
Die Lösung besteht darin, eine Datei mit dem aktuellen Stammverzeichnis bereitzustellen Zertifikate, oder lassen Sie Curl im Idealfall den nativen Stammspeicher analysieren, der die Das zugrunde liegende Betriebssystem bietet.
Ab Curl 7.71 ist es möglich, einen Curl festzulegen Option, um Curl aufzufordern, die nativen (System-)Stammzertifikate zu verwenden. Dies funktioniert sogar unter Windows, wo Curl Systemstammzertifikate analysiert und verwendet sie.
Wenn die Option CURLOPT_SSL_OPTIONS auf CURLSSLOPT_NATIVE_CA gesetzt ist oder eine Bitmaske, die diese Bits enthält, versucht Curl, die native zu verwenden Stammzertifikatspeicher, abhängig von den Funktionen und Versionen des zugrunde liegende TLS-Bibliothek.
Dies ist die empfohlene Lösung, wenn die Curl-Erweiterung mit Curl 7.71 oder höher und PHP 8.2 und höher erstellt wurde.
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); curl_exec($ch);
Beachten Sie, dass das obige Snippet das nicht überprüft Curl-Version und das PHP Version und geht davon aus, dass sowohl die PHP- als auch die Curl-Versionsanforderungen erfüllt sind. Der Das Folgende ist ein Beispiel, das das bedingte Hinzufügen der Curl-Option zeigt:
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (defined('CURLSSLOPT_NATIVE_CA') && version_compare(curl_version()['version'], '7.71', '>=')) { curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); } curl_exec($ch);
Für Anwendungen, die auf PHP-Versionen älter als 8.2 ausgeführt werden (wobei CURLSSLOPT_NATIVE_CA (Konstante ist nicht verfügbar) oder wenn die Curl-Version älter als 7.71 ist, Die empfohlene alternative Lösung besteht darin, eine Curl-kompatible Version herunterzuladen Root-Zertifikatdatei und konfigurieren Sie PHP oder die Curl-Anfrage für deren Verwendung.
Das Curl-Projekt verwaltet eine aktuelle Liste von Zertifikaten. Siehe CA-Zertifikate, die aus Mozilla extrahiert wurden.
Laden Sie die Datei cacert.pem herunter
Bearbeiten Sie die Datei php.ini und ändern Sie den Eintrag „curl.cainfo“ so, dass er auf den absoluten Pfad zur Datei cacert.pem verweist.
[curl] ; A default value for the CURLOPT_CAINFO option. This is required to be an ; absolute path. ;curl.cainfo = curl.cainfo = "C:/php/cacert.pem"
Optional starten Sie den Webserver (z. B. Apache) neu, um die INI neu zu laden
Der Nachteil dieses Ansatzes besteht darin, dass die Datei cacert.pem regelmäßig aktualisiert werden muss. Das cacert.pem Die vom Curl-Projekt bereitgestellte Datei wird beispielsweise aus dem Stammverzeichnis extrahiert Store, der von Mozilla verwaltet wird. Im Durchschnitt erhalten Sie diese Liste und die Datei 4-5 Mal im Jahr aktualisiert. Um die Kompatibilität mit dem neuesten Root sicherzustellen Stellen Sie sicher, dass Sie in der Liste der Zertifikate die lokale Kopie dieser Datei aktualisieren regelmäßig
Wenn es nicht möglich ist, die INI-Datei zu ändern, geben Sie auch den absoluten Pfad zur Datei cacert.pem in einer Curl-Anfrage an:
$ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CAINFO, 'C:/php/cacert.pem'); curl_exec($ch);
Auf PHP 8.2 mit Curl 7.77 , ist es möglich, mit der Option CURLOPT_CAINFO_BLOB eine Zeichenfolge zu erstellen, die den Inhalt von cacert.pem enthält.
Das obige ist der detaillierte Inhalt vonSo beheben Sie Probleme mit der PHP Curl HTTPS-Zertifizierungsstelle unter Windows. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!