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

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

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

作成日: 更新日:

基本的な使い方

CURLOPT_SSL_VERIFYPEER定数は、PHPのcURL拡張機能を利用してSSL/TLS通信を行う際、接続先のサーバー証明書が信頼できるものかを検証するかどうかを設定するための定数です。

安全なインターネット通信において、データが盗聴されたり改ざんされたりすることを防ぐために、SSL/TLS(HTTPS)プロトコルが広く使われています。このプロトコルでは、接続先のサーバーが本物であることを証明するためにサーバー証明書が使用されます。CURLOPT_SSL_VERIFYPEER定数をTRUE(ゼロ以外の値)に設定すると、cURLはサーバーから提示された証明書が、公的に信頼された認証局によって発行された有効なものであるかを厳密に確認します。

この検証プロセスは、通信相手がなりすましではないことを保証するために不可欠であり、中間者攻撃(Man-in-the-Middle attack)のようなセキュリティリスクからシステムを保護します。そのため、通常はこの定数をTRUEに設定することが強く推奨されます。もしこの定数をFALSEに設定し検証を無効にした場合、cURLはサーバー証明書の真偽を問わずに接続してしまうため、悪意のあるサーバーが偽の証明書を提示しても検出できず、通信内容が危険にさらされる可能性が著しく高まります。本番環境での利用においては、常にこの設定を有効に保ち、セキュリティを確保することが非常に重要です。

構文(syntax)

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

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURL SSL証明書検証の動作

1<?php
2
3/**
4 * CURLOPT_SSL_VERIFYPEER オプションの動作を示すサンプル関数です。
5 *
6 * この関数は、指定された HTTPS URL に対して cURL リクエストを送信し、
7 * SSL 証明書の検証を有効 (true) または無効 (false) にした場合の違いを示します。
8 *
9 * @param string $url 検証対象の HTTPS URL。
10 * @param bool $verifyPeer SSL 証明書を検証するかどうか (true: 検証する, false: 検証しない)。
11 * @return void
12 */
13function demonstrateCurlSslVerification(string $url, bool $verifyPeer): void
14{
15    echo "ターゲットURL: " . $url . PHP_EOL;
16    echo "SSL 証明書の検証設定: " . ($verifyPeer ? "有効 (true)" : "無効 (false)") . PHP_EOL;
17
18    $ch = curl_init();
19
20    curl_setopt($ch, CURLOPT_URL, $url);
21    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列として取得
22    // ★ CURLOPT_SSL_VERIFYPEER: SSL/TLS 証明書の検証を行うかどうかを設定します。
23    // true (推奨): サーバー証明書が信頼できる認証局 (CA) によって署名されているか検証します。
24    // false (非推奨): 証明書の検証を行いません。セキュリティリスクがあるため、本番環境では避けてください。
25    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $verifyPeer);
26
27    $response = curl_exec($ch);
28
29    if (curl_errno($ch)) {
30        echo "CURL エラー (" . curl_errno($ch) . "): " . curl_error($ch) . PHP_EOL;
31    } else {
32        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
33        echo "HTTP ステータスコード: " . $httpCode . PHP_EOL;
34        // レスポンスが長すぎる場合を考慮し、最初の100文字のみ表示
35        echo "レスポンスの最初の100文字: " . substr((string)$response, 0, 100) . "..." . PHP_EOL;
36    }
37
38    curl_close($ch);
39    echo str_repeat("-", 50) . PHP_EOL;
40}
41
42// -----------------------------------------------------
43// サンプルコードの実行
44// -----------------------------------------------------
45
46// テストに使用する HTTPS URL を指定します。
47// 実際には、自分のテスト環境のURLや、信頼できる公開サイトのURLを使用してください。
48$testUrl = "https://www.google.com";
49
50echo "--- SSL 証明書検証を有効にする場合 (推奨) ---" . PHP_EOL;
51// CURLOPT_SSL_VERIFYPEER を true に設定することで、cURL はSSL証明書の信頼性を検証します。
52// 検証には、システムに設定されたCA証明書バンドルが使用されます。
53// php.ini の 'curl.cainfo' や 'openssl.cafile' ディレクティブで、
54// CA証明書ファイルのパスを明示的に指定することも可能です。
55demonstrateCurlSslVerification($testUrl, true);
56
57echo "--- SSL 証明書検証を無効にする場合 (非推奨) ---" . PHP_EOL;
58// CURLOPT_SSL_VERIFYPEER を false に設定すると、SSL証明書の検証がスキップされます。
59// これにより、自己署名証明書や期限切れの証明書を持つサイトにも接続できますが、
60// 中間者攻撃 (Man-in-the-Middle attack) のリスクを高めるため、本番環境での使用は避けるべきです。
61demonstrateCurlSslVerification($testUrl, false);

