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

【PHP8.x】openssl_csr_export()関数の使い方

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

作成日: 更新日:

基本的な使い方

openssl_csr_export関数は、SSL/TLS証明書の発行に必要な「証明書署名リクエスト(CSR)」の情報を、指定された形式でファイルに出力したり、変数に格納したりする処理を実行する関数です。CSRは、Webサイトのセキュリティを確保するためのSSL/TLS証明書を認証局に申請する際に提出する、公開鍵やドメイン名などの情報を含んだデータです。

この関数は、すでにPHPスクリプト内で生成されたCSRリソース、またはPEM形式でエンコードされたCSR文字列を受け取ります。そして、その内容を外部ファイルとして保存したり、PHPの変数に文字列として格納したりする処理を実行します。主に、プログラム上で生成したCSRデータを、後続の処理(例えば、認証局へのオンライン申請やログへの記録など)で利用するために、標準的な形式で取り出す場合に使用されます。

具体的な使い方としては、最初の引数にエクスポートしたいCSR情報を渡し、次の引数に出力先を指定します。出力先には、CSRの内容を書き込むファイルパスを指定するか、またはCSRの内容が代入される変数を参照渡しで指定できます。オプションとして、人間が読める形式のテキスト情報を出力に含めるかどうかを制御する引数も用意されています。

処理が成功した場合はtrueを返し、何らかの理由でエクスポートに失敗した場合はfalseを返します。この関数を利用することで、セキュアな通信環境を構築する上で不可欠な証明書関連の作業を、PHPプログラム内で効率的に管理することが可能になります。

構文(syntax)

1<?php
2
3$privateKey = openssl_pkey_new();
4
5$csrConfig = [
6    "countryName" => "JP",
7    "stateOrProvinceName" => "Tokyo",
8    "localityName" => "Shibuya-ku",
9    "organizationName" => "Example Corp",
10    "commonName" => "www.example.com",
11    "emailAddress" => "webmaster@example.com"
12];
13
14$csrResource = openssl_csr_new($csrConfig, $privateKey);
15
16$exportedCsr = '';
17openssl_csr_export($csrResource, $exportedCsr);
18
19?>

引数(parameters)

OpenSSLCertificateSigningRequest|string $csr, string &$output, bool $no_text = true

  • OpenSSLCertificateSigningRequest|string $csr: エクスポートするCSR(証明書署名要求)オブジェクトまたはCSRのPEMエンコーディングされた文字列
  • string &$output: エクスポートされたCSRのPEMエンコーディングされた文字列が格納される変数
  • bool $no_text = true: デバッグ情報を含めない場合は true (デフォルト)、含める場合は false

戻り値(return)

bool

openssl_csr_export関数は、CSR(認証局署名要求)をファイルにエクスポートする操作が成功したかどうかを示す真偽値(trueまたはfalse)を返します。

サンプルコード

PHP openssl_csr_exportでCSRをエクスポートする

1<?php
2
3/**
4 * OpenSSL CSR (Certificate Signing Request) を生成し、PEM形式でエクスポートする。
5 *
6 * この関数は、システムエンジニアを目指す初心者向けに、
7 * openssl_csr_new および openssl_csr_export の基本的な使用方法を示します。
8 * OpenSSLの設定ファイルである openssl.cnf との関連性を意識できるよう、
9 * CSR生成時のオプション指定方法を解説します。
10 *
11 * @return string|false 生成され、エクスポートされたCSRのPEM文字列、または失敗時はfalse。
12 */
13function generateAndExportCsr(): string|false
14{
15    // 1. 秘密鍵の生成
16    // CSRには、この証明書と関連付けられる秘密鍵が必要です。
17    // ここでは、RSA 2048bit の鍵を生成します。
18    $privateKey = openssl_pkey_new([
19        'private_key_bits' => 2048,           // 鍵のビット長
20        'private_key_type' => OPENSSL_KEYTYPE_RSA, // 鍵の種類をRSAに指定
21    ]);
22
23    if (!$privateKey) {
24        echo "エラー: 秘密鍵の生成に失敗しました。\n";
25        return false;
26    }
27
28    // 2. CSRのDN (Distinguished Name) 情報の定義
29    // ここで、証明書を申請する組織やWebサイトの情報を設定します。
30    // これらの情報はCSRに含まれ、証明書発行局 (CA) が証明書を発行する際に利用します。
31    $dn = [
32        'countryName'            => 'JP',              // 国名 (例: JP)
33        'stateOrProvinceName'    => 'Tokyo',           // 都道府県名 (例: Tokyo)
34        'localityName'           => 'Chiyoda-ku',      // 市区町村名 (例: Chiyoda-ku)
35        'organizationName'       => 'Example Inc.',    // 組織名 (例: Example Inc.)
36        'organizationalUnitName' => 'IT Department',   // 組織単位名 (例: IT Department)
37        'commonName'             => 'www.example.com', // コモンネーム (Webサイトのドメイン名など)
38        'emailAddress'           => 'admin@example.com', // 担当者のメールアドレス
39    ];
40
41    // 3. CSR生成時の追加設定 (openssl.cnf関連)
42    // 通常、OpenSSLの詳細な設定は openssl.cnf ファイルで行われます。
43    // PHPの openssl_csr_new 関数の $configargs 引数を使うと、
44    // openssl.cnf で定義されている一部の設定項目をPHPコードから上書きできます。
45    // ここでは、署名アルゴリズムと、SANs (Subject Alternative Names) を含む拡張情報を指定しています。
46    $configArgs = [
47        'digest_alg'      => 'sha256', // CSRの署名に使用するハッシュアルゴリズム
48        'x509_extensions' => 'v3_req', // openssl.cnf の [v3_req] セクションに対応する設定を適用
49        'req_extensions'  => 'v3_req', // 同上 (一部の古いOpenSSLバージョンとの互換性のため)
50
51        // openssl.cnf の [v3_req] セクションの内容をPHPで直接定義する例。
52        // これにより、デフォルトの openssl.cnf にこのセクションがなくても、
53        // あるいは異なる内容であっても、PHPで指定した内容が優先されます。
54        // Subject Alternative Names (SANs) は、1つの証明書で複数のドメイン名やIPアドレスを保護するために使用されます。
55        'v3_req' => [
56            'subjectAltName'   => 'DNS:sub.example.com,DNS:www.example.net,IP:192.168.1.1',
57            'basicConstraints' => 'CA:FALSE', // このCSRがCA証明書ではないことを示す
58        ],
59        // 'config' => '/path/to/your/openssl.cnf' のように、特定のopenssl.cnfファイルを明示的に指定することもできます。
60        // ただし、この場合、指定されたファイルが存在しないとエラーになるため、ここでは省略しています。
61    ];
62
63    // 4. CSRの生成
64    // openssl_csr_new関数は、定義したDN情報、生成した秘密鍵、およびオプションの設定を使ってCSRリソースを生成します。
65    $csr = openssl_csr_new($dn, $privateKey, $configArgs);
66
67    if (!$csr) {
68        echo "エラー: CSRの生成に失敗しました。\n";
69        // openssl_error_string() を使うと、OpenSSLライブラリからの詳細なエラーメッセージを取得できます。
70        // 特に設定ミスや不足がある場合に役立ちます。
71        while ($msg = openssl_error_string()) {
72            echo "OpenSSLエラー: " . $msg . "\n";
73        }
74        openssl_pkey_free($privateKey); // 秘密鍵リソースを解放
75        return false;
76    }
77
78    // 5. CSRをPEM形式でエクスポート
79    // openssl_csr_export関数は、生成したCSRリソースをPEM形式の文字列として $exportedCsr 変数に格納します。
80    // 第3引数 ($no_text) をtrueにすると、PEMエンコードされたCSRのみが出力され、
81    // 人間が読める形式のテキストは含まれません。通常、CAに提出するのはPEM形式のみです。
82    $exportedCsr = '';
83    $success = openssl_csr_export($csr, $exportedCsr, true); // $no_text = true でPEMのみ出力
84
85    if (!$success) {
86        echo "エラー: CSRのエクスポートに失敗しました。\n";
87        while ($msg = openssl_error_string()) {
88            echo "OpenSSLエラー: " . $msg . "\n";
89        }
90        openssl_pkey_free($privateKey); // 秘密鍵リソースを解放
91        return false;
92    }
93
94    // 6. 後処理: 秘密鍵リソースの解放
95    // 秘密鍵リソースは機密情報を含むため、メモリを解放するために使用後は破棄することが推奨されます。
96    openssl_pkey_free($privateKey);
97
98    return $exportedCsr;
99}
100
101// --- サンプルコードの実行 ---
102$pemCsr = generateAndExportCsr();
103
104if ($pemCsr) {
105    echo "--- 生成されたCSR (PEM形式) ---\n";
106    echo $pemCsr;
107    echo "-----------------------------\n";
108
109    // 生成されたCSRは、通常、ファイルに保存され、CA (Certificate Authority) に提出されます。
110    // CAは、このCSRと秘密鍵の所有者の身元を確認した後、サーバー証明書を発行します。
111    //
112    // 例: CSRをファイルに保存する場合
113    // file_put_contents('my_server_request.csr', $pemCsr);
114    // echo "CSRを 'my_server_request.csr' に保存しました。\n";
115} else {
116    echo "CSRの生成とエクスポートに失敗しました。\n";
117}

PHPのopenssl_csr_export関数は、OpenSSLのCertificate Signing Request(CSR)リソースを、PEM形式の文字列としてエクスポートする際に使用されます。この関数は、WebサイトのSSL/TLS証明書を申請する際に、証明書発行機関(CA)に提出するCSRデータを最終的に準備するために重要な役割を果たします。

サンプルコードでは、まずopenssl_pkey_newで秘密鍵を生成し、次にopenssl_csr_newで申請情報(Distinguished Name: DN)や、openssl.cnfファイルに記述されるような詳細設定($configArgs)を指定してCSRリソースを作成します。特に$configArgsにより、署名アルゴリズムやSubject Alternative Names (SANs) といった設定をPHPコードから柔軟に定義し、openssl.cnfの内容を上書きできる点が示されています。

openssl_csr_export関数の第1引数$csrには、openssl_csr_newで生成されたCSRリソースを渡します。第2引数&$outputは参照渡しで、関数実行後にエクスポートされたPEM形式のCSR文字列がこの変数に格納されます。第3引数$no_texttrueを設定すると、人間に読みやすいテキスト情報を含まず、PEMエンコードされたデータのみが出力されます。これは、CAに提出する際に推奨される形式です。関数は成功時にtrue、失敗時にfalseを返します。生成されたPEM形式のCSRは、通常ファイルに保存され、CAに送付することでサーバー証明書の発行を申請します。

サンプルコードで生成される秘密鍵は極めて機密性が高いため、本番環境ではセキュアなファイルに保存し、厳重なアクセス制御を必ず設定してください。openssl_csr_new$configArgsでは、openssl.cnfの設定をPHPコードから上書き可能です。特に、複数のドメインに対応するSANs (subjectAltName) の指定方法は重要です。OpenSSL関連関数は失敗時にfalseを返すため、必ず戻り値を確認し、openssl_error_string()で具体的なエラーメッセージを取得してデバッグに役立てましょう。openssl_csr_export$no_text引数をtrueにすると、CAに提出する際に必要なPEM形式のみが出力され、余分な人間可読テキストは含まれません。

PHPでCSRをPEM形式にエクスポートする

