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

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

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

作成日: 更新日:

基本的な使い方

CURLOPT_PROXY_SSL_VERIFYHOST定数は、PHPのcURL拡張機能において、プロキシサーバーを介してセキュアなSSL/TLS接続を行う際に、接続先のホスト名がSSL証明書と一致するかどうかを検証するための挙動を設定するオプションを表す定数です。この定数は、curl_setopt() 関数を使用してcURLハンドルに設定します。

具体的には、CURLOPT_PROXY_SSL_VERIFYHOST オプションの値として整数を指定することで、ホスト名検証の厳格さを制御できます。値が 0 の場合、プロキシ経由での接続先ホスト名の検証は行われません。これはSSL/TLS接続のセキュリティを著しく低下させるため、本番環境での使用は強く非推奨とされています。悪意のある第三者による中間者攻撃のリスクを高める可能性があります。

値が 1 の場合、SSL証明書にホスト名が存在するかどうかのみが検証されます。そして、最も安全で推奨される値は 2 です。この値では、証明書のCommon Name (CN) または Subject Alternative Name (SAN) の値と接続先のホスト名が厳密に一致するかどうかが検証されます。システムエンジニアとしては、セキュリティを確保するためにも、特別な理由がない限りは 2 を設定することが重要です。この設定により、信頼できないプロキシサーバーや偽装されたサーバーへの誤接続を防ぎ、通信の安全性を確保することができます。

構文(syntax)

1curl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYHOST, 2);

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

CURLOPT_PROXY_SSL_VERIFYHOST定数は、プロキシ経由で接続する際のSSL証明書のホスト名検証の挙動を制御するための整数値を返します。この値は、検証を有効にするか無効にするか、あるいは特定の検証レベルを設定するために使用されます。

サンプルコード

PHP cURLでプロキシSSLホスト検証する

1<?php
2
3/**
4 * プロキシ経由でHTTPSリクエストを送信し、プロキシ先のホスト名を検証する例。
5 *
6 * この関数は、cURLライブラリを使用してプロキシサーバー経由で
7 * ターゲットURLにHTTPSリクエストを送信する方法を示します。
8 * CURLOPT_PROXY_SSL_VERIFYHOST 定数は、プロキシ経由のSSL/TLS接続において、
9 * ターゲットサーバーのホスト名が証明書と一致するかどうかを検証するために使用されます。
10 *
11 * @param string $targetUrl リクエストを送信するターゲットHTTPS URL(例: 'https://example.com')
12 * @param string $proxyUrl 使用するプロキシサーバーのURL(例: 'http://your.proxy.server:8080')
13 * @return string|false リクエストの応答ボディ、またはエラーが発生した場合はfalse
14 */
15function fetchUrlWithProxyAndHostVerification(string $targetUrl, string $proxyUrl)
16{
17    // cURLセッションを初期化
18    $ch = curl_init();
19
20    if ($ch === false) {
21        echo "cURLセッションの初期化に失敗しました。\n";
22        return false;
23    }
24
25    // cURLオプションを設定
26    curl_setopt($ch, CURLOPT_URL, $targetUrl); // ターゲットURLを設定
27    curl_setopt($ch, CURLOPT_PROXY, $proxyUrl); // プロキシサーバーを設定
28    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 応答を文字列として返す
29    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // タイムアウトを10秒に設定
30
31    // プロキシ経由のHTTPS通信で、サーバー証明書のホスト名を検証する設定
32    // 2: 共通名 (CN) および Subject Alternative Name (SAN) の両方を検証する(推奨)
33    // 1: 共通名 (CN) のみを検証する(非推奨)
34    // 0: ホスト名の検証を行わない(セキュリティリスクが高いため非推奨)
35    curl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYHOST, 2);
36
37    // プロキシ経由のHTTPS通信で、サーバー証明書の有効性を検証する(通常はtrueに設定)
38    curl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYPEER, true);
39
40    // リクエストを実行し、応答を取得
41    $response = curl_exec($ch);
42
43    // エラーチェック
44    if (curl_errno($ch)) {
45        echo 'cURLエラー: ' . curl_error($ch) . "\n";
46        $response = false;
47    } else {
48        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
49        if ($httpCode >= 400) {
50            echo "HTTPエラー: " . $httpCode . "\n";
51            // エラー応答の場合、必要に応じてここでfalseを返すか、エラー処理を行う
52        }
53    }
54
55    // cURLセッションを閉じる
56    curl_close($ch);
57
58    return $response;
59}
60
61// 実行例:
62// 以下の変数を、実際に使用するHTTPSサイトとプロキシサーバーの情報に置き換えてください。
63// 有効なプロキシサーバー(SOCKSプロキシではないHTTP/HTTPSプロキシ)が必要です。
64$targetUrl = 'https://www.example.com';
65$proxyUrl = 'http://your.proxy.server:8080'; // 例: 'http://192.168.1.1:3128'
66
67echo "--- プロキシ経由でのホスト名検証付きHTTPSリクエストの実行 ---\n";
68echo "ターゲットURL: " . $targetUrl . "\n";
69echo "プロキシURL: " . $proxyUrl . "\n";
70echo "注: このコードを実行するには、有効なプロキシサーバーが必要です。\n";
71
72$result = fetchUrlWithProxyAndHostVerification($targetUrl, $proxyUrl);
73
74if ($result !== false) {
75    echo "\nリクエスト成功!\n";
76    echo "取得した応答の一部 (最初の500文字):\n";
77    echo substr($result, 0, 500) . "...\n";
78} else {
79    echo "\nリクエスト失敗。\n";
80    echo "プロキシ設定やネットワーク接続を確認してください。\n";
81}
82
83?>

PHPのCURLOPT_PROXY_SSL_VERIFYHOST定数は、プロキシサーバー経由でHTTPS通信を行う際に、通信先のサーバーのホスト名がSSL/TLS証明書と一致するかどうかを検証するために使用されます。これにより、不正なサーバーへの接続を防ぎ、通信の安全性を高めることができます。

サンプルコードでは、fetchUrlWithProxyAndHostVerification関数がプロキシ経由で指定されたターゲットURLにHTTPSリクエストを送信する例を示しています。この関数は、リクエストを送信する$targetUrl(文字列)と、使用する$proxyUrl(文字列)を引数として受け取ります。

関数内部では、curl_init()でcURLセッションを初期化した後、curl_setopt()を使って各種設定を行います。特にcurl_setopt($ch, CURLOPT_PROXY_SSL_VERIFYHOST, 2);という行が重要です。ここで設定される「2」という値は、プロキシ経由のSSL/TLS接続において、ターゲットサーバーの証明書に記載されたホスト名が、共通名(CN)およびサブジェクト代替名(SAN)の両方で検証されることを意味します。これは最も安全で推奨される設定です。値を「0」に設定するとホスト名検証が行われず、セキュリティリスクが高まります。また、「1」は共通名のみを検証するため、非推奨とされています。

その他、CURLOPT_PROXY_SSL_VERIFYPEERtrueに設定することで、サーバー証明書自体の有効性も検証しています。リクエストはcurl_exec()で実行され、成功した場合はターゲットサーバーからの応答ボディ(文字列)が、エラーが発生した場合はfalseが関数の戻り値として返されます。これにより、システムエンジニアはプロキシ経由で安全かつ確実にHTTPS通信を実装できます。

このコードは、プロキシ経由のHTTPS通信でターゲットサーバーのホスト名を検証する重要な設定を示します。CURLOPT_PROXY_SSL_VERIFYHOSTは「2」に設定し、ホスト名の厳格な検証を強く推奨します。「0」や「1」はセキュリティリスクが高いため避けてください。同時に、CURLOPT_PROXY_SSL_VERIFYPEERtrueに設定し、証明書自体の有効性も検証することで、安全な通信を確立できます。本番環境では、必ず信頼できるプロキシサーバーを使用し、通信の安全性を確保してください。不正なプロキシは情報漏洩や改ざんのリスクがあります。また、cURLの初期化失敗、実行エラー、HTTPステータスコードのチェックなど、適切なエラーハンドリングの実装は必須です。

PHP cURL: CURLOPT_PROXY_SSL_VERIFYHOST設定

1<?php
2
3/**
4 * プロキシ経由でHTTPSリクエストを送信し、SSLホスト名検証オプションを示す関数。
5 *
6 * この関数は、PHP cURLライブラリを使用してプロキシ経由でHTTPSリクエストを送信する際に、
7 * CURLOPT_PROXY_SSL_VERIFYHOST オプションがどのように機能するかを実演します。
8 * 初心者向けに、基本的なSSL検証オプションも併せて設定しています。
9 *
10 * @param string $url リクエストを送信するターゲットURL(HTTPS推奨)。
11 * @param string $proxyHost プロキシサーバーのホスト名またはIPアドレス。
12 * @param int $proxyPort プロキシサーバーのポート番号。
13 * @return string|false リクエストの応答ボディ、またはエラーが発生した場合はfalse。
14 */
15function fetchDataViaProxyWithSslHostVerification(string $url, string $proxyHost, int $proxyPort)
16{
17    // cURLセッションを初期化
18    $ch = curl_init();
19
20    if ($ch === false) {
21        // cURLの初期化に失敗した場合のエラーハンドリング
22        error_log("cURLの初期化に失敗しました。");
23        return false;
24    }
25
26    // cURLオプションを設定
27    curl_setopt_array($ch, [
28        CURLOPT_URL            => $url,                          // リクエスト先のURL
29        CURLOPT_RETURNTRANSFER => true,                          // 実行結果を文字列として返す
30        CURLOPT_TIMEOUT        => 30,                            // 接続および応答のタイムアウト時間(秒)
31        CURLOPT_FOLLOWLOCATION => true,                          // HTTPリダイレクトを自動的に追跡する
32
33        // プロキシ設定
34        // !!! 注意: 以下のプロキシ設定はダミーです。
35        // !!! 実際に動作させるには、有効なプロキシサーバーのアドレスとポートに置き換えてください。
36        CURLOPT_PROXY          => "{$proxyHost}:{$proxyPort}",  // プロキシサーバーのアドレスとポート
37        CURLOPT_PROXYTYPE      => CURLPROXY_HTTP,                // プロキシのタイプ (例: HTTPプロキシ)
38
39        // SSL/TLS検証に関するオプション
40        // CURLOPT_SSL_VERIFYPEER: リモートサーバーのSSL証明書が正規の認証局によって発行されたものか検証します。
41        //                         セキュリティのため、本番環境では 'true' (または 1) を推奨します。
42        CURLOPT_SSL_VERIFYPEER => true,                          // ピア(サーバー)の証明書を検証する
43
44        // CURLOPT_PROXY_SSL_VERIFYHOST: プロキシ経由のHTTPS接続において、
45        //                               リモートサーバーのホスト名がSSL証明書のCN/SANフィールドと一致するかを検証します。
46        //                               このオプションは CURLOPT_SSL_VERIFYPEER が 'true' の場合に効果があります。
47        //
48        // 設定可能な値:
49        //   0: ホスト名のチェックを行わない (セキュリティリスクが非常に高いため、推奨されません)
50        //   1: ホスト名が存在するかどうかを確認するが、厳密な照合は行わない (非推奨)
51        //   2: ホスト名と証明書のCN (Common Name) / SAN (Subject Alternative Name) フィールドを厳密に照合する (推奨)
52        CURLOPT_PROXY_SSL_VERIFYHOST => 2,                       // プロキシ経由でのSSLホスト名検証を厳密に行う (推奨設定)
53
54        // 必要に応じてCA証明書のバンドルパスを指定できます (CURLOPT_CAINFO)
55        // 例: CURLOPT_CAINFO => '/etc/ssl/certs/ca-certificates.crt',
56    ]);
57
58    // cURLセッションを実行
59    $response = curl_exec($ch);
60
61    // エラーチェック
62    if (curl_errno($ch)) {
63        // cURL実行中にエラーが発生した場合
64        $errorMessage = curl_error($ch);
65        error_log("cURLエラー: " . $errorMessage);
66        $response = false;
67    }
68
69    // cURLセッションを閉じる
70    curl_close($ch);
71
72    return $response;
73}
74
75// --- 関数利用例 ---
76$targetUrl = 'https://www.example.com';
77// !!! IMPORTANT: 以下のプロキシ設定はダミーです。
78// !!! 実際に動作させるには、ご自身の環境で有効なプロキシサーバーのアドレスとポートに置き換えてください。
79$dummyProxyHost = '192.168.1.1'; // 例: ダミープロキシホスト
80$dummyProxyPort = 8080;          // 例: ダミープロキシポート
81
82echo "プロキシ経由で '{$targetUrl}' へHTTPSリクエストを試行中...\n";
83echo "(注: プロキシ設定はダミーのため、実際のリクエストは失敗する可能性があります。)\n\n";
84
85$data = fetchDataViaProxyWithSslHostVerification($targetUrl, $dummyProxyHost, $dummyProxyPort);
86
87if ($data !== false) {
88    echo "リクエスト成功!\n";
89    // 取得したデータの一部を表示(長文になりすぎるのを防ぐため)
90    // echo "レスポンスの最初の500文字:\n";
91    // echo mb_substr($data, 0, 500) . "...\n";
92} else {
93    echo "リクエスト失敗。詳細についてはエラーログを確認してください。\n";
94}
95
96?>

