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

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

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

作成日: 更新日:

基本的な使い方

CURLOPT_DOH_SSL_VERIFYPEER定数は、PHPのcURL拡張機能において、DNS over HTTPS(DoH)通信を行う際のSSL/TLS証明書の検証に関する設定を制御するために使用される定数です。DNS over HTTPSとは、ウェブサイトのドメイン名からIPアドレスを解決するDNSクエリを、通常のHTTP通信と同様にSSL/TLSで暗号化して行う技術です。これにより、DNSクエリが盗聴されたり改ざんされたりするリスクを低減できます。

この定数を利用することで、DoHリクエストを送信する際に、接続先のDoHサーバーが提示するSSL/TLS証明書が正当なものであるかをシステムが確認するかどうかを設定できます。具体的には、この検証を有効にすることで、不正なサーバーが正当なサーバーであるかのように偽装する「中間者攻撃」などのセキュリティリスクから通信を保護できます。検証が無効の場合、証明書の信頼性を確認せずに通信が行われるため、セキュリティ上の脆弱性につながる可能性があります。

通常、この定数はcurl_setopt()関数と組み合わせて使用され、第二引数としてこの定数を渡し、第三引数にtrue(検証を有効にする)またはfalse(検証を無効にする)のいずれかの値を指定します。セキュアな通信を確保するためには、特別な理由がない限り、証明書の検証を有効に設定することが強く推奨されます。システムエンジニアを目指す方にとって、安全なネットワーク通信を実装する上で、この定数の役割を理解することは非常に重要です。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_URL, "https://example.com");
4curl_setopt($ch, CURLOPT_DOH_SSL_VERIFYPEER, true);
5curl_close($ch);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURL: DoH SSL証明書検証設定

1<?php
2
3/**
4 * DNS over HTTPS (DoH) を利用してURLからコンテンツを取得し、
5 * DoHリゾルバのSSL証明書検証オプションを設定するサンプルです。
6 *
7 * @param string $url             取得するターゲットのURL
8 * @param string $dohUrl          使用するDNS over HTTPSリゾルバのURL
9 * @param bool   $verifyDohPeer   DoHリゾルバのSSL証明書を検証するかどうか (CURLOPT_DOH_SSL_VERIFYPEER)
10 * @return string|false           取得したコンテンツ、または失敗した場合はfalse
11 */
12function fetchUrlWithDohAndPeerVerification(
13    string $url,
14    string $dohUrl = 'https://cloudflare-dns.com/dns-query', // デフォルトのDoHリゾルバ
15    bool $verifyDohPeer = true
16): string|false {
17    // cURLセッションを初期化します。
18    $ch = curl_init();
19
20    if ($ch === false) {
21        error_log("cURL の初期化に失敗しました。");
22        return false;
23    }
24
25    // 基本的なcURLオプションを設定します。
26    curl_setopt($ch, CURLOPT_URL, $url); // 取得するターゲットのURL
27    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返します。
28
29    // DNS over HTTPS (DoH) のリゾルバURLを設定します。
30    // これにより、ターゲットURLの名前解決に指定したDoHリゾルバが使われます。
31    curl_setopt($ch, CURLOPT_DOH_URL, $dohUrl);
32
33    // CURLOPT_DOH_SSL_VERIFYPEER の設定
34    // このオプションは、DNS over HTTPS (DoH) リゾルバへの接続時に、
35    // そのリゾルバのSSL証明書を検証するかどうかを制御します。
36    //
37    // true: DoHリゾルバの証明書を検証します(推奨、セキュリティが高まります)。
38    // false: DoHリゾルバの証明書を検証しません(開発・テスト環境など限定的な利用に留めるべきです)。
39    //
40    // 補足:
41    // これは、CURLOPT_URL で指定された最終的なターゲットサーバーへのHTTPS接続における
42    // 証明書検証 (CURLOPT_SSL_VERIFYPEER) とは別のオプションです。
43    // CURLOPT_DOH_SSL_VERIFYPEER は DoHリゾルバへの接続にのみ適用されます。
44    curl_setopt($ch, CURLOPT_DOH_SSL_VERIFYPEER, $verifyDohPeer);
45
46    // cURLセッションを実行し、レスポンスを取得します。
47    $response = curl_exec($ch);
48
49    // エラーチェック
50    if (curl_errno($ch)) {
51        $error_message = curl_error($ch);
52        error_log("URL {$url} の cURL エラー: {$error_message}");
53        curl_close($ch);
54        return false;
55    }
56
57    // cURLセッションを終了します。
58    curl_close($ch);
59
60    return $response;
61}
62
63// --- サンプルコードの利用例 ---
64
65// ターゲットURL
66$targetUrl = 'https://www.google.com/';
67
68// 例1: DoHリゾルバのSSL証明書を検証する場合 (推奨される設定)
69echo "--- DoHリゾルバの証明書検証を有効にしてコンテンツを取得 ---" . PHP_EOL;
70$contentVerified = fetchUrlWithDohAndPeerVerification($targetUrl, 'https://cloudflare-dns.com/dns-query', true);
71
72if ($contentVerified !== false) {
73    echo "成功: コンテンツの先頭100文字 -> " . substr($contentVerified, 0, 100) . "..." . PHP_EOL;
74} else {
75    echo "失敗: コンテンツを取得できませんでした。" . PHP_EOL;
76}
77
78echo PHP_EOL;
79
80// 例2: DoHリゾルバのSSL証明書を検証しない場合 (非推奨、セキュリティリスクがあるため注意)
81echo "--- DoHリゾルバの証明書検証を無効にしてコンテンツを取得 ---" . PHP_EOL;
82// 本番環境での 'false' の使用はセキュリティリスクを高めます。テスト目的でのみ使用してください。
83$contentNotVerified = fetchUrlWithDohAndPeerVerification($targetUrl, 'https://dns.google/dns-query', false);
84
85if ($contentNotVerified !== false) {
86    echo "成功 (証明書検証なし): コンテンツの先頭100文字 -> " . substr($contentNotVerified, 0, 100) . "..." . PHP_EOL;
87} else {
88    echo "失敗 (証明書検証なし): コンテンツを取得できませんでした。" . PHP_EOL;
89}
90
91?>

