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

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

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

作成日: 更新日:

基本的な使い方

CURLSSLOPT_REVOKE_BEST_EFFORT定数は、PHPのcURL拡張機能において、SSL/TLS証明書の失効確認の動作を制御するためのオプションを表す定数です。この定数は、安全な通信を行う際に使用されるデジタル証明書の正当性を検証するプロセスに影響を与えます。

通常、cURLは接続先のサーバーが提示するSSL/TLS証明書が有効であるか、そしてその証明書が失効していないかを確認します。失効の確認には、証明書失効リスト(CRL)と呼ばれる情報が利用され、これにより不正な証明書の使用を防ぎ、通信の信頼性を確保しています。

CURLSSLOPT_REVOKE_BEST_EFFORT定数を設定すると、cURLはCRLの取得や検証でエラーが発生した場合でも、それを致命的な問題とはみなさずに通信を続行しようとします。これは「ベストエフォート(最善努力)」での失効確認を意味します。CRLサーバーが一時的に利用できないなどの状況で、正当な通信が不必要にブロックされることを防ぐ目的があります。

しかし、この設定はセキュリティリスクを伴う可能性があるため、利用には注意が必要です。失効しているはずの証明書が確認できないまま通信が行われるリスクがあるためです。システムの可用性を高める一方で、セキュリティ要件とのバランスを慎重に考慮し、適切な状況でのみ使用することが推奨されます。通常は、より厳密な失効確認がセキュリティの観点から推奨されます。

構文(syntax)

1<?php
2$ch = curl_init();
3// CURLOPT_SSL_OPTIONS に CURLSSLOPT_REVOKE_BEST_EFFORT を設定することで、
4// SSL証明書の失効チェックをベストエフォートモードで有効にします。
5curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_REVOKE_BEST_EFFORT);
6// その他のcURLオプション設定や実行処理
7curl_close($ch);
8?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURL: CURLSSLOPT_REVOKE_BEST_EFFORT を使ったHTTPSリクエスト

1<?php
2
3/**
4 * CURLSSLOPT_REVOKE_BEST_EFFORT オプションを使用してHTTPSリクエストを実行する関数。
5 *
6 * このオプションは、SSL/TLS証明書の失効チェックをベストエフォートで行うようcURLに指示します。
7 * 「ベストエフォート」とは、可能な限り証明書の失効状態を確認しようとしますが、
8 * 何らかの理由で確認できなかった場合でも、エラーとせずに処理を続行する可能性があることを意味します。
9 * セキュリティを向上させるため、通常はCURLOPT_SSL_VERIFYPEERと共に使用されます。
10 *
11 * @param string $url リクエストを送信するターゲットURL。
12 * @return string|false リクエストの応答ボディを文字列で返します。エラーが発生した場合はfalseを返します。
13 */
14function performCurlRequestWithRevokeOption(string $url): string|false
15{
16    // cURLセッションを初期化します。
17    // cURLはURLへのデータ転送を行うためのライブラリです。
18    $ch = curl_init();
19
20    // cURLセッションの初期化に失敗した場合、エラーメッセージを出力し、falseを返します。
21    if ($ch === false) {
22        echo "エラー: cURLセッションの初期化に失敗しました。\n";
23        return false;
24    }
25
26    // リクエストを送信するURLを設定します。
27    curl_setopt($ch, CURLOPT_URL, $url);
28
29    // HTTPS接続の際に、サーバー証明書が信頼できる認証局によって署名されているかを検証するよう設定します。
30    // これはセキュリティ上のベストプラクティスであり、中間者攻撃を防ぐのに役立ちます。
31    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
32
33    // CURLSSLOPT_REVOKE_BEST_EFFORT オプションを設定します。
34    // このオプションはCURLOPT_SSL_OPTIONSに指定することで有効になります。
35    // 証明書の失効チェックをベストエフォートで行うことをcURLに指示します。
36    // 他のSSLオプションと組み合わせてビットOR演算子(|)で設定することもできます。
37    curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_REVOKE_BEST_EFFORT);
38
39    // curl_exec()関数の戻り値を文字列として取得するように設定します。
40    // trueに設定しない場合、curl_exec()は直接結果を出力します。
41    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
42
43    // cURLリクエストを実行し、応答を取得します。
44    $response = curl_exec($ch);
45
46    // cURLリクエストの実行中にエラーが発生したかを確認します。
47    if (curl_errno($ch)) {
48        echo "cURLエラーが発生しました: " . curl_error($ch) . "\n";
49        $response = false; // エラー時はfalseを返す
50    }
51
52    // cURLセッションを閉じ、関連するリソースを解放します。
53    curl_close($ch);
54
55    return $response;
56}
57
58// --------------------------------------------------------------------------------
59// サンプルコードの実行例
60// --------------------------------------------------------------------------------
61
62// テスト用の安全なHTTPSサイトのURLを指定します。
63$targetUrl = "https://www.example.com";
64
65echo "指定URL: '{$targetUrl}' へ 'CURLSSLOPT_REVOKE_BEST_EFFORT' オプションを使用してリクエストを送信します。\n\n";
66
67// 定義した関数を呼び出し、リクエストを実行します。
68$result = performCurlRequestWithRevokeOption($targetUrl);
69
70// 結果に基づいて処理を分岐します。
71if ($result !== false) {
72    echo "リクエスト成功! 取得した応答の最初の200文字を表示します。\n";
73    echo "--------------------------------------------------------------------------------\n";
74    echo substr($result, 0, 200) . "...\n";
75    echo "--------------------------------------------------------------------------------\n";
76} else {
77    echo "リクエスト失敗。詳細については、上記のエラーメッセージを確認してください。\n";
78}
79
80?>

