ホームページ  >  記事  >  バックエンド開発  >  Windows で PHP Curl HTTPS 認証局の問題を修正する方法

Windows で PHP Curl HTTPS 認証局の問題を修正する方法

PHP中文网
PHP中文网転載
2024-11-11 12:24:021021ブラウズ

HTTPS リクエストが成功すると、HTTP クライアントが 既知の信頼できるルートのリストに対するサーバー提供の TLS 証明書 証明書。 PHP Curl 拡張機能も違いはありません。カール 拡張機能は libcurl を使用して HTTPS リクエストを作成し、さらに libcurl は OpenSSL などの TLS ライブラリを使用してリクエストを検証します。

Windows で PHP Curl HTTPS 認証局の問題を修正する方法

Curl 拡張機能には、次の内容を含む有効なファイルが必要です。すべての HTTPS 検証を完了するための信頼されたルート証明書、および PHP これを php.ini ファイル内のディレクティブとして公開します。

Linux、BSD、および macOS では、libcurl はデフォルトでシステム ルートに設定できます。 証明書を使用しますが、Windows ではこれを行うことはできません。 すべてのシステム ルートを含む 1 つのファイルが付属しているわけではありません

この記事では、Curl 拡張機能を使用して HTTPS リクエストを正常に実行するための 2 つの方法と、HTTPS リクエストが安全でないままにしてはいけないことについて説明します。

失敗する理由

$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

curl_exec 呼び出しが誤った応答で失敗し、curl_error が SSL 証明書の問題を示している場合: ローカル発行者を取得できません証明書エラー。これは、Curl にルート証明書を含むファイルが提供されなかったか、ルート証明書を検出できなかったことを意味します。

このエラーは、Linux、BSD、および macOS システムではまれですが、非常にまれです。 ルートを取得するための指定されたファイルがないため、Windows では一般的です。 証明書が含まれており、PHP にはルート証明書リストが同梱されていません。 own.

解決策は、最新のルートを含むファイルを提供することです 証明書を使用するか、理想的には、Curl にネイティブ ルート ストアを解析させます。

ネイティブ認証局を使用する

Curl 7.71 以降では、Curl を設定できます。 Curl にネイティブ (システム) ルート証明書を使用するよう要求するオプション。 これは Windows でも機能し、Curl はシステム ルート証明書を解析します。

CURLOPT_SSL_OPTIONS オプションが CURLSSLOPT_NATIVE_CA に設定されている場合 またはそれらのビットを含むビットマスクの場合、Curl はネイティブのビットマスクを使用しようとします。 ルート証明書ストア。の機能とバージョンに応じて異なります。 基礎となる TLS ライブラリ。

これは、Curl 拡張機能が Curl 7.71 以降および PHP 8.2 以降で構築されている場合に推奨される修正です。

 $ch = curl_init('https://php.watch');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
    curl_exec($ch);

上記のスニペットは、 Curl のバージョンと PHP バージョンであり、PHP と Curl の両方のバージョン要件が満たされていることを前提としています。の 以下は、Curl オプションを条件付きで追加する例です。

$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);

cacert.pem ファイルをダウンロードして維持します

8.2 より古いバージョンの PHP で実行されているアプリケーションの場合 (CURLSSLOPT_NATIVE_CA 定数は使用できません)、または Curl のバージョンが 7.71 より古い場合、 推奨される代替ソリューションは、Curl 互換のファイルをダウンロードすることです。 ルート証明書ファイルを作成し、それを使用するように PHP または Curl リクエストを構成します。

Curl プロジェクトは、証明書の最新のリストを管理します。 Mozilla から抽出された CA 証明書を参照してください。

  1. cacert.pem ファイルをダウンロードします

  2. PHP および Web サーバーがアクセスできるディレクトリにファイルを移動します。たとえば、C:/php/cacert.pem.
  3. に php.ini ファイルを編集し、cacert.pem ファイルへの絶対パスを指すようにcurl.cainfo エントリを変更します。

  4. $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
  5. 必要に応じて、Web サーバーを再起動します (例:

このアプローチの欠点は、cacert.pem ファイルを定期的に更新する必要があることです。 cacert.pem たとえば、Curl プロジェクトによって提供されるファイルはルートから抽出されます。 Mozilla によって管理されるストア。平均すると、このリストとファイルは次のようになります。 年に4〜5回更新されます。最新のルートとの互換性を確保するには 証明書リスト。このファイルのローカル コピーを必ず更新してください。 定期的に

INI ファイルを変更できない場合は、Curl リクエスト内で cacert.pem ファイルへの絶対パスも指定します:

 $ch = curl_init('https://php.watch');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
    curl_exec($ch);

PHP 8.2 と Curl 7.77 、CURLOPT_CAINFO_BLOB を使用して cacert.pem の内容を含む文字列を取得することができます。オプション。

以上がWindows で PHP Curl HTTPS 認証局の問題を修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はphp.watchで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。