このサンプルコードは、PHPのcURLライブラリを用いて、DNS over HTTPS (DoH) を利用してウェブコンテンツを取得する際に、DoHリゾルバのSSL証明書検証を設定する方法を説明しています。

fetchUrlWithDohAndPeerVerification関数は、ターゲットとなるURL($url)からデータを取得します。この際、名前解決のために$dohUrlで指定されたDNS over HTTPSリゾルバを使用します。

最も重要なオプションはCURLOPT_DOH_SSL_VERIFYPEERです。このオプションは、DNS over HTTPSリゾルバに接続する際に、そのリゾルバのSSL証明書が信頼できるものかを検証するかどうかを制御します。関数の引数$verifyDohPeerでこのオプションの値を設定します。trueに設定すると証明書が検証され、通信の安全性が高まります。これはセキュリティ上、強く推奨される設定です。falseに設定すると検証は行われませんが、これはセキュリティリスクを伴うため、本番環境での使用は避けるべきです。

このオプションは、取得しようとしている最終的なウェブサイトへのHTTPS接続におけるSSL証明書検証(CURLOPT_SSL_VERIFYPEER)とは異なり、名前解決のために使用するDoHリゾルバへの接続にのみ適用される点に注意が必要です。

関数は、コンテンツの取得に成功した場合はその内容を文字列として返し、何らかの理由で失敗した場合はfalseを返します。サンプルコードの利用例では、証明書検証を有効にした場合と無効にした場合の両方の実行結果を確認できます。

CURLOPT_DOH_SSL_VERIFYPEERは、DNS over HTTPS (DoH) リゾルバへの接続時にそのSSL証明書を検証するかどうかを制御するオプションです。これは、ウェブサーバーへのSSL証明書検証を行うCURLOPT_SSL_VERIFYPEERとは異なり、名前解決に利用するDoHリゾルバにのみ適用される点に注意してください。セキュリティ確保のため、通常はtrue(検証する)を設定することが強く推奨されます。falseに設定するとDoHリゾルバの正当性が確認できなくなり、中間者攻撃などのセキュリティリスクが高まります。開発やテストの目的で一時的に無効にする場合を除き、本番環境でのfalseの使用は避けるべきです。常にセキュリティを意識して設定値を判断することが重要となります。