1<?php
2
3/**
4 * OpenSSL CSR(証明書署名要求)を生成し、PEM形式でエクスポートする関数。
5 *
6 * この関数は、指定された情報に基づいて新しい秘密鍵とCSRを生成し、
7 * 生成されたCSRをPEM形式の文字列として返します。
8 * システムエンジニアを目指す初心者の方にも理解しやすいよう、
9 * CSR生成とエクスポートの一連の流れをシンプルに示します。
10 *
11 * @param string $commonName 共通名 (例: www.example.com)
12 * @param string $countryName 国名コード (例: JP)
13 * @param string $stateOrProvinceName 都道府県名 (例: Tokyo)
14 * @param string $localityName 市区町村名 (例: Shibuya-ku)
15 * @param string $organizationName 組織名 (例: Example Inc.)
16 * @param string $organizationalUnitName 部署名 (例: IT Department)
17 * @param int $privateKeyBits プライベートキーのビット数 (例: 2048, 4096)
18 * @return string|false 生成されたPEM形式のCSR文字列、または失敗した場合はfalse
19 */
20function generateAndExportCsr(
21    string $commonName,
22    string $countryName,
23    string $stateOrProvinceName,
24    string $localityName,
25    string $organizationName,
26    string $organizationalUnitName,
27    int $privateKeyBits = 2048
28): string|false {
29    // 1. OpenSSLプライベートキーの生成
30    // CSRの署名に使用する秘密鍵を生成します。
31    // private_key_typeにはRSAまたはECを設定できますが、RSAが一般的です。
32    $privateKeyResource = openssl_pkey_new([
33        'private_key_bits' => $privateKeyBits,
34        'private_key_type' => OPENSSL_KEYTYPE_RSA,
35    ]);
36
37    if (!$privateKeyResource) {
38        error_log('プライベートキーの生成に失敗しました: ' . openssl_error_string());
39        return false;
40    }
41
42    // 2. CSRの要求者情報(Subject Name)の設定
43    // 証明書に含まれる所有者情報を定義します。
44    $csrOptions = [
45        'commonName'           => $commonName,
46        'countryName'          => $countryName,
47        'stateOrProvinceName'  => $stateOrProvinceName,
48        'localityName'         => $localityName,
49        'organizationName'     => $organizationName,
50        'organizationalUnitName' => $organizationalUnitName,
51    ];
52
53    // 3. CSR(証明書署名要求)の生成
54    // 上記の要求者情報と秘密鍵を使用してCSRリソースを作成します。
55    // digest_algで署名アルゴリズム(例: sha256)を指定します。
56    $csrResource = openssl_csr_new($csrOptions, $privateKeyResource, [
57        'digest_alg' => 'sha256',
58    ]);
59
60    if (!$csrResource) {
61        error_log('CSRの生成に失敗しました: ' . openssl_error_string());
62        openssl_pkey_free($privateKeyResource); // 秘密鍵リソースを解放
63        return false;
64    }
65
66    // 4. CSRをPEM形式の文字列としてエクスポート
67    // openssl_csr_export関数は、CSRリソースをPEM形式の文字列に変換します。
68    // 第2引数($exportedCsr)は参照渡しで、結果の文字列が格納されます。
69    // 第3引数($no_text)をtrueにすると、追加のテキスト情報(例: Requesting Data:)を含まない、純粋なPEMブロックが出力されます。
70    $exportedCsr = '';
71    $success = openssl_csr_export($csrResource, $exportedCsr, true);
72
73    // 生成したリソースを解放します。
74    openssl_csr_free($csrResource);
75    openssl_pkey_free($privateKeyResource);
76
77    if (!$success) {
78        error_log('CSRのエクスポートに失敗しました: ' . openssl_error_string());
79        return false;
80    }
81
82    return $exportedCsr;
83}
84
85// スクリプトがCLI (コマンドラインインターフェース) から実行された場合のサンプル利用
86if (php_sapi_name() === 'cli') {
87    echo "--- OpenSSL CSR生成とPEM形式エクスポートのサンプル ---\n\n";
88
89    // CSR生成関数を呼び出し、必要な情報を渡します。
90    $exportedCsrString = generateAndExportCsr(
91        'www.example.com',        // 共通名 (CN)
92        'JP',                     // 国名 (C)
93        'Tokyo',                  // 都道府県名 (ST)
94        'Shibuya-ku',             // 市区町村名 (L)
95        'Example Corporation',    // 組織名 (O)
96        'Web Development Dept.',  // 部署名 (OU)
97        2048                      // プライベートキーのビット数
98    );
99
100    if ($exportedCsrString) {
101        echo "CSRの生成とエクスポートに成功しました。\n";
102        echo "以下は生成されたCSR (PEM形式) です:\n";
103        echo "------------------------------------------------------\n";
104        echo $exportedCsrString;
105        echo "------------------------------------------------------\n";
106        echo "\nこのCSRを認証局 (CA) に提出して証明書を要求できます。\n";
107    } else {
108        echo "CSRの生成とエクスポートに失敗しました。エラーログを確認してください。\n";
109    }
110}

openssl_csr_export関数は、PHPで生成または読み込んだCSR(証明書署名要求)を、一般的なPEM形式のテキストデータとして出力するために利用されます。このPEM形式のCSRは、ウェブサイトのSSL/TLS証明書を認証局(CA)に申請する際に提出する重要なファイルとなります。

関数は3つの引数を持ちます。最初の$csrには、openssl_csr_new関数などで作成されたCSRリソース、またはPEM形式のCSR文字列を指定します。2番目の&$outputは参照渡しで、エクスポートされたPEM形式のCSR文字列がこの変数に格納されます。3番目の$no_texttrueを設定すると、出力される文字列に追加情報を含まず、純粋なPEMブロックのみとなります。関数の戻り値は、処理が成功した場合はtrue、失敗した場合はfalseです。

サンプルコードでは、まずopenssl_pkey_newで秘密鍵を、次にopenssl_csr_newでCSRリソースを生成しています。その後、このopenssl_csr_export関数を用いて、生成されたCSRリソースを認証局へ提出できるPEM形式の文字列($exportedCsr)に変換しています。このように、CSRの生成から実際に利用する形式へのエクスポートまでの一連の流れが明確に示されています。

openssl_csr_export関数の第2引数は結果が格納される参照渡しのため、事前に変数を準備して渡す必要があります。この点を誤ると期待通りの結果が得られません。また、CSR生成時に用いる秘密鍵は極めて重要であり、実運用では生成後に安全な方法で保存し、厳重に管理してください。サンプルではファイル保存していませんが、実際のシステムでは考慮が必要です。OpenSSL関連の関数が失敗した際は、必ずopenssl_error_string()でエラー内容を確認し、適切なエラーハンドリングを実装しましょう。生成されたリソースは、使い終えたらopenssl_pkey_freeopenssl_csr_freeで明示的に解放することが重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語