PHPの定数CURLSSLOPT_REVOKE_BEST_EFFORTは、cURLによるHTTPS通信において、SSL/TLS証明書の失効チェックを「ベストエフォート」で行うためのオプションです。ベストエフォートとは、可能な限り証明書の失効状態を確認しようとしますが、何らかの理由で確認できなかった場合でも、エラーとせずに通信を続行する可能性があることを意味します。このオプションは、セキュリティを向上させるため、通常はサーバー証明書の検証を行うCURLOPT_SSL_VERIFYPEERと組み合わせて使用されます。

サンプルコードでは、performCurlRequestWithRevokeOption関数が指定されたURLへHTTPSリクエストを実行します。引数$urlはリクエスト先のURLで、戻り値は成功時に応答ボディの文字列、失敗時にfalseを返します。この関数では、curl_init()でcURLセッションを初期化後、curl_setopt()を用いて各種設定を行います。特に、CURLOPT_SSL_VERIFYPEERtrueに設定し、信頼できる証明書のみを検証するよう指示しています。そして、CURLOPT_SSL_OPTIONSCURLSSLOPT_REVOKE_BEST_EFFORTを指定することで、証明書の失効チェックをベストエフォートで実施するようcURLに命令しています。最後にcurl_exec()でリクエストを実行し、エラーがなければ結果を返します。この設定により、証明書失効チェックの柔軟性を保ちつつ、HTTPS通信のセキュリティを高めることができます。

この定数は、SSL/TLS証明書の失効チェックを可能な範囲で試みますが、チェックに失敗してもエラーとせずに処理を続行する可能性がある「ベストエフォート」の特性を持ちます。そのため、厳格なセキュリティが求められる場合は、この動作を理解し、追加のセキュリティ対策やより厳密な失効チェックオプションの検討が必要です。このオプションはCURLOPT_SSL_VERIFYPEERtrueに設定し、サーバー証明書の検証と組み合わせて使用することで、より安全なHTTPS通信を実現します。コードを実行する前に、PHPにcURL拡張機能がインストールされ、有効になっていることを確認してください。

PHPでCURLSSLOPT_REVOKE_BEST_EFFORTを設定する

