【PHP8.x】CURLINFO_CERTINFO定数の使い方
CURLINFO_CERTINFO定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_CERTINFO定数は、PHPのcURL拡張機能において、SSL/TLS接続時にサーバーから提示された証明書チェーンの詳細情報を取得するために使用される定数です。この定数をcurl_getinfo()関数と組み合わせて利用することで、HTTPSなどの安全な通信を行うウェブサーバーから送られてくるSSL/TLS証明書の各要素をプログラムから詳細に検証することが可能になります。取得される情報は、接続先のサーバー証明書だけでなく、その証明書を発行した認証局の証明書、さらにはルート認証局の証明書までを含む、信頼の連鎖(証明書チェーン)全体です。
それぞれの証明書については、発行者、サブジェクト、有効期間の開始日と終了日、シリアル番号、フィンガープリントといった多岐にわたる情報が、連想配列の形式で提供されます。システムエンジニアを目指す方にとって、この機能は、HTTPS通信のセキュリティ状態を詳細に確認したり、証明書に関する潜在的な問題を検出したりする際に非常に役立ちます。例えば、通信先の証明書が期限切れでないか、意図した認証局によって発行されているかといった検証が可能となり、より堅牢で信頼性の高いネットワークアプリケーションを構築するための基盤となります。
構文(syntax)
1<?php 2echo CURLINFO_CERTINFO;
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
php curl_infoでSSL証明書情報を取得する
1<?php 2 3/** 4 * 指定されたURLのSSL証明書情報を取得し、表示します。 5 * 6 * システムエンジニアを目指す初心者の方へ: 7 * この関数は、PHPのcURL拡張機能を使用してWebサイトにHTTPSで接続し、 8 * そのサイトが使用しているSSL証明書に関する詳細情報を取得する方法を示しています。 9 * 10 * CURLINFO_CERTINFO は、curl_getinfo() 関数の第二引数に指定することで、 11 * 接続先のSSL証明書チェーン(サイトの証明書、中間証明書など)に関する 12 * 詳細な配列情報を取得するための定数です。 13 * これにより、発行者、有効期限、公開鍵情報など、各証明書の詳細を確認できます。 14 * 15 * @param string $url 情報を取得する対象のURL (例: "https://www.example.com") 16 */ 17function display_curl_cert_info(string $url): void 18{ 19 // cURLセッションを初期化します。 20 $ch = curl_init(); 21 22 if ($ch === false) { 23 echo "エラー: cURLセッションの初期化に失敗しました。\n"; 24 return; 25 } 26 27 // cURLオプションを設定します。 28 // 接続先のURLを設定します。 29 curl_setopt($ch, CURLOPT_URL, $url); 30 // 実行結果を文字列として取得するように設定します(ブラウザへの直接出力ではありません)。 31 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 32 // SSL証明書の検証を有効にします(セキュリティ上、本番環境では必須です)。 33 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 34 // ホスト名の検証も有効にします。 35 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 36 37 // cURLリクエストを実行します。 38 $response = curl_exec($ch); 39 40 // リクエストが失敗した場合のエラーハンドリング 41 if ($response === false) { 42 echo "エラー: cURLリクエストの実行に失敗しました。詳細: " . curl_error($ch) . "\n"; 43 curl_close($ch); 44 return; 45 } 46 47 // CURLINFO_CERTINFO を使用してSSL証明書情報を取得します。 48 // この定数を指定することで、curl_getinfo() はSSL証明書チェーンの情報を配列で返します。 49 $cert_info = curl_getinfo($ch, CURLINFO_CERTINFO); 50 51 // 取得した証明書情報を表示します。 52 if (empty($cert_info)) { 53 echo "情報: URL '{$url}' のSSL証明書情報を取得できませんでした。\n"; 54 echo " (HTTPSではないか、証明書情報が利用できない可能性があります。)\n"; 55 } else { 56 echo "URL '{$url}' のSSL証明書情報:\n"; 57 foreach ($cert_info as $index => $cert) { 58 echo "--- 証明書 #" . ($index + 1) . " ---\n"; 59 foreach ($cert as $key => $value) { 60 // 値が配列の場合は、可読性のためJSON形式で表示します。 61 echo " {$key}: " . (is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : $value) . "\n"; 62 } 63 } 64 } 65 66 // cURLセッションを閉じ、リソースを解放します。 67 curl_close($ch); 68} 69 70// サンプルとして、Googleのウェブサイトの証明書情報を取得します。 71// このコードを実行するには、インターネット接続が必要です。 72display_curl_cert_info("https://www.google.com");
PHPのCURLINFO_CERTINFOは、curl_getinfo()関数と組み合わせて使用する定数で、WebサイトのSSL証明書に関する詳細な情報を取得する際に利用されます。この定数自体に引数や戻り値はありませんが、curl_getinfo()関数の第二引数に指定することで、HTTPSで接続したサイトが使用しているSSL証明書チェーン、つまりサイトの証明書や中間証明書といった一連の証明書情報を連想配列形式で取得できます。これにより、各証明書の発行者、有効期限、公開鍵情報など、細かな詳細を確認することが可能です。
提示されたサンプルコードでは、まずcurl_init()でcURLセッションを初期化し、対象のURLや結果の取得方法、SSL検証の有効化などをcurl_setopt()で設定しています。次にcurl_exec()で実際にWebサイトへのリクエストを実行し、その後にcurl_getinfo($ch, CURLINFO_CERTINFO)を呼び出してSSL証明書情報を取得しています。この呼び出しにより、証明書情報は多次元の連想配列として返されるため、コードではこれをループ処理で一つずつ取り出し、内容を整形して表示しています。エラー発生時にはその旨を通知し、最後にcurl_close()でリソースを解放します。このコードは、Webサイトのセキュリティ状態や証明書の詳細を手動で確認したい場合に役立ちます。
PHPのCURL拡張機能がサーバーで有効になっているか事前に確認してください。CURLINFO_CERTINFOはHTTPS接続専用のため、必ずhttps://で始まるURLを指定し、HTTP接続では証明書情報を取得できません。cURL処理はネットワーク状況により失敗しやすいため、curl_init()やcurl_exec()の戻り値を常に確認し、適切なエラーハンドリングを徹底してください。セキュリティ上の理由から、CURLOPT_SSL_VERIFYPEERとCURLOPT_SSL_VERIFYHOSTは本番環境で必ず有効に設定しましょう。
PHP cURLでHTTPコードと証明書情報を取得する
1<?php 2 3/** 4 * 指定されたURLからHTTPステータスコードとSSL証明書情報を取得します。 5 * 6 * この関数は、cURLライブラリを使用してWebリクエストを実行し、 7 * その結果からHTTPステータスコード(CURLINFO_HTTP_CODE)と 8 * SSL証明書情報(CURLINFO_CERTINFO)を抽出します。 9 * 10 * @param string $url 情報を取得するターゲットURL(例: 'https://example.com') 11 * @return array|false 成功した場合はHTTPステータスコードと証明書情報を格納した連想配列、 12 * 失敗した場合はfalseを返します。 13 */ 14function getCurlInfoForUrl(string $url) 15{ 16 // cURLセッションを初期化します。 17 // curl_init()は新しいcURLセッションハンドルを返します。 18 $ch = curl_init(); 19 20 // cURL初期化が失敗した場合は、falseを返します。 21 if ($ch === false) { 22 // エラー処理としてログ出力などを追加することもできます。 23 return false; 24 } 25 26 // cURLオプションを設定します。 27 // CURLOPT_URL: リクエストを送信するURL。 28 curl_setopt($ch, CURLOPT_URL, $url); 29 // CURLOPT_RETURNTRANSFER: curl_exec()が結果を文字列として返すように設定します。 30 // trueにしない場合、結果は直接出力されます。 31 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 32 // CURLOPT_CERTINFO: SSL証明書情報をcurl_getinfo()で取得できるように設定します。 33 // このオプションをtrueに設定すると、CURLINFO_CERTINFOが有効になります。 34 curl_setopt($ch, CURLOPT_CERTINFO, true); 35 36 // cURLセッションを実行し、レスポンスを取得します。 37 $response = curl_exec($ch); 38 39 // cURL実行中にエラーが発生したか確認します。 40 if ($response === false) { 41 // エラーメッセージを取得します。 42 $error = curl_error($ch); 43 // cURLセッションを閉じます。 44 curl_close($ch); 45 // エラーが発生した場合はfalseを返します。 46 return false; 47 } 48 49 // CURLINFO_HTTP_CODE: HTTPステータスコードを取得します(例: 200, 404)。 50 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 51 // CURLINFO_CERTINFO: SSL証明書情報を取得します。 52 // CURLOPT_CERTINFOがtrueの場合、証明書チェーンの情報を配列で返します。 53 $certInfo = curl_getinfo($ch, CURLINFO_CERTINFO); 54 55 // cURLセッションを閉じ、リソースを解放します。 56 curl_close($ch); 57 58 // 取得した情報を連想配列として返します。 59 return [ 60 'http_code' => $httpCode, 61 'cert_info' => $certInfo, 62 // 必要に応じてレスポンスボディも返すことができますが、ここでは主要な情報に絞ります。 63 // 'response_body' => $response, 64 ]; 65} 66 67// --- 関数利用の例 --- 68 69// テスト用のURLを指定します。 70$targetUrl = 'https://www.php.net/'; 71 72// 関数を呼び出して情報を取得します。 73$info = getCurlInfoForUrl($targetUrl); 74 75// 取得結果に応じて処理を行います。 76if ($info !== false) { 77 echo "ターゲットURL: " . $targetUrl . "\n"; 78 echo "HTTPステータスコード: " . $info['http_code'] . "\n"; 79 80 // SSL証明書情報が存在するか確認し、表示します。 81 if (!empty($info['cert_info'])) { 82 echo "SSL証明書情報が取得されました。\n"; 83 // 証明書情報は複雑な配列になるため、ここでは存在を示すに留めます。 84 // 詳細を確認するには print_r($info['cert_info']); を使用してください。 85 echo " (詳細な証明書情報は変数を確認してください)\n"; 86 } else { 87 echo "SSL証明書情報は利用できませんでした。\n"; 88 } 89} else { 90 echo "エラー: " . $targetUrl . " から情報を取得できませんでした。\n"; 91} 92 93?>
このサンプルコードは、PHPのcURL拡張機能を利用して、指定されたURLからHTTPステータスコードとSSL証明書情報を取得する一連の流れを初心者向けに示しています。
中心となるgetCurlInfoForUrl関数では、まずcurl_init()でcURLセッションを開始し、curl_setopt()でリクエストのオプションを設定します。ここでは、リクエスト対象のURL(CURLOPT_URL)や、結果を文字列として受け取る設定(CURLOPT_RETURNTRANSFER)のほか、SSL証明書情報を取得可能にするためのCURLOPT_CERTINFOオプションをtrueに設定しています。
curl_exec()で実際にWebリクエストを実行し、その結果からcurl_getinfo()関数を使って必要な情報を抽出します。この際、CURLINFO_HTTP_CODEを指定することで、WebサーバーからのHTTPステータスコード(例えば「200 OK」や「404 Not Found」など)を取得できます。また、CURLINFO_CERTINFOを指定すると、事前にCURLOPT_CERTINFOを有効にしている場合、アクセスしたWebサイトのSSL/TLS証明書に関する詳細な情報が配列として得られます。エラー処理も適切に行い、最終的にcurl_close()でセッションを閉じ、リソースを解放します。
この関数は引数にターゲットURL(文字列)を受け取り、成功した場合はHTTPステータスコードと証明書情報を含む連想配列を、失敗した場合はfalseを戻り値として返します。これにより、Webサイトの状態監視やセキュリティ関連のチェックなどに活用できます。
このコードでは、CURLINFO_CERTINFOを利用してSSL証明書情報を取得するために、CURLOPT_CERTINFOオプションをtrueに設定することが必須です。この設定を怠ると、証明書情報は取得できませんので注意が必要です。また、curl_initやcurl_execの実行はネットワーク状況などにより失敗する可能性があるため、必ずその戻り値をチェックし、エラー発生時はcurl_error()で詳細を確認するエラーハンドリングを丁寧に行うことが重要です。cURLセッションを使い終えたら、curl_close()を呼び出して必ずリソースを解放し、メモリリークを防ぐようにしましょう。関数の戻り値がfalseとなる失敗ケースも考慮し、常に結果を確認してから後続の処理を行うようにしてください。CURLINFO_HTTP_CODEは、HTTPリクエストの成否を判断する上で非常に基本的な情報となります。