So beheben Sie Probleme mit der PHP Curl HTTPS-Zertifizierungsstelle unter Windows

PHP中文网
Freigeben: 2024-11-11 12:24:02
nach vorne
1054 Leute haben es durchsucht

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.

So beheben Sie Probleme mit der PHP Curl HTTPS-Zertifizierungsstelle unter Windows

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.

Warum es fehlschlägt

$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
Nach dem Login kopieren

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.

Nutzung nativer Zertifizierungsstellen

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);
Nach dem Login kopieren

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);
Nach dem Login kopieren

Laden Sie eine cacert.pem-Datei herunter und verwalten Sie sie

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.

  1. Laden Sie die Datei cacert.pem herunter

  2. Verschieben Sie die Datei in ein Verzeichnis, auf das PHP und der Webserver zugreifen können. Zum Beispiel nach C:/php/cacert.pem.
  3. 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.

  4. [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"
    Nach dem Login kopieren
  5. 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);
Nach dem Login kopieren

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!

Verwandte Etiketten:
php
Quelle:php.watch
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage