Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLOPT_PROXY_SSL_VERIFYPEER定数の使い方

CURLOPT_PROXY_SSL_VERIFYPEER定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLOPT_PROXY_SSL_VERIFYPEER定数は、cURLがプロキシサーバーとHTTPS接続を行う際に、そのSSL証明書を検証するかどうかを指定するために使用される定数です。この定数は、PHPのcurl_setopt()関数と組み合わせて使用され、ブール値(trueまたはfalse)を引数として受け取ります。

trueを設定すると、cURLはプロキシサーバーから提示されたSSL証明書が信頼できる認証局(CA)によって発行されたものであるかを厳密に検証します。これにより、中間者攻撃などのセキュリティリスクから保護されます。この検証は、指定されたCA証明書バンドル(通常はCURLOPT_CAINFOCURLOPT_CAPATHオプションで設定)に基づいて行われます。

一方、falseを設定すると、cURLはプロキシサーバーのSSL証明書を検証せずに接続を試みます。これは、自己署名証明書など、正当なCAによって署名されていない証明書を使用しているプロキシサーバーに接続する必要がある場合に一時的に使用されることがあります。

しかしながら、証明書の検証を無効にすることはセキュリティ上のリスクを伴います。本番環境や機密性の高いデータを扱うアプリケーションでは、常にtrueに設定し、信頼できるCA証明書を使用して厳密な検証を行うことが強く推奨されます。検証を無効にする場合は、その潜在的なリスクを十分に理解した上で慎重に判断する必要があります。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYPEER, true);
4curl_close($ch);
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURL: プロキシSSL証明書検証を制御する

1<?php
2
3/**
4 * プロキシ経由で指定されたURLからコンテンツを取得します。
5 *
6 * この関数は、cURLライブラリを使用してプロキシ経由でHTTPリクエストを送信する方法と、
7 * HTTPSプロキシサーバー自身のSSL証明書検証を制御する
8 * `CURLOPT_PROXY_SSL_VERIFYPEER` 定数の使用方法を示します。
9 *
10 * @param string $url 取得するターゲットURL。
11 * @param string $proxyHost プロキシサーバーのホスト名とポート番号 (例: 'proxy.example.com:8080')。
12 * @param bool $verifyProxySsl プロキシサーバーのSSL証明書を検証するかどうか。
13 *                               true の場合、検証を実行。false の場合、検証を行いません。
14 *                               (開発環境などで自己署名証明書を持つプロキシを使用する場合に設定)
15 * @return string|false 成功した場合は取得したコンテンツ、失敗した場合は false。
16 */
17function fetchUrlViaProxy(string $url, string $proxyHost, bool $verifyProxySsl = true): string|false
18{
19    $ch = curl_init();
20
21    // ターゲットURLを設定します。
22    curl_setopt($ch, CURLOPT_URL, $url);
23
24    // プロキシサーバーを設定します (例: '127.0.0.1:8888' など)。
25    curl_setopt($ch, CURLOPT_PROXY, $proxyHost);
26
27    // CURLOPT_PROXY_SSL_VERIFYPEER: HTTPSプロキシサーバーのSSL証明書検証を制御します。
28    // true (デフォルト): cURLはプロキシサーバーの証明書が有効であるかを検証します。
29    // false: プロキシサーバーの証明書検証を無効にします。
30    //        自己署名証明書を使用するプロキシなどでの接続に役立ちますが、セキュリティリスクを伴うため、
31    //        本番環境での使用は避けるべきです。
32    curl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYPEER, $verifyProxySsl);
33
34    // 補足: CURLOPT_SSL_VERIFYPEER は、最終的な宛先サーバーのSSL証明書を検証する定数です。
35    // CURLOPT_PROXY_SSL_VERIFYPEER とは検証対象が異なります(プロキシ vs 宛先サーバー)。
36    // セキュリティのため、両方とも true に設定することが推奨されます。
37
38    // 転送結果を文字列として取得し、直接出力しないようにします。
39    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
40
41    // HTTPヘッダーをレスポンスに含めないようにします。
42    curl_setopt($ch, CURLOPT_HEADER, false);
43
44    // リクエストを実行し、レスポンスを取得します。
45    $response = curl_exec($ch);
46
47    // cURLエラーが発生したかチェックします。
48    if (curl_errno($ch)) {
49        // エラーメッセージをログに出力します。
50        error_log('cURLエラー: ' . curl_error($ch) . ' (URL: ' . $url . ', Proxy: ' . $proxyHost . ')');
51        $response = false; // エラーが発生したことを示す
52    }
53
54    // cURLセッションを閉じます。
55    curl_close($ch);
56
57    return $response;
58}
59
60// --- サンプル使用例 ---
61// 注意: 実際に動作させるには、有効なプロキシサーバー情報に置き換える必要があります。
62// ターゲットURLはHTTPSであることが推奨されます。
63$targetUrl = 'https://www.example.com';
64// 例: '127.0.0.1:8888' (ローカルで実行中のデバッグプロキシ)
65// 例: 'proxy.mycompany.com:8080' (企業のプロキシサーバー)
66$proxyServer = 'your_proxy_host:8080'; // <-- ここを実際のプロキシ情報に置き換えてください
67
68echo "--- プロキシ経由でコンテンツ取得 (プロキシSSL検証無効の例) ---" . PHP_EOL;
69// 開発環境などで、自己署名証明書を持つプロキシを使用する場合に利用できます。
70// ただし、セキュリティリスクがあるため本番環境での使用は避けるべきです。
71$contentWithoutProxySslVerification = fetchUrlViaProxy($targetUrl, $proxyServer, false);
72
73if ($contentWithoutProxySslVerification !== false) {
74    echo "取得成功 (検証無効): " . substr($contentWithoutProxySslVerification, 0, 100) . "...\n";
75} else {
76    echo "取得失敗 (検証無効)。エラーログを確認してください。\n";
77}
78
79echo PHP_EOL; // 出力区切りのための改行
80
81echo "--- プロキシ経由でコンテンツ取得 (プロキシSSL検証有効の例) ---" . PHP_EOL;
82// 推奨されるセキュリティ設定です。プロキシが正規のSSL証明書を使用している場合に機能します。
83$contentWithProxySslVerification = fetchUrlViaProxy($targetUrl, $proxyServer, true);
84
85if ($contentWithProxySslVerification !== false) {
86    echo "取得成功 (検証有効): " . substr($contentWithProxySslVerification, 0, 100) . "...\n";
87} else {
88    echo "取得失敗 (検証有効)。エラーログを確認してください。\n";
89}
90

PHPのCURLOPT_PROXY_SSL_VERIFYPEER定数は、cURLライブラリを用いてプロキシサーバー経由で通信を行う際に、そのプロキシサーバー自身のSSL証明書を検証するかどうかを制御するために使用されます。

サンプルコードのfetchUrlViaProxy関数は、指定されたターゲットURLをプロキシ経由で取得する方法と、この定数の具体的な使い方を示しています。この関数は、取得するターゲットURL($url)、使用するプロキシサーバーのホスト名とポート番号($proxyHost)、そしてプロキシサーバーのSSL証明書を検証するかどうかを制御するブール値($verifyProxySsl)を引数として受け取ります。

CURLOPT_PROXY_SSL_VERIFYPEERtrueに設定した場合、cURLはプロキシサーバーのSSL証明書が信頼できるものであるかを厳密に検証します。これはセキュリティ上推奨される設定です。一方、falseに設定すると、プロキシサーバーの証明書検証が無効になります。この設定は、自己署名証明書などを持つ開発用プロキシでの接続に役立ちますが、セキュリティリスクが伴うため、本番環境での利用は避けるべきです。

なお、この定数が検証するのはあくまでプロキシサーバーの証明書であり、最終的な通信先のサーバーの証明書を検証するCURLOPT_SSL_VERIFYPEERとは対象が異なりますのでご注意ください。fetchUrlViaProxy関数は、コンテンツの取得に成功した場合、その内容を文字列として返し、失敗した場合はfalseを返します。

CURLOPT_PROXY_SSL_VERIFYPEERは、HTTPプロキシサーバーのSSL証明書検証を制御する設定です。これは最終的な宛先サーバーのSSL証明書を検証するCURLOPT_SSL_VERIFYPEERとは対象が異なりますので、混同しないよう注意が必要です。本設定をfalseにするとプロキシサーバーの証明書検証が無効となり、セキュリティ上のリスクが発生します。そのため、本番環境では必ずtrueに設定し、開発環境などで自己署名証明書を持つプロキシを利用する場合など、一時的な利用に限定すべきです。サンプルコードを試す際は、your_proxy_host:8080を実際のプロキシ情報に適切に置き換える必要があります。

PHP cURL: プロキシSSL検証とバージョン設定

1<?php
2
3/**
4 * プロキシ経由で安全なHTTPリクエストを実行し、SSL/TLS関連オプションを示します。
5 *
6 * システムエンジニアを目指す初心者向けに、ターゲットサーバーとプロキシサーバーの
7 * 両方に対するSSL証明書検証およびSSL/TLSバージョンの設定方法を解説します。
8 *
9 * @param string $url リクエストするターゲットURL。例: 'https://www.example.com'
10 * @param string $proxy プロキシサーバーのアドレス。例: 'http://your-proxy.com'
11 * @param int $proxyPort プロキシサーバーのポート。例: 8080
12 * @return string|false 成功時はレスポンスボディ、失敗時はfalse。
13 */
14function makeSecureProxiedRequest(string $url, string $proxy, int $proxyPort): string|false
15{
16    // cURLセッションを初期化
17    $ch = curl_init();
18
19    // ターゲットURLとプロキシ情報を設定
20    curl_setopt($ch, CURLOPT_URL, $url);
21    curl_setopt($ch, CURLOPT_PROXY, $proxy);
22    curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
23
24    // --- ターゲットサーバーに対するSSL/TLSオプション ---
25
26    // ターゲットサーバーのSSL証明書を検証するかどうかを設定します。
27    // 本番環境ではセキュリティのために`true`に設定することを強く推奨します。
28    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
29    // ターゲットサーバーのホスト名がSSL証明書のコモンネームと一致するか検証します。
30    // `2`は最も厳密な検証レベルです。
31    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
32    // ターゲットサーバー接続に使用するSSL/TLSバージョンを設定します。
33    // (キーワード: php curlopt_sslversion に関連)
34    // CURL_SSLVERSION_TLSv1_2 は広くサポートされている安全なバージョンです。
35    curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
36
37
38    // --- プロキシサーバーへの接続に対するSSL/TLSオプション (プロキシがHTTPSの場合) ---
39
40    // プロキシサーバーへの接続がSSL/TLSの場合、そのSSL証明書を検証するかどうかを設定します。
41    // (参照情報: CURLOPT_PROXY_SSL_VERIFYPEER)
42    // ターゲットサーバーと同様に、本番環境ではセキュリティのために`true`に設定することを強く推奨します。
43    curl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYPEER, true);
44    // プロキシサーバーのホスト名がSSL証明書のコモンネームと一致するか検証します。
45    curl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYHOST, 2);
46
47
48    // レスポンスを直接出力せず、文字列として返すように設定
49    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
50
51    // cURLリクエストを実行
52    $response = curl_exec($ch);
53
54    // エラー処理
55    if (curl_errno($ch)) {
56        echo 'cURLエラー: ' . curl_error($ch) . PHP_EOL;
57        $response = false;
58    }
59
60    // cURLセッションを閉じる
61    curl_close($ch);
62
63    return $response;
64}
65
66// --- 使用例 ---
67// このコードを動作させるには、有効なプロキシサーバーが必要です。
68// 以下のプレースホルダーを実際の環境に合わせて設定してください。
69$targetUrl = 'https://www.example.com';          // アクセスしたいウェブサイト
70$proxyServer = 'http://your_proxy_host';         // 例: 'http://localhost'
71$proxyPort = 8080;                               // 例: 3128 (Squidなどの一般的なポート)
72
73echo "ターゲットURL: {$targetUrl} をプロキシ: {$proxyServer}:{$proxyPort} 経由で取得を試みます..." . PHP_EOL;
74
75$result = makeSecureProxiedRequest($targetUrl, $proxyServer, $proxyPort);
76
77if ($result !== false) {
78    echo "リクエスト成功。レスポンスの最初の200文字:" . PHP_EOL;
79    echo substr($result, 0, 200) . '...' . PHP_EOL;
80} else {
81    echo "リクエスト失敗。プロキシ設定とネットワーク接続を確認してください。" . PHP_EOL;
82}
83

このPHPサンプルコードは、プロキシサーバー経由でHTTPSリクエストを安全に実行するためのSSL/TLS関連設定を示しています。makeSecureProxiedRequest関数は、アクセスしたいターゲットURL、プロキシサーバーのアドレスとポートを引数として受け取り、リクエスト成功時にはウェブサイトのコンテンツを、失敗時にはfalseを返します。

コード内では、curl_setopt関数を利用して複数のセキュリティオプションを設定しています。ターゲットサーバーへの接続では、CURLOPT_SSL_VERIFYPEERでSSL証明書の正当性を検証し、CURLOPT_SSL_VERIFYHOSTでホスト名が証明書と一致するかを確認します。また、CURLOPT_SSLVERSIONオプション(キーワード: php curlopt_sslversion)には、広く利用されている安全な通信プロトコルであるCURL_SSLVERSION_TLSv1_2を指定し、セキュアな接続を確立します。

特に、プロキシサーバー自体がHTTPS接続である場合のセキュリティ設定が重要です。本リファレンス情報であるCURLOPT_PROXY_SSL_VERIFYPEERオプションは、プロキシサーバーのSSL証明書を検証するかどうかを設定します。これにより、信頼できないプロキシを通じた中間者攻撃のリスクを軽減できます。同様に、CURLOPT_PROXY_SSL_VERIFYHOSTでプロキシのホスト名検証も行われます。これらの検証設定を有効にすることで、本番環境でのセキュリティが強化され、初心者の方も安全なウェブ通信の基礎を理解できます。

SSL/TLS証明書検証オプション(CURLOPT_SSL_VERIFYPEERCURLOPT_PROXY_SSL_VERIFYPEERなど)は、開発の簡略化のためにfalseに設定されることがありますが、本番環境では必ずtrueに設定し、厳密な検証を行うことがセキュリティ上非常に重要です。脆弱なSSL/TLSバージョンは避け、CURLOPT_SSLVERSIONではCURL_SSLVERSION_TLSv1_2のような最新かつ安全なバージョンを選択してください。プロキシサーバーへの接続がHTTPSの場合にのみCURLOPT_PROXY_SSL_VERIFYPEERなどのプロキシ用SSLオプションが適用されます。プロキシの種類や設定によってこれらのオプションの要否が変わるため、ご自身の環境に合わせて適切に利用することが大切です。エラー発生時にはcurl_errno()curl_error()で詳細を確認し、問題解決に役立てましょう。

関連コンテンツ

関連IT用語

関連プログラミング言語