PHP 8におけるCURLOPT_SSL_VERIFYPEERは、cURL拡張機能でHTTPS通信を行う際に、接続先のSSL/TLS証明書が信頼できるものであるかを検証するかどうかを設定するための重要な定数です。この定数自体に引数や戻り値はありませんが、curl_setopt関数にこの定数を指定し、その第三引数にtrueまたはfalseのブール値を設定することで、証明書検証の挙動を制御します。

この定数にtrueを設定すると、cURLはサーバーから提供されたSSL証明書が、システムにインストールされている信頼できる認証局(CA)によって発行されたものであるかを確認します。これにより、通信相手が本物であることを保証し、中間者攻撃などのセキュリティリスクから保護します。セキュリティ上、この設定を有効にすることが強く推奨されており、通常はシステムが持つCA証明書バンドルが使用されますが、php.iniファイルのcurl.cainfoopenssl.cafileディレクティブで特定のCA証明書ファイルを指定することも可能です。

一方、falseを設定すると、SSL証明書の検証がスキップされます。これは、自己署名証明書や期限切れの証明書など、信頼性が確立されていないサイトにも接続できるようになりますが、通信の安全性が確保されず、悪意のある第三者によって通信が傍受・改ざんされる危険性があります。そのため、この設定は開発・テスト環境での一時的な使用に限定し、本番環境での利用は避けるべきです。CURLOPT_SSL_VERIFYPEERは、安全なウェブ通信を確立するために不可欠なセキュリティオプションとなります。

CURLOPT_SSL_VERIFYPEERは、HTTPS通信でウェブサーバーのSSL証明書を検証するかどうかを設定する重要なオプションです。特に注意すべきは、このオプションをfalseに設定すると、SSL証明書の検証がスキップされてしまう点です。これにより、通信相手の正当性が保証されず、中間者攻撃などのセキュリティリスクにさらされる可能性が非常に高まります。システムエンジニアを目指す上で、本番環境でfalseを使用することは絶対に避けるべきです。安全のためには常にtrueを設定し、サーバーの証明書が信頼できる認証局(CA)によって発行されていることを確認してください。証明書検証に必要なCA情報のパスは、php.inicurl.cainfoディレクティブで指定できます。この設定はセキュアな通信を確立するために不可欠です。

PHP cURL: SSL証明書検証を無効にする