PHP cURL: DoH SSL証明書検証設定

1<?php
2
3/**
4 * DNS-over-HTTPS (DoH) を利用してURLからコンテンツを取得する関数。
5 *
6 * この関数は、指定されたURLへのリクエストにおいて、DNSの名前解決に
7 * DoH (DNS-over-HTTPS) サーバーを使用します。
8 * CURLOPT_DOH_SSL_VERIFYPEER オプションを使用して、DoHサーバーとの通信における
9 * SSL証明書の検証を行うかどうかを設定する方法を示します。
10 *
11 * @param string $url 取得対象のURL (例: 'https://www.example.com')
12 * @param string $dohUrl 使用するDoHサーバーのURL (例: 'https://dns.google/dns-query')
13 * @param bool $verifyPeer DoHサーバーのSSL証明書を検証するかどうか (true:検証する, false:検証しない)
14 * @return string|false 取得したコンテンツ、またはエラー時にfalse
15 */
16function fetchUrlWithDohSslVerification(string $url, string $dohUrl = 'https://dns.google/dns-query', bool $verifyPeer = true): string|false
17{
18    // cURLセッションを初期化します。
19    $ch = curl_init();
20
21    if ($ch === false) {
22        // 初心者向けにエラーメッセージも出力します。
23        echo "エラー: cURLセッションの初期化に失敗しました。\n";
24        return false;
25    }
26
27    // DoHサーバーのURLを設定します。
28    // このオプションにより、ターゲットURLの名前解決に指定されたDoHサーバーが使用されます。
29    curl_setopt($ch, CURLOPT_DOH_URL, $dohUrl);
30
31    // DoHサーバーとの通信におけるSSL証明書の検証を設定します。
32    //
33    // CURLOPT_DOH_SSL_VERIFYPEER は、CURLOPT_DOH_URL で指定されたDoHサーバーの
34    // SSL証明書が信頼できる認証局によって署名されているかを検証するかどうかを制御します。
35    //
36    // true (推奨): 検証を有効にします。これにより、中間者攻撃 (Man-in-the-Middle) などから保護されます。
37    //             DoHサーバーの信頼性を確保するために常に有効にすべきです。
38    // false (非推奨): 検証を無効にします。セキュリティリスクが高まります。
39    //                自己署名証明書など、特別なケースでのみ検討してください。
40    //
41    // 注意: このオプションは、DoHサーバーとの通信のみに適用されます。
42    // 取得対象のURL (CURLOPT_URL) がHTTPSの場合、その通信のSSL検証は
43    // CURLOPT_SSL_VERIFYPEER (サーバー証明書の検証) および CURLOPT_SSL_VERIFYHOST (ホスト名の検証)
44    // によって別途制御されます。これらはDoHの検証とは異なる目的を持つオプションです。
45    // (例: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
46    //      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);)
47    curl_setopt($ch, CURLOPT_DOH_SSL_VERIFYPEER, $verifyPeer);
48
49    // 取得対象のURLを設定します。
50    curl_setopt($ch, CURLOPT_URL, $url);
51
52    // レスポンスを文字列として取得するよう設定します (ブラウザに直接出力しない)。
53    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
54
55    // 進捗表示を無効にします。
56    curl_setopt($ch, CURLOPT_NOPROGRESS, true);
57
58    // HTTPリクエストを実行します。
59    $response = curl_exec($ch);
60
61    // エラーが発生した場合の処理を行います。
62    if (curl_errno($ch)) {
63        echo 'cURLエラー (' . curl_errno($ch) . '): ' . curl_error($ch) . "\n";
64        $response = false; // エラー時はfalseを返します。
65    }
66
67    // cURLセッションを閉じます。
68    curl_close($ch);
69
70    return $response;
71}
72
73// --- 使用例 ---
74// システムエンジニアを目指す初心者向けに、具体的な動作イメージを提供します。
75
76// 1. DoHサーバーのSSL検証を有効にした場合の例 (推奨設定)
77echo "--- DoHサーバーのSSL検証を有効にして 'https://www.example.com' を取得 ---\n";
78$targetUrl = 'https://www.example.com';
79$contentVerified = fetchUrlWithDohSslVerification($targetUrl, 'https://dns.google/dns-query', true);
80
81if ($contentVerified !== false) {
82    echo "コンテンツの一部 (検証有効):\n";
83    // 取得したHTMLからタグを除去し、最初の200文字を表示します。
84    echo mb_substr(strip_tags($contentVerified), 0, 200) . "...\n";
85    echo "ステータス: 成功\n\n";
86} else {
87    echo "コンテンツの取得に失敗しました (検証有効)。\n\n";
88}
89
90// 2. DoHサーバーのSSL検証を無効にした場合の例 (非推奨設定)
91// !!注意!! セキュリティリスクが高いため、本番環境での使用は避けるべきです。
92// 通常の運用では `false` に設定することは推奨されません。
93echo "--- DoHサーバーのSSL検証を無効にして 'https://www.example.com' を取得 (非推奨) ---\n";
94$contentUnverified = fetchUrlWithDohSslVerification($targetUrl, 'https://dns.google/dns-query', false);
95
96if ($contentUnverified !== false) {
97    echo "コンテンツの一部 (検証無効):\n";
98    echo mb_substr(strip_tags($contentUnverified), 0, 200) . "...\n";
99    echo "ステータス: 成功\n";
100} else {
101    echo "コンテンツの取得に失敗しました (検証無効)。\n";
102}

