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

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

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

作成日: 更新日:

基本的な使い方

CURLSSLOPT_NO_REVOKE定数は、PHPのcURL拡張機能において、SSL/TLS接続時のサーバー証明書の失効チェックを無効にするオプションを表す定数です。SSL/TLS通信では、接続先のサーバーが提示する証明書が正規のものであるか、有効期限内であるかなどを確認しますが、さらにその証明書が発行者によって途中で無効化されていないか(失効していないか)も確認する「失効チェック」が行われることがあります。通常、cURLはこの失効チェックを自動的に行い、サーバー証明書が失効していると判断した場合は接続を中断し、セキュリティを保護します。

このCURLSSLOPT_NO_REVOKE定数をcURLオプションとして設定すると、その通常の失効チェックが行われなくなります。これにより、たとえ接続しようとしているサーバーのSSL/TLS証明書が失効していたとしても、cURLはそれを認識せずに通信を続行します。このオプションは、特定の環境下で失効チェックが正しく機能しない場合や、信頼できる内部ネットワークでの限定的な利用など、特殊な状況でのみ使用が検討されます。しかし、証明書の失効チェックを無効にすることは、不正なサーバーからの攻撃や中間者攻撃のリスクを高めることにつながります。そのため、特にインターネット経由での接続や機密性の高い情報を扱う通信においては、セキュリティ上の脆弱性となる可能性があるため、原則として使用を避けるべきです。利用する際は、そのリスクを十分に理解し、極めて慎重に判断する必要があります。

構文(syntax)

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

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

CURLSSLOPT_NO_REVOKEは、証明書失効リスト(CRL)による失効チェックを無効にするための整数値です。

サンプルコード

PHP curl SSL証明書失効チェック無効化

1<?php
2
3/**
4 * 指定されたURLからコンテンツを取得し、CURLSSLOPT_NO_REVOKEオプションを設定する関数。
5 *
6 * CURLSSLOPT_NO_REVOKEオプションは、WindowsのSchannel SSLバックエンドを使用している場合に、
7 * SSL証明書の失効チェックを無効にするために使用されます。
8 * 通常はセキュリティリスクを伴うため、特別な理由がない限り使用は推奨されません。
9 *
10 * @param string $url 取得するURL。
11 * @return string|false 取得したコンテンツ、またはエラーが発生した場合はfalse。
12 */
13function fetchUrlWithSslNoRevoke(string $url): string|false
14{
15    // 1. CURLセッションを初期化
16    $ch = curl_init();
17
18    if ($ch === false) {
19        // CURLの初期化に失敗した場合
20        error_log("CURLセッションの初期化に失敗しました。");
21        return false;
22    }
23
24    // 2. アクセスするURLを設定
25    curl_setopt($ch, CURLOPT_URL, $url);
26
27    // 3. curl_exec()の戻り値を文字列として返すように設定
28    //    trueにすると、取得したコンテンツが関数から直接返されます。
29    //    false(デフォルト)だと、コンテンツは直接出力されます。
30    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
31
32    // 4. CURLSSLOPT_NO_REVOKEオプションを設定
33    //    このオプションは、SSL証明書の失効チェックを無効にします。
34    //    主にWindows環境のSchannel SSLバックエンドで効果を発揮します。
35    //    セキュリティリスクが高いため、慎重な使用が必要です。
36    curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
37
38    // 5. CURLリクエストを実行し、結果を取得
39    $response = curl_exec($ch);
40
41    // 6. エラーチェック
42    if (curl_errno($ch)) {
43        // CURL実行中にエラーが発生した場合
44        error_log('CURLエラー: ' . curl_error($ch));
45        $response = false;
46    }
47
48    // 7. CURLセッションを終了し、リソースを解放
49    curl_close($ch);
50
51    return $response;
52}
53
54// --- 使用例 ---
55// 実際に存在するHTTPS URLでこの関数をテストしてください。
56// 注意: CURLSSLOPT_NO_REVOKEの具体的な効果は、使用しているOSとCURLのSSLバックエンド(例: OpenSSL, Schannel)に依存します。
57// ほとんどのLinux環境ではOpenSSLが使用されるため、このオプションは効果がない可能性があります。
58$targetUrl = 'https://www.example.com'; // テスト用のHTTPS URLに置き換えてください
59
60echo "URL: {$targetUrl} からコンテンツを取得中...\n";
61
62// 定義した関数を呼び出し、コンテンツを取得
63$content = fetchUrlWithSslNoRevoke($targetUrl);
64
65if ($content !== false) {
66    // コンテンツの取得に成功した場合、その一部を表示
67    echo "コンテンツの一部:\n";
68    echo substr($content, 0, 200) . "...\n"; // 最初の200文字を表示
69} else {
70    // コンテンツの取得に失敗した場合
71    echo "コンテンツの取得に失敗しました。詳細はエラーログを確認してください。\n";
72}
73
74?>