1<?php
2
3/**
4 * CURLOPT_SSL_VERIFYPEER 定数の使用例を示す関数。
5 * この関数は、SSL証明書の検証を無効にした状態でHTTPSリクエストを送信します。
6 *
7 * 重要: CURLOPT_SSL_VERIFYPEER を false に設定することは、セキュリティ上のリスクを伴います。
8 * 本番環境では通常 'true' に設定するか、このオプションを省略(デフォルトで 'true')して
9 * SSL証明書の検証を有効にしてください。
10 * これは、開発環境でのみ一時的に証明書の問題を回避するために使用されることがあります。
11 *
12 * @param string $url リクエストを送信するHTTPS URL。
13 * @return string|false リクエストのレスポンス本文、またはエラー時に false。
14 */
15function fetchContentWithoutSslVerification(string $url): string|false
16{
17    // cURLセッションを初期化します。
18    $ch = curl_init();
19
20    // cURL初期化に失敗した場合はエラーメッセージを表示し、falseを返します。
21    if ($ch === false) {
22        error_log("cURLセッションの初期化に失敗しました。");
23        return false;
24    }
25
26    // 接続先のURLを設定します。
27    curl_setopt($ch, CURLOPT_URL, $url);
28
29    // サーバーからの応答を直接出力するのではなく、文字列として返却するように設定します。
30    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
31
32    // --- ここが CURLOPT_SSL_VERIFYPEER の設定です ---
33    // CURLOPT_SSL_VERIFYPEER を false に設定すると、cURLはサーバーのSSL証明書が
34    // 有効かどうか、また信頼できる認証局によって署名されているかどうかの検証を行いません。
35    // この設定はセキュリティリスクを伴うため、特別な理由がない限り 'true' にすべきです。
36    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
37
38    // cURLセッションを実行し、レスポンスを取得します。
39    $response = curl_exec($ch);
40
41    // cURL実行中にエラーが発生した場合、エラー情報をログに記録します。
42    if ($response === false) {
43        $errorMessage = curl_error($ch);
44        $errorNumber = curl_errno($ch);
45        error_log("cURLリクエストでエラーが発生しました: [{$errorNumber}] {$errorMessage}");
46    }
47
48    // cURLセッションを終了し、リソースを解放します。
49    curl_close($ch);
50
51    return $response;
52}
53
54// --- サンプル使用例 ---
55
56// 検証に使用するHTTPSのURLを指定します。
57// 実際のウェブサイトのURLに置き換えてテストしてください。
58$targetUrl = 'https://www.example.com';
59
60echo "CURLOPT_SSL_VERIFYPEER を false に設定してリクエストを送信します。\n";
61echo "警告: この設定は、SSL証明書の検証をスキップするため、セキュリティ上のリスクがあります。\n\n";
62
63// 関数を呼び出し、レスポンスを取得します。
64$content = fetchContentWithoutSslVerification($targetUrl);
65
66if ($content !== false) {
67    echo "リクエストが成功しました! レスポンスの最初の500文字を表示します。\n";
68    echo substr($content, 0, 500) . "...\n";
69} else {
70    echo "リクエストは失敗しました。エラーログを確認してください。\n";
71}
72
73?>

PHPのCURLOPT_SSL_VERIFYPEERは、cURL拡張機能を利用してHTTPS通信を行う際に、接続先サーバーのSSL証明書を検証するかどうかを設定する定数です。この定数自体には引数も戻り値もありませんが、curl_setopt関数でオプションとして設定することでその挙動を制御します。

この定数をtrue(デフォルト値)に設定すると、cURLはサーバーのSSL証明書が正当で信頼できるものであるかを厳密に確認します。これにより、通信相手が本物であることを保証し、セキュリティが保護されます。

一方、サンプルコードのようにCURLOPT_SSL_VERIFYPEERfalseに設定すると、cURLはSSL証明書の検証をスキップします。この設定は、証明書の問題があるサーバーにも接続できるようになりますが、通信相手の身元が確認できないため、中間者攻撃などのセキュリティ上の重大なリスクが発生します。

したがって、本番環境ではこの設定をfalseにすることは避け、必ずtrueに設定するか、オプション自体を省略してデフォルトの検証有効な状態を維持してください。サンプルコードは、開発環境での一時的なテスト目的で検証を無効にする例ですが、この設定はセキュリティリスクを伴うため、特別な理由がない限り推奨されません。

「CURLOPT_SSL_VERIFYPEER」は、HTTPS通信でSSL証明書の検証を行うかを設定する定数です。サンプルコードのfalse設定は、証明書検証を行わないため、セキュリティリスクが高いです。

本番環境では、必ずこの定数をtrueに設定するか、省略してください(デフォルトがtrueです)。falseでの利用は、開発環境で一時的に証明書問題を回避する限定的な場合にのみ許容されます。リスクを十分に理解し、慎重に扱ってください。

関連コンテンツ