このPHPサンプルコードは、cURLライブラリを使用してプロキシ経由でHTTPSリクエストを送信する際、SSL通信のセキュリティ設定について解説しています。特に、CURLOPT_PROXY_SSL_VERIFYHOSTという定数の役割と利用方法に焦点を当てています。

CURLOPT_PROXY_SSL_VERIFYHOSTは、プロキシを介したHTTPS接続において、アクセスしようとしているサーバーのホスト名が、そのサーバーが提示するSSL証明書に記載されたホスト名と一致するかどうかを検証するためのオプションです。この定数自体に引数はなく、設定値として整数を渡します。戻り値も整数型で、設定可能な値には0(検証しない、非推奨)、1(ホスト名が存在するか確認する、非推奨)、2(ホスト名と証明書のCN/SANフィールドを厳密に照合する、推奨)があります。セキュリティ確保のため2を設定することが強く推奨されます。

サンプルコードのfetchDataViaProxyWithSslHostVerification関数では、cURLセッションを初期化後、CURLOPT_URLで送信先URLを、CURLOPT_PROXYでプロキシ情報を設定しています。重要なのは、CURLOPT_SSL_VERIFYPEERtrue(サーバー証明書の検証を有効化)にした上で、CURLOPT_PROXY_SSL_VERIFYHOST2を設定している点です。これにより、プロキシ経由のHTTPS通信においても、サーバー証明書の正当性とそのホスト名がリクエスト先と一致することの両方を厳密に確認し、安全性を高めています。

この関数は、ターゲットURL、プロキシホスト、プロキシポートを引数として受け取り、成功時にはサーバーからの応答ボディを文字列で返し、エラーが発生した場合はfalseを返します。ただし、コード内のプロキシ設定はダミーであるため、実際に動作させるには有効なプロキシサーバーの情報に置き換える必要があります。これらのSSL検証設定は、セキュアなシステムを構築する上で非常に重要な要素です。

このコードは、プロキシ経由のHTTPS通信において、接続先のSSLホスト名が正しいか検証する設定を示しています。CURLOPT_PROXY_SSL_VERIFYHOSTは、サーバー証明書のホスト名とアクセス先のホスト名が一致するかを確認し、特に設定値「2」は、厳密な照合を行う推奨設定です。これはセキュリティを確保するために重要であり、CURLOPT_SSL_VERIFYPEERが有効な場合に機能します。サンプルコードのプロキシ情報はダミーのため、ご自身の環境で有効な情報に置き換えてください。セキュリティリスクが高まるため、ホスト名検証を無効にする設定値「0」は使用しないでください。

関連コンテンツ

関連IT用語

関連プログラミング言語