PHPのCURLOPT_DOH_SSL_VERIFYPEERは、DNS-over-HTTPS(DoH)を利用した通信において、DoHサーバーのSSL証明書を検証するかどうかを設定するためのcURLオプション定数です。このサンプルコードでは、指定されたURLのコンテンツを、DoHサーバーを利用して取得する関数を定義しています。

関数は、CURLOPT_DOH_URLオプションで設定されたDoHサーバーとの通信において、そのサーバーのSSL証明書が信頼できる認証局によって発行されているかを検証するかどうかをCURLOPT_DOH_SSL_VERIFYPEERで制御します。この定数にはブール値(trueまたはfalse)を設定します。trueに設定すると、DoHサーバーのSSL証明書が検証され、中間者攻撃などから保護された安全な通信が保証されます。これは強く推奨される設定です。一方、falseに設定すると検証が無効になり、セキュリティリスクが高まるため、特別な場合を除き避けるべきです。

このオプションは、DoHサーバーとの通信にのみ適用されます。取得対象のURLがHTTPSの場合にその通信のSSL証明書を検証するCURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTとは目的が異なるため、混同しないようご注意ください。

関数の引数$verifyPeerは、このCURLOPT_DOH_SSL_VERIFYPEERに渡すブール値を指定し、DoHサーバーのSSL検証の有効・無効を制御します。関数は、URLからコンテンツを正常に取得できた場合はそのコンテンツを文字列として返し、エラーが発生した場合はfalseを返します。

CURLOPT_DOH_SSL_VERIFYPEERは、DNSの名前解決に利用するDNS-over-HTTPS (DoH) サーバーのSSL証明書が信頼できるか検証するオプションです。システムを安全に運用するためには、このオプションをtrue(検証を有効にする)に設定することを強く推奨します。falseに設定すると、DoHサーバーとの通信において中間者攻撃などのセキュリティリスクが高まり、名前解決結果が改ざんされる危険性があります。

また、このオプションはDoHサーバーへの通信にのみ適用される点に注意が必要です。実際にコンテンツを取得する対象のURL(https://www.example.comなど)がHTTPSである場合のSSL証明書検証は、CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTといった別のオプションで制御されます。DoHサーバーとターゲットURL、双方のSSL検証を適切に行うことで、総合的なセキュリティを確保できます。

関連コンテンツ

関連IT用語

関連プログラミング言語