【PHP8.x】CURLOPT_CERTINFO定数の使い方
CURLOPT_CERTINFO定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLOPT_CERTINFO定数は、PHPのcURL拡張機能において、SSL/TLS接続時にサーバーから提供される証明書に関する詳細情報を取得するかどうかを表す定数です。この定数をTRUEに設定すると、cURLは接続先のウェブサーバーが提示するSSL/TLS証明書チェーンの情報を収集します。
具体的には、サーバー証明書の有効期限、発行者、サブジェクト名、公開鍵情報といったメタデータが対象となります。収集された証明書情報は、CURLOPT_VERBOSEオプションと組み合わせて標準エラー出力に詳細なログとして表示されるか、またはcurl_getinfo()関数を使ってCURLINFO_CERTINFOキーでプログラムから配列として取得できます。
CURLOPT_CERTINFOの大きな特徴は、SSL証明書の検証を行うCURLOPT_SSL_VERIFYPEERオプションの設定とは独立して動作する点です。つまり、証明書の検証が有効になっていない場合や、たとえ証明書自体が不正であったとしても、この定数をTRUEにすることで証明書情報を取得することが可能です。これにより、SSL/TLS接続の問題を診断したり、セキュリティ関連の分析を行ったりする際に、デバッグ情報として非常に役立ちます。システムエンジニアにとって、SSL/TLS通信の挙動を深く理解し、トラブルシューティングを行う上で重要なツールの一つとなります。
構文(syntax)
1<?php 2$ch = curl_init(); 3curl_setopt($ch, CURLOPT_URL, "https://www.example.com"); 4curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 5curl_setopt($ch, CURLOPT_CERTINFO, true); 6curl_exec($ch); 7$certificate_info = curl_getinfo($ch, CURLINFO_CERTINFO); 8curl_close($ch); 9?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURLでCA証明書を指定して安全なHTTPS通信する
1<?php 2 3/** 4 * CA証明書を利用して安全なHTTPSリクエストを行うサンプルコード 5 * 6 * システムエンジニアを目指す初心者向けに、PHPのcURL拡張機能を使って 7 * HTTPS通信でサーバーの信頼性を検証する基本的な方法を示します。 8 * CURLOPT_CAINFOオプションは、サーバー証明書の検証に使用する 9 * 信頼できる認証局(CA)の証明書バンドルのパスを指定します。 10 */ 11function makeSecureHttpRequest(string $url): ?string 12{ 13 // cURLセッションを初期化します。 14 $ch = curl_init(); 15 16 if ($ch === false) { 17 echo "エラー: cURLセッションの初期化に失敗しました。\n"; 18 return null; 19 } 20 21 // リクエスト先のURLを設定します。 22 curl_setopt($ch, CURLOPT_URL, $url); 23 24 // サーバー証明書の検証を有効にします。 25 // これにより、通信相手が信頼できるサーバーであることを確認できます。 26 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 27 28 // 信頼するCA証明書バンドルのパスを指定します。 29 // このパスはあなたの環境に合わせて変更する必要があります。 30 // 例: Windowsの場合 "C:\path\to\cacert.pem" 31 // Linuxの場合 "/etc/ssl/certs/ca-certificates.crt" など 32 // このファイルがない場合やパスが間違っている場合、証明書検証エラーが発生します。 33 curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem'); // これは仮のパスです。 34 35 // リクエスト結果を文字列として取得するよう設定します。 36 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 37 38 // cURLリクエストを実行します。 39 $response = curl_exec($ch); 40 41 // エラーが発生したかチェックします。 42 if (curl_errno($ch)) { 43 echo 'cURLエラー: ' . curl_error($ch) . "\n"; 44 $response = null; 45 } 46 47 // cURLセッションを終了し、リソースを解放します。 48 curl_close($ch); 49 50 return $response; 51} 52 53// ----------------------------------------------------------------------------- 54// サンプルコードの実行例 55// ----------------------------------------------------------------------------- 56 57// 検証用の安全なHTTPSサイトを指定 58$targetUrl = 'https://www.google.com'; 59 60echo "URL: " . $targetUrl . " への安全なHTTPSリクエストを試行します。\n\n"; 61 62// makeSecureHttpRequest関数を実行し、レスポンスを取得 63$responseContent = makeSecureHttpRequest($targetUrl); 64 65// 結果の表示 66if ($responseContent !== null) { 67 echo "リクエスト成功!\n"; 68 echo "サーバーからの応答がありました。\n"; 69 // レスポンスが長い場合は一部のみ表示する場合 70 // echo "レスポンスの最初の500文字:\n"; 71 // echo mb_substr($responseContent, 0, 500) . "...\n"; 72} else { 73 echo "リクエスト失敗、または証明書検証に問題が発生しました。\n"; 74 echo "ヒント: `CURLOPT_CAINFO` で指定されたCA証明書ファイル(例: cacert.pem)が\n"; 75 echo " 正しいパスに存在するか確認してください。\n"; 76}
このPHPサンプルコードは、cURL拡張機能を利用して安全なHTTPSリクエストを実行する方法を示しています。特に、CURLOPT_CAINFO定数の使用に焦点を当てています。この定数は、HTTPSサーバーから提示される証明書が本物であるかを検証するために、信頼できる認証局(CA)の証明書バンドルが保存されているファイルのパスを指定する際に用います。サーバー証明書の検証を有効にするCURLOPT_SSL_VERIFYPEERオプションと組み合わせて使うことで、通信相手が信頼できるサーバーであることを確認し、中間者攻撃などのセキュリティリスクから通信を保護します。CURLOPT_CAINFOは定数であるため引数や戻り値は持ちませんが、curl_setopt関数の第二引数として利用され、第三引数にはCA証明書ファイルのパスを示す文字列値を渡します。このパスは実行環境に依存するため、ご自身の環境に合わせて正確に設定する必要があります。もし指定されたパスにファイルが存在しない、またはパスが誤っている場合、証明書検証に失敗し、安全な通信が確立できない可能性がありますのでご注意ください。この設定により、cURLは指定されたCA証明書を用いてサーバーの信頼性を評価する挙動となります。
CURLOPT_CAINFOは、HTTPS通信で接続先のサーバーが信頼できるかを検証するための、CA(認証局)証明書バンドルのパスを指定する設定です。最も重要な注意点は、このCA証明書ファイルが実際に存在する場所への正しいパスを指定することです。このパスはWindowsやLinuxなどOSやPHPの環境によって異なり、サンプルコードのパスはあくまで一例です。ファイルが存在しない、またはパスが間違っている場合、サーバー証明書の検証に失敗し、安全な通信が行えません。本番環境で安全なHTTPS通信を行うためには、CURLOPT_SSL_VERIFYPEERをtrueに設定し、信頼できるCA証明書を用いて必ずサーバーの検証を行うことが不可欠です。
PHP cURL: SSL証明書とバージョン情報を取得する
1<?php 2 3/** 4 * 指定されたURLに対してcURLリクエストを実行し、SSL/TLS接続および証明書に関する情報を取得します。 5 * 6 * この関数は、CURLOPT_SSLVERSION を使用して特定のSSL/TLSプロトコルバージョンを指定し、 7 * CURLOPT_CERTINFO を使用して接続先のSSL証明書情報を取得する例を示します。 8 * 9 * @param string $url 情報を取得する対象のHTTPS URL。 10 * @return array|false cURL実行によって取得された情報(証明書、SSLバージョンなど)の配列、またはエラー時に false。 11 */ 12function getSslConnectionInfo(string $url) 13{ 14 // cURLセッションを初期化 15 $ch = curl_init(); 16 17 if ($ch === false) { 18 // 初期化に失敗した場合 19 echo "エラー: cURLセッションの初期化に失敗しました。\n"; 20 return false; 21 } 22 23 // リクエスト先のURLを設定 24 curl_setopt($ch, CURLOPT_URL, $url); 25 26 // サーバーからの応答を文字列として取得する設定 27 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 28 29 // SSL/TLS証明書の検証を有効にする(本番環境では必須) 30 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 31 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 32 33 // 使用するSSL/TLSプロトコルバージョンを指定します。 34 // ここではTLSv1.2を指定していますが、環境や要件に応じて他のバージョン 35 // (例: CURL_SSLVERSION_TLSv1_3) も利用可能です。 36 // 未指定の場合、cURLは利用可能な最も安全なバージョンを自動選択しようとします。 37 curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 38 39 // 接続先のSSL証明書チェーン情報を取得する設定を有効にします。 40 // この情報(certinfo)は curl_getinfo() を呼び出した際に取得できます。 41 curl_setopt($ch, CURLOPT_CERTINFO, true); 42 43 // cURLリクエストを実行 44 curl_exec($ch); 45 46 // cURL実行中にエラーが発生したか確認 47 if (curl_errno($ch)) { 48 echo 'cURLエラー: ' . curl_error($ch) . "\n"; 49 curl_close($ch); // エラー時はセッションを閉じて終了 50 return false; 51 } 52 53 // cURLリクエスト実行後の様々な情報を取得 54 $info = curl_getinfo($ch); 55 56 // cURLセッションを閉じる 57 curl_close($ch); 58 59 return $info; 60} 61 62// === スクリプト実行部 === 63// サンプルとしてGoogleのURLを使用します。 64$targetUrl = 'https://www.google.com/'; 65echo "URL: {$targetUrl} からSSL/TLS接続情報を取得しています...\n\n"; 66 67$connectionInfo = getSslConnectionInfo($targetUrl); 68 69if ($connectionInfo !== false) { 70 echo "--- 取得したSSL/TLS接続情報 ---\n"; 71 72 // 使用されたSSL/TLSバージョンを表示 (数値で返される) 73 if (isset($connectionInfo['ssl_version'])) { 74 // `ssl_version` はプロトコルの内部数値IDです。例えば 6 は TLSv1.2 を示すことが多いです。 75 echo "使用されたSSL/TLSバージョン (内部ID): " . $connectionInfo['ssl_version'] . "\n"; 76 } else { 77 echo "SSL/TLSバージョン情報が取得できませんでした。\n"; 78 } 79 80 // 取得した証明書情報を表示 81 if (!empty($connectionInfo['certinfo'])) { 82 echo "\n--- 証明書情報 ---\n"; 83 foreach ($connectionInfo['certinfo'] as $cert) { 84 echo " 発行先(Common Name): " . ($cert['Subject']['CN'] ?? 'N/A') . "\n"; 85 echo " 発行元(Issuer Common Name): " . ($cert['Issuer']['CN'] ?? 'N/A') . "\n"; 86 echo " 有効期間開始: " . date('Y-m-d H:i:s', $cert['ValidFrom_time_t']) . "\n"; 87 echo " 有効期間終了: " . date('Y-m-d H:i:s', $cert['ValidTo_time_t']) . "\n"; 88 echo " シリアル番号: " . ($cert['Serial Number'] ?? 'N/A') . "\n"; 89 echo " フィンガープリント (SHA1): " . ($cert['SHA1 Fingerprint'] ?? 'N/A') . "\n"; 90 echo " キータイプ: " . ($cert['Key']['Type'] ?? 'N/A') . "\n"; 91 echo " キー長: " . ($cert['Key']['Bits'] ?? 'N/A') . " bits\n"; 92 echo "---------------------------------\n"; 93 } 94 } else { 95 echo "\n証明書情報 (CURLOPT_CERTINFO) は取得できませんでした。\n"; 96 } 97} else { 98 echo "SSL/TLS接続情報の取得に失敗しました。\n"; 99} 100 101?>
このPHPサンプルコードは、cURL拡張機能を利用して、ウェブサイトのSSL/TLS接続情報とサーバー証明書の詳細を取得する方法を解説しています。
CURLOPT_CERTINFOは、cURLが接続先のウェブサーバーからSSL/TLS証明書チェーンに関する詳細な情報を取得するよう設定するための定数です。この定数をtrueに設定することで、curl_getinfo()関数が返す結果の配列に、証明書の各項目(発行先、発行元、有効期間など)が含まれるようになります。この機能は、ウェブサイトのセキュリティ検証や証明書の状態確認に役立ちます。
また、キーワードにもあるCURLOPT_SSLVERSIONは、SSL/TLS通信で使用するプロトコルのバージョン(例えばCURL_SSLVERSION_TLSv1_2)を明示的に指定するために用いられる定数です。これにより、特定のセキュリティ要件を満たす通信を強制することが可能になります。
サンプルコードでは、まずcurl_init()でcURLセッションを初期化し、curl_setopt()関数で対象のURL、SSL証明書検証の設定、そしてCURLOPT_SSLVERSIONでTLSv1.2を、CURLOPT_CERTINFOで証明書情報の取得を有効にしています。curl_exec()でリクエストを実行後、curl_getinfo()で得られる情報の中から、実際に使用されたSSL/TLSバージョンとCURLOPT_CERTINFOによって取得された証明書情報を抽出し、その内容を画面に表示しています。
getSslConnectionInfo関数は、引数として情報を取得したいURL(string $url)を受け取り、正常に情報が取得できた場合はその詳細を含む配列(array)を、エラーが発生した場合はfalseを戻り値として返します。これは、プログラムからウェブサービスのセキュリティ状態を確認する際に有用な機能です。
SSL/TLSプロトコルバージョンは、CURLOPT_SSLVERSIONで指定できますが、互換性やセキュリティを考慮し、特別な理由がなければcURLの自動選択に任せるのが安全です。通信の安全性を確保するため、CURLOPT_SSL_VERIFYPEERとCURLOPT_SSL_VERIFYHOSTによるSSL証明書検証は本番環境で必ず有効にしてください。開発時でも安易に無効にするとセキュリティリスクが高まります。CURLOPT_CERTINFOは接続先のSSL証明書詳細を取得する設定ですが、通常は不要なオーバーヘッドとなる場合もあります。エラーチェックやcurl_close()によるリソース解放は、堅牢なプログラムに不可欠ですので常に実施してください。curl_getinfo()で返るssl_versionはcURL内部の数値IDですので、表示の際には注意が必要です。