【PHP8.x】openssl_csr_get_subject関数の使い方

作成日: 更新日:

openssl_csr_get_subject関数は、X.509証明書署名要求(CSR: Certificate Signing Request)からサブジェクト情報を取得する関数です。CSRとは、WebサイトのSSL/TLS通信を暗号化するために必要なデジタル証明書を認証局(CA)に発行してもらう際に用いられる申請ファイルのことです。この申請ファイルには、証明書の所有者に関する情報、つまり「サブジェクト情報」が含まれています。

サブジェクト情報には、国(C)、都道府県(ST)、市町村(L)、組織名(O)、部署名(OU)、コモンネーム(CN)といった項目があり、証明書が誰(またはどの組織)に属するかを識別するために重要です。openssl_csr_get_subject関数は、引数として指定されたCSRリソースからこれらのサブジェクト情報を抽出し、連想配列の形式で返します。返される配列のキーはサブジェクト情報の識別子(例: "C"、"O"、"CN")となり、その値として実際の情報が格納されます。例えば、CSRの内容が「国: JP、組織名: Example Corp、コモンネーム: www.example.com」であれば、`['C' => 'JP', 'O' => 'Example Corp', 'CN' => 'www.example.com']`のような配列が返されます。

この関数は、主にプログラム上で作成または取得したCSRの内容を検証したり、証明書発行プロセスにおいてCSRが正しい情報を含んでいるかを確認したりする際に利用されます。もし、CSRリソースが無効である場合や、情報の取得に失敗した場合には、この関数はブール値のfalseを返します。システムエンジニアを目指す方にとって、SSL/TLS証明書やPKI(公開鍵基盤)の理解は重要であり、この関数はその実用的な側面を学ぶ上で役立ちます。

基本的な使い方

構文(syntax)

openssl_csr_get_subject(string|OpenSSLCertificateSigningRequest $csr, bool $short_names = true): array|false

引数(parameters)

OpenSSLCertificateSigningRequest|string $csr, bool $short_names = true

  • OpenSSLCertificateSigningRequest|string $csr: 証明書署名要求(CSR)を、OpenSSL証明書オブジェクトまたはCSRを表す文字列で指定します。
  • bool $short_names = true: 属性名を省略名(例: CN, O)で取得するかどうかを指定するブール値。trueの場合は省略名、falseの場合は完全名(例: commonName, organizationName)で取得します。

戻り値(return)

array|false

openssl_csr_get_subject 関数は、CSR (Certificate Signing Request) から取得したサブジェクト情報を連想配列で返します。処理に失敗した場合は false を返します。

サンプルコード

PHP openssl_csr_get_subjectでCSR情報取得

<?php

/**
 * OpenSSL CSRからサブジェクト情報を取得するサンプルコードです。
 *
 * この関数は、証明書署名要求 (CSR) を生成し、
 * そのCSRからサブジェクト(所有者)の情報を取得して表示します。
 * システムエンジニアを目指す初心者の方にも理解しやすいように、
 * 各ステップで何が行われているかをコメントで説明します。
 *
 * @return void
 */