このPHPコードは、CURLSSLOPT_NO_REVOKE定数を使用して、指定されたHTTPSのURLからウェブコンテンツを取得する一連の処理を示しています。CURLSSLOPT_NO_REVOKEは、PHPのCURL拡張機能におけるSSLオプションの一つで、主にWindows環境でCURLがSchannel SSLバックエンドを使用している場合に、SSL証明書の失効チェックを無効にする役割を持ちます。これは通常、セキュリティリスクを高める行為であり、特別な理由がない限り使用は推奨されません。

サンプルコードのfetchUrlWithSslNoRevoke関数は、引数として取得対象のURL(文字列)を受け取ります。この関数内部では、まずcurl_init()でCURLセッションを初期化し、curl_setopt()を使ってアクセスするURL、取得結果を文字列として返す設定、そして重要なCURLSSLOPT_NO_REVOKEオプションを設定します。設定後、curl_exec()でHTTPリクエストを実行し、ウェブコンテンツを取得します。

処理が成功した場合、関数は取得したコンテンツを文字列として返します。しかし、CURLの初期化失敗や通信エラーが発生した場合は、falseを返し、エラー情報は内部でログに出力されます。このオプションの具体的な効果は、使用しているOSやCURLのSSLバックエンドに依存するため、ほとんどのLinux環境で使われるOpenSSLでは効果がない可能性がある点に注意が必要です。

このサンプルコードで設定しているCURLSSLOPT_NO_REVOKEオプションは、SSL証明書の失効チェックを無効化するため、セキュリティ上の重大なリスクを伴います。通常は使用せず、やむを得ない特別な事情がある場合に限り、リスクを十分に理解した上で慎重に適用してください。このオプションは主にWindowsのSchannel SSLバックエンド環境で効果を発揮し、Linuxなどで一般的なOpenSSL環境では機能しない場合がありますので、実行環境に依存することにご注意ください。通信の安全性を確保するため、証明書の失効チェックは通常有効にしておくべきです。サンプルコードではerror_logを用いたエラー処理やcurl_closeによるリソース解放が適切に行われており、実務においてもエラーハンドリングとリソース管理は非常に重要です。

PHP cURLでのSSL証明書失効チェック無効化

