【PHP8.x】openssl_pkcs12_export()関数の使い方
openssl_pkcs12_export関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
openssl_pkcs12_export関数は、秘密鍵と証明書をPKCS#12形式(一般にPFXファイルとも呼ばれます)にエクスポートする関数です。この関数は、Webサーバーや特定のアプリケーションでSSL/TLS証明書とその秘密鍵をまとめて管理・インポートする際によく利用されます。
具体的には、エクスポートしたい証明書と、それに対応する秘密鍵、そしてPKCS#12形式のデータを保護するためのパスフレーズを受け取ります。オプションとして、追加の証明書チェーンやその他の設定を指定することも可能です。これらの情報をもとに、関数はパスフレーズで暗号化された単一のPKCS#12形式のバイナリデータを生成します。この生成されたデータは、関数の引数として指定された参照渡し$output変数に格納されます。
処理が成功した場合、関数はtrueを返します。もし証明書の形式が不正である、秘密鍵が提供された証明書に対応しない、あるいはその他の問題が発生した場合はfalseを返し、適切なエラー情報が生成されます。この関数を使用することで、PHPプログラムから動的にPKCS#12データを生成し、異なるシステム間で証明書と秘密鍵を安全かつ効率的にやり取りすることが可能になります。パスフレーズはセキュリティ上非常に重要ですので、厳重な管理が必要です。
構文(syntax)
1<?php 2 3$certificate = 'path/to/certificate.pem'; // エクスポートする証明書のファイルパスまたはOpenSSLCertificateオブジェクト 4$privateKey = 'path/to/private_key.pem'; // 証明書に対応する秘密鍵のファイルパスまたはOpenSSLKeyPairオブジェクト 5$pkcs12Data = ''; // エクスポートされたPKCS#12データが格納される変数(参照渡し) 6$passphrase = 'your_strong_passphrase'; // PKCS#12ファイルに設定するパスフレーズ 7$args = []; // オプションの引数(例: ['extracerts' => [...]]) 8 9openssl_pkcs12_export( 10 $certificate, 11 $privateKey, 12 $pkcs12Data, // この変数にエクスポート結果が格納される 13 $passphrase, 14 $args 15); 16 17?>
引数(parameters)
OpenSSLCertificate|string $certificate, &string $output, OpenSSLAsymmetricKey|string $private_key, string $passphrase, array $options = []
- OpenSSLCertificate|string $certificate: PKCS#12 ファイルにエクスポートする証明書を指定します。
OpenSSLCertificateオブジェクトまたは証明書の内容を表す文字列で指定できます。 - string $output: PKCS#12 ファイルの内容が格納される文字列への参照です。
- OpenSSLAsymmetricKey|string $private_key: 証明書に関連付けられた秘密鍵を指定します。
OpenSSLAsymmetricKeyオブジェクトまたは秘密鍵の内容を表す文字列で指定できます。 - string $passphrase: PKCS#12 ファイルを暗号化するためのパスフレーズを指定する文字列です。
- array $options = []: オプションを指定する連想配列です。省略可能です。
戻り値(return)
bool
openssl_pkcs12_export関数は、PKCS#12形式で証明書と秘密鍵をエクスポートできた場合にTRUEを、失敗した場合にFALSEを返します。
サンプルコード
PHP openssl_public_encryptで公開鍵暗号化する
1<?php 2 3/** 4 * OpenSSL 公開鍵暗号化と秘密鍵復号化のサンプルコード 5 * 6 * このスクリプトは、公開鍵暗号方式におけるデータの暗号化と復号化の基本的な流れを 7 * システムエンジニアを目指す初心者にも分かりやすく示すものです。 8 * データは公開鍵で暗号化され、対応する秘密鍵でのみ復号できます。 9 */ 10 11// 1. RSA鍵ペアを生成するための設定 12// セキュリティ要件に応じて、鍵のビット数やアルゴリズムを調整できます。 13$config = [ 14 "digest_alg" => "sha512", // ハッシュアルゴリズム 15 "private_key_bits" => 2048, // 鍵のビット数(推奨は2048以上) 16 "private_key_type" => OPENSSL_KEYTYPE_RSA, // 鍵の種類 17]; 18 19// 新しい秘密鍵リソースを生成します 20$privateKeyResource = openssl_pkey_new($config); 21 22if ($privateKeyResource === false) { 23 echo "エラー: 秘密鍵の生成に失敗しました。\n"; 24 echo openssl_error_string() . "\n"; 25 exit(1); 26} 27 28// 2. 生成された秘密鍵をPEM形式の文字列として取得します 29// この秘密鍵は厳重に管理されるべき情報です。 30$privateKeyPem = ''; 31if (!openssl_pkey_export($privateKeyResource, $privateKeyPem)) { 32 echo "エラー: 秘密鍵のエクスポートに失敗しました。\n"; 33 echo openssl_error_string() . "\n"; 34 exit(1); 35} 36 37// 3. 秘密鍵から対応する公開鍵を抽出します 38// 公開鍵は安全に共有できます。 39$publicKeyDetails = openssl_pkey_get_details($privateKeyResource); 40$publicKeyPem = $publicKeyDetails['key']; 41 42if (empty($publicKeyPem)) { 43 echo "エラー: 公開鍵の抽出に失敗しました。\n"; 44 exit(1); 45} 46 47// 暗号化する平文データ 48$plainText = "このメッセージは公開鍵で暗号化されます。"; 49 50echo "元のテキスト: " . $plainText . "\n\n"; 51 52// 4. 公開鍵を使用してデータを暗号化します 53// 暗号化されたデータは、対応する秘密鍵でしか復号できません。 54$encryptedData = ''; 55// OPENSSL_PKCS1_PADDING は、RSA暗号で一般的に使用されるパディング方式です。 56if (!openssl_public_encrypt($plainText, $encryptedData, $publicKeyPem, OPENSSL_PKCS1_PADDING)) { 57 echo "エラー: データの暗号化に失敗しました。\n"; 58 echo openssl_error_string() . "\n"; 59 exit(1); 60} 61 62// 暗号化されたデータはバイナリ形式のため、表示のためにBase64エンコードします 63echo "暗号化されたデータ (Base64エンコード): " . base64_encode($encryptedData) . "\n\n"; 64 65// 5. 秘密鍵を使用してデータを復号化します 66$decryptedData = ''; 67if (!openssl_private_decrypt($encryptedData, $decryptedData, $privateKeyPem, OPENSSL_PKCS1_PADDING)) { 68 echo "エラー: データの復号化に失敗しました。\n"; 69 echo openssl_error_string() . "\n"; 70 exit(1); 71} 72 73echo "復号化されたテキスト: " . $decryptedData . "\n\n"; 74 75// 6. 復号化が成功したか検証します 76if ($plainText === $decryptedData) { 77 echo "検証成功: 復号化されたデータは元のテキストと一致します。\n"; 78} else { 79 echo "検証失敗: 復号化されたデータは元のテキストと一致しません。\n"; 80} 81 82// 不要になった鍵リソースを解放します (PHPのガベージコレクションが自動で行うこともありますが、明示的に行うのも良い習慣です) 83openssl_pkey_free($privateKeyResource); 84 85?>
PHP 8 の OpenSSL 拡張機能を用いたこのサンプルコードは、公開鍵暗号方式によるデータの安全な暗号化と復号化の基本を示しています。まず、openssl_pkey_new関数で新しい秘密鍵を生成し、openssl_pkey_export関数でその秘密鍵をPEM形式の文字列として取得します。続けて、openssl_pkey_get_details関数を使って秘密鍵から対応する公開鍵を抽出します。
核心となるopenssl_public_encrypt関数は、指定された平文データを公開鍵で暗号化します。この関数は第一引数に暗号化する元のデータ、第二引数に出力先となる参照渡しの変数、第三引数に公開鍵、そして第四引数にパディング方式を指定します。暗号化に成功すると、第二引数の変数に暗号化されたデータが格納され、戻り値としてtrueが返されます。失敗した場合はfalseを返し、エラー情報がOpenSSLのエラーキューに格納されます。
暗号化されたデータは、その後openssl_private_decrypt関数を使用して、先に生成した秘密鍵によって復号化されます。このプロセスにより、公開鍵で暗号化されたデータが対応する秘密鍵でしか読めないという、公開鍵暗号の仕組みが実際に動作していることを確認できます。この技術は、データの機密性を保護するために広く利用されます。
サンプルコードのご利用にあたり、いくつか注意点と補足がございます。
秘密鍵はシステムの心臓部にあたるため、厳重に管理し、絶対に漏洩させてはなりません。実際のシステムでは、秘密鍵をファイルとして保存する際にはパスフレーズで保護し、アクセス制限をかけるなど、厳格なセキュリティ対策を施す必要があります。鍵のビット数(private_key_bits)はセキュリティ強度に直結しますので、2048ビット以上を推奨し、常に最新の推奨事項に従ってください。
RSA公開鍵暗号には一度に暗号化できるデータ長に制限があるため、大きなデータを扱う場合は共通鍵暗号方式との組み合わせ(ハイブリッド暗号)が一般的です。また、OPENSSL_PKCS1_PADDINGなどのパディング方式もセキュリティ上重要ですので、用途に応じた適切な選択が求められます。エラー発生時にはopenssl_error_string()で詳細を確認し、適切に処理する仕組みを構築してください。
PHPでPKCS#12ファイルを作成する
1<?php 2 3/** 4 * このスクリプトは、OpenSSL拡張機能を使用して、秘密鍵と証明書をPKCS#12(P12/PFX)ファイル形式にエクスポートする方法を示します。 5 * PKCS#12ファイルは、通常、秘密鍵と対応する証明書を単一の暗号化されたファイルにバンドルするために使用され、 6 * その内容は指定されたパスフレーズで保護されます。 7 * 8 * システムエンジニアを目指す初心者向けに、以下の手順でPKCS#12ファイルの作成を実演します。 9 * 1. 新しい秘密鍵を生成します。 10 * 2. 証明書署名要求(CSR)を生成します。 11 * 3. 生成した秘密鍵を使用してCSRに自己署名し、証明書を作成します(デモンストレーション用)。 12 * 4. openssl_pkcs12_export 関数を使って、秘密鍵と証明書をPKCS#12形式に結合します。 13 * 5. 生成されたPKCS#12データをファイルに保存します。 14 */ 15 16// 証明書生成のための設定値 17$config = [ 18 "digest_alg" => "sha512", 19 "private_key_bits" => 2048, 20 "private_key_type" => OPENSSL_KEYTYPE_RSA, 21 "days" => 365, // 証明書の有効期間(日) 22]; 23 24// 証明書のDN (Distinguished Name) 情報 25$dn = [ 26 "countryName" => "JP", 27 "stateOrProvinceName" => "Tokyo", 28 "localityName" => "Chiyoda-ku", 29 "organizationName" => "Example Co.", 30 "organizationalUnitName" => "IT Dept", 31 "commonName" => "localhost", // または対象のドメイン名 32 "emailAddress" => "webmaster@example.com", 33]; 34 35// PKCS#12ファイルに設定するパスフレーズ 36// このパスフレーズは、後でPKCS#12ファイルを開く際に必要になります。 37$pkcs12Passphrase = 'mySecureExportPassword123!'; 38$outputFilePath = 'example.p12'; // 出力されるPKCS#12ファイル名 39 40// 1. 新しい秘密鍵を生成します 41echo "秘密鍵を生成中...\n"; 42$privateKey = openssl_pkey_new($config); 43if (!$privateKey) { 44 echo "エラー: 秘密鍵の生成に失敗しました。\n"; 45 exit(1); 46} 47 48// 2. 証明書署名要求 (CSR) を生成します 49echo "CSRを生成中...\n"; 50$csr = openssl_csr_new($dn, $privateKey, $config); 51if (!$csr) { 52 echo "エラー: CSRの生成に失敗しました。\n"; 53 exit(1); 54} 55 56// 3. CSRに自己署名し、証明書を生成します 57// 本番環境では、CSRを認証局 (CA) に送って署名された証明書を受け取りますが、 58// この例ではデモンストレーションのために自己署名証明書を使用します。 59echo "自己署名証明書を生成中...\n"; 60$certificate = openssl_csr_sign($csr, null, $privateKey, $config['days'], $config); 61if (!$certificate) { 62 echo "エラー: 証明書の生成に失敗しました。\n"; 63 exit(1); 64} 65 66// 4. openssl_pkcs12_export を使用して秘密鍵と証明書をPKCS#12形式にエクスポート 67echo "PKCS#12ファイル ('{$outputFilePath}') をエクスポート中...\n"; 68$pkcs12Output = ''; // エクスポートされたPKCS#12データがこの変数に格納されます(参照渡し) 69 70$success = openssl_pkcs12_export($certificate, $pkcs12Output, $privateKey, $pkcs12Passphrase); 71 72if ($success) { 73 // 5. 生成されたPKCS#12データをファイルに保存 74 if (file_put_contents($outputFilePath, $pkcs12Output) !== false) { 75 echo "PKCS#12ファイルが '{$outputFilePath}' に正常にエクスポートされました。\n"; 76 echo "このファイルをインポートする際のパスフレーズ: '{$pkcs12Passphrase}'\n"; 77 } else { 78 echo "エラー: PKCS#12ファイルの保存に失敗しました。\n"; 79 } 80} else { 81 echo "エラー: PKCS#12エクスポートに失敗しました。\n"; 82 // OpenSSLのエラーメッセージを出力(デバッグ用) 83 while ($msg = openssl_error_string()) { 84 echo "OpenSSLエラー: " . $msg . "\n"; 85 } 86} 87 88// OpenSSLリソースはPHPのガベージコレクションによって自動的に解放されますが、 89// 明示的に解放することも可能です (例: openssl_pkey_free($privateKey);)。 90 91?>
openssl_pkcs12_export関数は、PHPのOpenSSL拡張機能の一部で、秘密鍵と対応する証明書をPKCS#12形式(一般的に.p12または.pfxファイル)に結合し、指定されたパスフレーズで保護してエクスポートします。これにより、証明書と秘密鍵を安全に管理し、Webサーバーなどへ簡単にインポートできるようになります。
この関数の引数には、エクスポート対象の$certificate(証明書データ)、エクスポート結果が格納される参照渡しの$output変数、証明書に紐づく$private_key(秘密鍵データ)、そしてPKCS#12ファイルを保護するための$passphraseを指定します。オプションの$options引数で、エクスポートの詳細な設定を追加することも可能です。
関数は、処理が成功した場合はブール値のtrueを、失敗した場合はfalseを戻り値として返します。
提示されたサンプルコードでは、まずOpenSSL関数群を用いて新しい秘密鍵と自己署名証明書を生成しています。次に、生成された証明書、秘密鍵、および設定したパスフレーズをopenssl_pkcs12_export関数に渡し、PKCS#12形式のデータを生成します。最終的に、このデータはファイルに保存され、システムエンジニアがWebサーバーなどで証明書を設定する際の基本的な流れをプログラムで実現する例として役立ちます。
openssl_pkcs12_exportは、証明書と秘密鍵をパスフレーズで保護されたPKCS#12ファイル形式にまとめる関数です。サンプルコードは自己署名証明書で動作しますが、本番環境では認証局(CA)による署名証明書が一般的です。パスフレーズはPKCS#12ファイルのセキュリティを保つ鍵であり、推測されにくい複雑なものを設定してください。このファイルは秘密鍵を含む機密情報のため、厳重な管理と取り扱いに細心の注意が必要です。エクスポート失敗時はopenssl_error_string()でエラー詳細を確認してください。