function demonstrateOpensslCsrGetSubject(): void
{
    // 1. 秘密鍵を生成するための設定を定義します。
    // ここで鍵のアルゴリズム、ビット数などを指定します。
    $configArgs = [
        "digest_alg" => "sha256",          // ハッシュアルゴリズム
        "private_key_bits" => 2048,        // 秘密鍵のビット数 (推奨される長さ)
        "private_key_type" => OPENSSL_KEYTYPE_RSA, // 秘密鍵のタイプ (RSAが一般的)
    ];

    // 2. 新しい秘密鍵を生成します。
    // openssl_pkey_new は、SSL証明書で使用する新しい秘密鍵を作成します。
    // 成功すると OpenSSLAsymmetricKey オブジェクトを、失敗すると false を返します。
    $privateKey = openssl_pkey_new($configArgs);

    if ($privateKey === false) {
        echo "エラー: 秘密鍵の生成に失敗しました。\n";
        // OpenSSLのエラー情報を取得して表示
        while ($msg = openssl_error_string()) {
            echo "OpenSSLエラー: " . $msg . "\n";
        }
        return;
    }

    echo "秘密鍵が正常に生成されました。\n";

    // 3. CSR(証明書署名要求)のサブジェクト情報を定義します。
    // この情報は、最終的に発行される証明書に記載されます。
    // 各キーはX.509証明書のフィールドに対応します。
    $dn = [
        "countryName" => "JP",              // 国名 (C)
        "stateOrProvinceName" => "Tokyo",   // 都道府県名 (ST)
        "localityName" => "Shibuya-ku",     // 市町村区名 (L)
        "organizationName" => "Example Corp", // 組織名 (O)
        "organizationalUnitName" => "IT Dept", // 部署名 (OU)
        "commonName" => "www.example.com",  // コモンネーム (CN) - 主にWebサイトのドメイン名
        "emailAddress" => "webmaster@example.com", // 管理者のメールアドレス
    ];

    // 4. 新しいCSRを生成します。
    // openssl_csr_new は、定義したサブジェクト情報と生成した秘密鍵を使ってCSRを作成します。
    // 成功すると OpenSSLCertificateSigningRequest オブジェクトを、失敗すると false を返します。
    $csr = openssl_csr_new($dn, $privateKey, $configArgs);

    if ($csr === false) {
        echo "エラー: CSRの生成に失敗しました。\n";
        while ($msg = openssl_error_string()) {
            echo "OpenSSLエラー: " . $msg . "\n";
        }
        // 秘密鍵オブジェクトはもう不要なので解放
        $privateKey = null;
        return;
    }

    echo "CSRが正常に生成されました。\n";

    // 5. 生成されたCSRオブジェクトからサブジェクト情報を取得します。
    // openssl_csr_get_subject は、CSRオブジェクトからサブジェクトの情報を連想配列で取得します。
    // 第二引数 `$short_names` が `true` の場合 (デフォルト)、"CN", "C" のような短縮名でキーが返されます。
    // `false` の場合、"commonName", "countryName" のような長い名前でキーが返されます。
    $subjectInfo = openssl_csr_get_subject($csr);

    if ($subjectInfo === false) {
        echo "エラー: CSRからサブジェクト情報の取得に失敗しました。\n";
        while ($msg = openssl_error_string()) {
            echo "OpenSSLエラー: " . $msg . "\n";
        }
        // CSRオブジェクトと秘密鍵オブジェクトはもう不要なので解放
        $csr = null;
        $privateKey = null;
        return;
    }

    echo "\n--- CSR サブジェクト情報 ---\n";
    // 取得したサブジェクト情報をループで表示します。
    foreach ($subjectInfo as $key => $value) {
        // 見やすくするためにフォーマットして出力
        echo sprintf("%-20s: %s\n", $key, $value);
    }
    echo "----------------------------\n";

    // 6. 生成したオブジェクトを解放します。
    // PHP 8以降ではガベージコレクションによって自動的に解放されますが、
    // 明示的に `null` を代入することで、メモリの早期解放を促すことができます。
    $privateKey = null; // 秘密鍵オブジェクトを解放
    $csr = null;        // CSRオブジェクトを解放
}

// 関数を実行して、CSRからのサブジェクト情報取得プロセスを開始します。
demonstrateOpensslCsrGetSubject();

?>

openssl_csr_get_subject関数は、PHPのOpenSSL拡張機能の一つで、証明書署名要求(CSR: Certificate Signing Request)に記載されているサブジェクト(所有者)の情報を取得するために使われます。CSRは、SSL/TLS証明書を認証局に申請する際に提出するファイルで、Webサイトのドメイン名や組織名などが含まれます。

サンプルコードでは、まずWebサイトの身元情報となるサブジェクト情報を定義し、秘密鍵とともにCSRを作成しています。この関数は、作成されたOpenSSLCertificateSigningRequestオブジェクト、またはCSRの内容を文字列として最初の引数$csrに渡すことで利用します。

第二引数$short_namesはオプションで、デフォルトはtrueです。trueの場合、国名にはC、コモンネームにはCNといったX.509証明書の短いキー名でサブジェクト情報が連想配列として返されます。falseに設定するとcountryNamecommonNameのような長いキー名で情報が得られます。関数が成功すると、このサブジェクト情報を含む連想配列が返され、失敗した場合はfalseを返します。

この機能は、システムエンジニアがSSL/TLS証明書を扱う際、生成したCSRが意図した通りの情報を含んでいるかをプログラムで確認するのに非常に役立ちます。サンプルコードを実行すると、作成したCSRから取得されたサブジェクト情報が、見やすく整形された形でコンソールに表示されます。

OpenSSL関連関数は失敗時にfalseを返すため、常に戻り値をチェックし、openssl_error_string()で詳細なエラー情報を取得して対処することが重要です。特に秘密鍵は機密情報であり、本番環境での管理や保存には厳重な注意が必要です。サンプルはデモンストレーションであり、実際の運用ではより堅牢なセキュリティ対策が求められます。openssl_csr_get_subject関数の第二引数$short_namesfalseに設定すると、サブジェクト情報のキーが"countryName"のような長い名前で取得できます。デフォルトはtrueで"C"のような短縮名です。利用後は秘密鍵やCSRオブジェクトを明示的にnullにすることで、メモリの早期解放を促すことができます。これらの機能を使用するには、PHPのOpenSSL拡張機能が有効になっているかを確認してください。

【PHP8.x】openssl_csr_get_subject関数の使い方 | いっしー@Webエンジニア