1<?php
2
3/**
4 * CURLSSLOPT_REVOKE_BEST_EFFORT を使用して、SSL証明書の失効チェックを
5 * ベストエフォート型で設定するcURLリクエストを実行する関数。
6 *
7 * このオプションはPHP 8.0以降で利用可能です。
8 *
9 * @param string $url リクエストを送信するターゲットURL。
10 * @return string|false 成功した場合は取得したコンテンツの文字列、失敗した場合は false。
11 */
12function makeBestEffortSslCurlRequest(string $url): string|false
13{
14    // cURLセッションを初期化します。
15    $ch = curl_init();
16
17    if ($ch === false) {
18        // cURLの初期化に失敗した場合、エラーログに記録して処理を終了します。
19        error_log("CURLセッションの初期化に失敗しました。");
20        return false;
21    }
22
23    // リクエストを送信するURLを設定します。
24    curl_setopt($ch, CURLOPT_URL, $url);
25
26    // cURLが実行結果を直接出力するのではなく、文字列として返すように設定します。
27    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
28
29    // SSLピア証明書の検証を有効にします。
30    // この設定がtrueでない場合、失効チェックは意味をなさなくなります。
31    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
32
33    // SSLホスト名の検証を有効にします(一般的な推奨設定)。
34    // 証明書に記載されているホスト名と、アクセスしているホスト名が一致するかを確認します。
35    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
36
37    // CURLSSLOPT_REVOKE_BEST_EFFORT オプションを設定します。
38    // このオプションは、SSL証明書の失効チェックにおいて、
39    // チェックが失敗した場合でも接続をエラーとせず、継続するようにcURLに指示します。
40    // ただし、これは失効情報が得られない場合などに限られ、
41    // 通常は厳格な失効チェックが推奨されます。特定の状況でのみ利用を検討してください。
42    curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_REVOKE_BEST_EFFORT);
43
44    // cURLリクエストを実行し、レスポンスを取得します。
45    $response = curl_exec($ch);
46
47    // cURL実行中にエラーが発生したか確認します。
48    if (curl_errno($ch)) {
49        // エラーが発生した場合、エラーログに詳細を記録します。
50        error_log("CURLエラー: " . curl_error($ch));
51        $response = false; // 失敗として処理します。
52    }
53
54    // cURLセッションを閉じ、リソースを解放します。
55    curl_close($ch);
56
57    return $response;
58}
59
60// --- 関数利用の例 ---
61// 任意の安全なHTTPSサイトのURLを指定してください。
62// 例として一般的な検索エンジンサイトを使用します。
63$targetUrl = 'https://www.example.com/'; 
64
65echo "URL: {$targetUrl} からコンテンツを取得します。\n";
66
67$content = makeBestEffortSslCurlRequest($targetUrl);
68
69if ($content !== false) {
70    echo "コンテンツの取得に成功しました。冒頭の一部を表示します:\n";
71    // 取得したコンテンツの最初の500文字を切り詰めて表示します。
72    echo mb_strimwidth($content, 0, 500, '...') . "\n";
73} else {
74    echo "コンテンツの取得に失敗しました。エラーログを確認してください。\n";
75}
76
77?>

このサンプルコードは、PHPのcURL拡張機能を用いてHTTPS通信を行う際、SSL証明書の失効チェックを「ベストエフォート型」で設定する方法を示しています。CURLSSLOPT_REVOKE_BEST_EFFORT定数は、curl_setopt()関数とCURLOPT_SSL_OPTIONSオプションを組み合わせて使用され、SSL証明書の失効情報を取得できなかった場合でも、通信をエラーとせずに継続することをcURLに指示します。これはPHP 8.0以降で利用可能です。

コードではまずcurl_init()でcURLセッションを初期化し、curl_setopt()を使ってリクエスト先のURLや、レスポンスを文字列として取得するための設定を行います。特にSSL通信のセキュリティに関わるCURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTを有効にした上で、CURLSSLOPT_REVOKE_BEST_EFFORTを適用しています。これにより、証明書の失効チェックは行われますが、その結果が得られない場合に限り、厳格なエラーとせず処理を続行します。

リクエストはcurl_exec()で実行され、エラーが発生した場合はcurl_errno()で検知し、適切なエラー処理を行います。最終的にcurl_close()でセッションを閉じ、使用したリソースを解放します。この関数の引数$urlはリクエスト先のURLを指定し、成功した場合は取得したコンテンツの文字列を、失敗した場合はfalseを返します。通常、セキュリティの観点から厳格な失効チェックが推奨されますが、特定の環境下で柔軟な対応が必要な場合にこのオプションの利用を検討します。

CURLSSLOPT_REVOKE_BEST_EFFORTは、PHP 8.0以降で利用可能なSSL証明書の失効チェックに関するオプションです。このオプションは、失効チェックに問題があっても通信をエラーとせず継続する「ベストエフォート型」の挙動を示すため、セキュリティリスクを十分に理解した上で慎重に利用する必要があります。通常は、より厳格なSSL証明書検証の設定が推奨されます。

このオプションを使う際は、必ずCURLOPT_SSL_VERIFYPEERtrueに設定し、SSL証明書自体の検証を有効にしてください。これがなければ、失効チェックが十分に機能しません。また、アクセスするURLは信頼できるHTTPSサイトに限定し、curl_init()の初期化やcurl_exec()の実行でエラーが発生しないか、curl_errno()を使って常に確認し、適切にエラー処理を行うことが重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語