1<?php
2
3/**
4 * Demonstrates how to use CURLSSLOPT_NO_REVOKE with cURL in PHP.
5 *
6 * CURLSSLOPT_NO_REVOKE is an SSL option that, when set via CURLOPT_SSL_OPTIONS,
7 * tells cURL not to check the certificate revocation list (CRL) or OCSP responder
8 * for the server's SSL certificate.
9 *
10 * IMPORTANT: Disabling certificate revocation checks can weaken the security
11 * of your application and is generally not recommended for production environments.
12 * Use with caution and only when you fully understand the implications.
13 *
14 * @param string $url The URL to fetch.
15 * @return string|null The content fetched from the URL, or null if an error occurred.
16 */
17function fetchUrlWithNoRevokeCheck(string $url): ?string
18{
19    // 1. cURLセッションを初期化します。
20    // curl_init() は新しい cURL セッションを初期化し、cURL ハンドルを返します。
21    $ch = curl_init();
22
23    // 初期化に失敗した場合のチェック
24    if ($ch === false) {
25        echo "エラー: cURLセッションの初期化に失敗しました。\n";
26        return null;
27    }
28
29    // 2. cURLオプションを設定します。
30    // curl_setopt() を使用して、cURL転送の動作を設定します。
31
32    // ターゲットURLを設定します。
33    curl_setopt($ch, CURLOPT_URL, $url);
34
35    // cURLが取得したデータを直接出力せず、戻り値として文字列で返すように設定します。
36    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
37
38    // SSLオプションを設定し、CURLSSLOPT_NO_REVOKEフラグを含めます。
39    // このフラグは、SSL証明書の失効チェックを行わないようにcURLに指示します。
40    // これは CURLOPT_SSL_OPTIONS のビットマスクの一部として使用されます。
41    // セキュリティ上の理由から、このオプションは注意して使用してください。
42    echo "情報: CURLSSLOPT_NO_REVOKE を設定し、SSL証明書の失効チェックを無効にします。\n";
43    curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
44
45    // cURLがサーバーのSSL証明書の正当性を検証するようにします。
46    // CURLSSLOPT_NO_REVOKEは失効チェックをスキップするだけで、証明書自体の検証は行われます。
47    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
48    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
49
50    // 3. cURLリクエストを実行します。
51    // curl_exec() は設定された cURL セッションを実行します。
52    $response = curl_exec($ch);
53
54    // 4. エラーをチェックします。
55    // curl_errno() は最後に実行された cURL 操作のエラー番号を返します。
56    // curl_error() は最後に実行された cURL 操作のエラーメッセージを返します。
57    if (curl_errno($ch)) {
58        echo 'cURLエラー (' . curl_errno($ch) . '): ' . curl_error($ch) . "\n";
59        $response = null; // エラーが発生した場合はnullを返します
60    } else {
61        // HTTPステータスコードを表示します。
62        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
63        echo "cURLリクエストが完了しました。HTTPステータス: {$httpCode}\n";
64    }
65
66    // 5. cURLセッションを閉じます。
67    // curl_close() は cURL セッションを閉じ、リソースを解放します。
68    curl_close($ch);
69
70    return $response;
71}
72
73// --- サンプル使用例 ---
74// 信頼できる公開HTTPS URLを使用します。
75// CURLSSLOPT_NO_REVOKE の効果は、通常は問題ない証明書には影響を与えません。
76// このオプションの主な用途は、失効した証明書を持つサーバーへの接続を可能にする場合などです。
77$targetUrl = 'https://www.google.com';
78
79echo "ターゲットURL '{$targetUrl}' に対して、SSL失効チェックを無効にしてフェッチを試みます...\n";
80$content = fetchUrlWithNoRevokeCheck($targetUrl);
81
82if ($content !== null) {
83    echo "コンテンツが正常にフェッチされました (最初の200文字):\n";
84    // フェッチされたコンテンツの最初の200文字を表示します。
85    echo substr($content, 0, 200) . "...\n";
86} else {
87    echo "ターゲットURL '{$targetUrl}' からコンテンツをフェッチできませんでした。\n";
88}
89
90?>

PHPのCURLSSLOPT_NO_REVOKEは、PHPのcURL拡張機能で使用されるSSLオプションに関する定数です。この定数は、curl_setopt()関数のCURLOPT_SSL_OPTIONS引数に設定することで、cURLが接続先のサーバーSSL証明書の失効チェックを行わないように指示する役割を持ちます。具体的には、証明書失効リスト(CRL)やOCSP応答による検証をスキップします。

サンプルコードでは、fetchUrlWithNoRevokeCheck関数においてcurl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);として利用されており、これによりターゲットURLへのアクセス時に、証明書が失効している場合でも接続を試みることが可能になります。

CURLSSLOPT_NO_REVOKE自体は引数を取らず、内部的にint型の値を持ち、CURLOPT_SSL_OPTIONSに渡すためのビットマスクの一部として機能します。

重要な注意点として、SSL証明書の失効チェックを無効にすることは、アプリケーションのセキュリティを著しく低下させる可能性があります。 証明書が失効しているということは、その証明書が信頼できない状態であることを意味するため、通常は接続を拒否すべきです。このオプションは、特定のテスト環境や、セキュリティリスクを十分に理解し、許容できる例外的な状況でのみ、慎重に使用することが推奨されます。本番環境での使用は極力避けるべきです。

CURLSSLOPT_NO_REVOKEは、SSL証明書の失効チェックを無効にする設定であり、セキュリティ上の大きなリスクを伴います。このオプションを使用すると、失効した証明書を持つサーバーへの接続も許可してしまうため、悪意のあるサイトに接続してしまう危険性が高まります。そのため、本番環境での利用は極めて推奨されません。特別な理由があり、そのリスクを完全に理解している場合にのみ、慎重に使用してください。また、このオプションを設定しても、CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTによるサーバー証明書自体の検証は必ず有効にして、最低限のセキュリティを維持することが重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語