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

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

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

作成日: 更新日:

基本的な使い方

openssl_pkey_export関数は、秘密鍵を文字列としてエクスポートする関数です。この関数を使用することで、OpenSSLで管理されている秘密鍵を、PEM形式などの文字列として取り出すことができます。取り出した秘密鍵は、ファイルへの保存、ネットワークを介した転送、データベースへの格納など、様々な用途に利用可能です。

関数は、秘密鍵のリソースと、エクスポートされた秘密鍵を格納する変数の参照、オプションで暗号化パスフレーズを受け取ります。成功時にはTRUE、失敗時にはFALSEを返します。暗号化パスフレーズを指定すると、秘密鍵はパスフレーズで暗号化された状態でエクスポートされます。パスフレーズを指定しない場合、秘密鍵は暗号化されずにエクスポートされます。

システムエンジニアがこの関数を利用する際は、秘密鍵の取り扱いには細心の注意が必要です。秘密鍵が漏洩すると、セキュリティ上の重大な問題を引き起こす可能性があります。適切なアクセス制御、暗号化、保管方法を検討し、安全なシステム運用を心がけてください。また、パスフレーズを使用する際は、強力なパスフレーズを選択し、安全に管理することが重要です。openssl_pkey_export関数は、秘密鍵を安全にエクスポートするための重要なツールですが、その利用にはセキュリティリスクが伴うことを理解しておく必要があります。

構文(syntax)

1openssl_pkey_export(mixed $key, string &$output, ?string $passphrase = null, array $options = []): bool

引数(parameters)

mixed $key, string &$output, ?string $passphrase = null, ?array $options = null

  • mixed $key: エクスポートする秘密鍵。OpenSSLKey オブジェクト、または openssl_pkey_new()、openssl_symm_encrypt() などの関数によって返されるリソースを指定します。
  • string &$output: エクスポートされた鍵のPEM形式の文字列が格納される出力変数。
  • ?string $passphrase = null: 鍵を暗号化するためのパスフレーズ。指定しない場合はパスフレーズなしでエクスポートされます。
  • ?array $options = null: エクスポートオプションを指定する連想配列。現在、'bypass_encrypt' キーのみがサポートされており、これを true に設定するとパスフレーズが指定されていても暗号化をバイパスします。

戻り値(return)

bool

openssl_pkey_export関数は、指定された秘密鍵の公開鍵部分をPEM形式でファイルにエクスポートすることに成功したかどうかを示すブール値を返します。成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコード

PHP openssl_pkey_exportで秘密鍵をエクスポートする

1<?php
2
3/**
4 * 秘密鍵の生成、PEM文字列からの取得、およびパスフレーズ付きでのエクスポートを行うサンプル関数です。
5 * システムエンジニアを目指す初心者の方にも理解しやすいように、各ステップで何が行われているかをコメントで説明しています。
6 */
7function handlePrivateKeyExport(): void
8{
9    // 1. 新しい秘密鍵と公開鍵のペアを生成します。
10    // openssl_pkey_new() は、新しい鍵ペアを作成し、その秘密鍵を表すリソースを返します。
11    // ここでは、RSAキー、2048ビット長、SHA512ダイジェストアルゴリズムを指定しています。
12    $config = [
13        "digest_alg" => "sha512",
14        "private_key_bits" => 2048,
15        "private_key_type" => OPENSSL_KEYTYPE_RSA,
16    ];
17    $privateKeyResource = openssl_pkey_new($config);
18
19    if ($privateKeyResource === false) {
20        echo "エラー: 新しい秘密鍵ペアの生成に失敗しました。\n";
21        return;
22    }
23    echo "新しい秘密鍵リソースを生成しました。\n";
24
25    // 2. 生成された秘密鍵リソースをPEM形式の文字列としてエクスポートします(パスフレーズなし)。
26    // このエクスポートされた文字列を、後で openssl_pkey_get_private() 関数に渡して使用します。
27    $exportedPemStringNoPass = '';
28    if (!openssl_pkey_export($privateKeyResource, $exportedPemStringNoPass)) {
29        echo "エラー: 秘密鍵リソースからPEM文字列(パスフレーズなし)へのエクスポートに失敗しました。\n";
30        // openssl_error_string() を使用すると、OpenSSLライブラリからの詳細なエラーメッセージを取得できます。
31        while (($msg = openssl_error_string()) !== false) {
32            echo "OpenSSLエラー: " . $msg . "\n";
33        }
34        openssl_free_key($privateKeyResource); // リソースを解放
35        return;
36    }
37    echo "秘密鍵をPEM形式の文字列(パスフレーズなし)としてエクスポートしました。\n";
38    // 通常、秘密鍵の内容は表示しませんが、ここでは学習のためコメントアウトして残します。
39    // echo "--- エクスポートされた秘密鍵 (パスフレーズなし) ---\n" . $exportedPemStringNoPass . "\n\n";
40
41    // 3. キーワードである openssl_pkey_get_private() を使用して、PEM文字列から秘密鍵リソースを再度取得します。
42    // この関数は、ファイルパスまたはPEM形式の文字列から秘密鍵リソースを読み込みます。
43    $reloadedKeyResource = openssl_pkey_get_private($exportedPemStringNoPass);
44
45    if ($reloadedKeyResource === false) {
46        echo "エラー: openssl_pkey_get_private() を使用してPEM文字列から秘密鍵リソースの再読み込みに失敗しました。\n";
47        while (($msg = openssl_error_string()) !== false) {
48            echo "OpenSSLエラー: " . $msg . "\n";
49        }
50        openssl_free_key($privateKeyResource); // 最初の秘密鍵リソースを解放
51        return;
52    }
53    echo "PEM文字列から秘密鍵リソースを再読み込みしました (openssl_pkey_get_private を使用)。\n";
54
55    // 4. openssl_pkey_export() を使用して、再取得した秘密鍵リソースをパスフレーズ付きでエクスポートします。
56    // パスフレーズを追加することで、秘密鍵が不正にアクセスされた場合に保護できます。
57    $passphrase = 'YourVeryStrongPassphrase123!'; // 実際にはより複雑なパスフレーズを使用してください
58    $exportedPemStringWithPass = '';
59
60    if (openssl_pkey_export($reloadedKeyResource, $exportedPemStringWithPass, $passphrase)) {
61        echo "秘密鍵をPEM形式の文字列(パスフレーズ付き)としてエクスポートしました。\n";
62        echo "--- エクスポートされた秘密鍵 (パスフレーズ付き) ---\n";
63        echo $exportedPemStringWithPass . "\n";
64    } else {
65        echo "エラー: 秘密鍵リソースからPEM文字列(パスフレーズ付き)へのエクスポートに失敗しました。\n";
66        while (($msg = openssl_error_string()) !== false) {
67            echo "OpenSSLエラー: " . $msg . "\n";
68        }
69    }
70
71    // 5. 使用した秘密鍵リソースを解放します。
72    // PHPはスクリプト終了時に自動的にリソースを解放しますが、明示的に解放することも良い習慣です。
73    openssl_free_key($privateKeyResource);
74    openssl_free_key($reloadedKeyResource);
75    echo "\n秘密鍵のエクスポート処理が完了しました。\n";
76}
77
78// 関数を実行して、一連の処理を確認します。
79handlePrivateKeyExport();

PHPのopenssl_pkey_export関数は、秘密鍵をPEM形式の文字列としてエクスポートするために使用されます。この関数は、引数として秘密鍵リソース($key)、エクスポート結果を格納する文字列変数(&$output)、オプションとしてパスフレーズ($passphrase)、および追加設定($options)を受け取ります。処理が成功すればtrue、失敗すればfalseが戻り値として返されます。

サンプルコードでは、まずopenssl_pkey_newで新しい秘密鍵ペアを生成し、その秘密鍵リソースを取得しています。次に、この秘密鍵リソースをopenssl_pkey_export関数を使ってパスフレーズなしでPEM形式の文字列にエクスポートします。

その後、エクスポートされたPEM文字列を、関連キーワードであるopenssl_pkey_get_private関数に渡して秘密鍵リソースとして再読み込みしています。これは、ファイルや文字列から秘密鍵を読み込む一般的な方法を示しています。

最後に、再読み込みした秘密鍵リソースをopenssl_pkey_export関数に渡し、今度はセキュリティ保護のためにパスフレーズを指定してPEM形式の文字列としてエクスポートしています。パスフレーズを使用することで、エクスポートされた秘密鍵が不正にアクセスされた場合でも内容が保護されます。このように、openssl_pkey_exportは秘密鍵の保存や受け渡し時に、その形式とセキュリティを管理する上で重要な役割を果たします。

このサンプルコードは、秘密鍵の生成からエクスポート、そして再利用までの一連の流れを示しています。特に注意すべきは、秘密鍵のパスフレーズの扱いです。サンプルコードのパスフレーズは学習用であり、実運用では推測が困難で十分な長さを持つ複雑なものを安全に生成し、決してコード内に直接記述せず、厳重に管理する必要があります。秘密鍵自体も、絶対に他人に漏らしてはいけない非常に重要な情報です。openssl_pkey_export関数は、エクスポートに失敗した場合にfalseを返しますので、必ず戻り値をチェックし、エラー発生時はopenssl_error_string()で詳細な原因を確認する習慣をつけましょう。また、生成した秘密鍵リソースは、使用後にopenssl_free_key()で明示的に解放することが良いプラクティスです。これらの点に留意し、セキュリティを意識したコード作成を心がけてください。

PHP openssl_pkey_exportで公開鍵をPEM形式でエクスポートする

1<?php
2
3// このスクリプトは、OpenSSL拡張機能を使用して、
4// 秘密鍵から公開鍵を抽出し、その公開鍵をPEM形式でエクスポートする手順を示します。
5// システムエンジニアを目指す初心者の方にも理解しやすいよう、各ステップをコメントで説明しています。
6
7// 1. まず、テスト用のRSAキーペアを生成します。
8//    通常、本番環境ではこの部分は一度だけ実行し、生成した秘密鍵を安全に保管します。
9//    'private_key_bits' は鍵のビット数を指定し、セキュリティレベルに関わります(通常2048または4096)。
10//    'private_key_type' は使用する暗号アルゴリズムを指定します(RSAが一般的)。
11$privateKeyResource = openssl_pkey_new([
12    "private_key_bits" => 2048,
13    "private_key_type" => OPENSSL_KEYTYPE_RSA,
14]);
15
16// キーペアの生成に失敗した場合はエラーメッセージを表示して終了します。
17if (!$privateKeyResource) {
18    die("エラー: 秘密鍵の生成に失敗しました。\nOpenSSLエラー: " . openssl_error_string() . "\n");
19}
20
21echo "秘密鍵の生成に成功しました。\n";
22
23// 2. 生成された秘密鍵リソースから公開鍵の詳細情報を取得します。
24//    openssl_pkey_get_details() は、キーリソースに関する詳細な情報(公開鍵部分を含む)を配列で返します。
25$details = openssl_pkey_get_details($privateKeyResource);
26
27// 詳細情報の取得に失敗した場合はエラーメッセージを表示して終了します。
28if (!$details) {
29    die("エラー: 公開鍵の詳細情報の取得に失敗しました。\nOpenSSLエラー: " . openssl_error_string() . "\n");
30}
31
32// 取得した詳細情報から、PEM形式の公開鍵文字列を取り出します。
33$publicKeyString = $details['key'];
34
35echo "公開鍵文字列を秘密鍵から抽出しました。\n";
36
37// 3. 抽出した公開鍵文字列からOpenSSLの公開鍵リソースを取得します。
38//    openssl_pkey_get_public() は、公開鍵の文字列やファイルパスを受け取り、
39//    それをOpenSSLが扱えるリソース形式に変換します。
40//    このステップは、通常、ファイルなどから公開鍵を読み込む際に使用されます。
41$publicKeyResource = openssl_pkey_get_public($publicKeyString);
42
43// 公開鍵リソースの取得に失敗した場合はエラーメッセージを表示して終了します。
44if (!$publicKeyResource) {
45    die("エラー: 公開鍵文字列からリソースへの変換に失敗しました。\nOpenSSLエラー: " . openssl_error_string() . "\n");
46}
47
48echo "公開鍵リソースの取得に成功しました。\n";
49
50// 4. 取得した公開鍵リソースをPEM形式の文字列としてエクスポートします。
51//    openssl_pkey_export() は、キーリソース(秘密鍵または公開鍵)をPEM形式の文字列に変換します。
52//    第一引数にエクスポートしたいキーリソース、第二引数にエクスポート結果を格納する変数を参照渡しで指定します。
53//    公開鍵のエクスポートなので、パスフレーズは不要です。
54$exportedPublicKey = ''; // エクスポートされた公開鍵を格納する変数
55$exportSuccess = openssl_pkey_export($publicKeyResource, $exportedPublicKey);
56
57// エクスポートが成功したかを確認します。
58if ($exportSuccess) {
59    echo "公開鍵のエクスポートに成功しました。\n";
60    echo "--- エクスポートされた公開鍵 (PEM形式) ---\n";
61    echo $exportedPublicKey;
62    echo "-------------------------------------------\n";
63} else {
64    echo "エラー: 公開鍵のエクスポートに失敗しました。\n";
65    // エクスポート失敗時は、openssl_error_string() で詳細なエラーメッセージを取得できます。
66    while ($msg = openssl_error_string()) {
67        echo $msg . "\n";
68    }
69}
70
71// 5. 使用したキーリソースを解放します。
72//    openssl_pkey_free() は、OpenSSLリソースが占有しているメモリを解放します。
73//    スクリプトの終了時に自動的に解放されますが、明示的に行うのが良い習慣です。
74openssl_pkey_free($privateKeyResource);
75openssl_pkey_free($publicKeyResource);
76
77echo "キーリソースを解放しました。\n";
78
79?>

PHPのopenssl_pkey_export関数は、OpenSSLが扱うキーリソース(秘密鍵または公開鍵)を、人間が読みやすいPEM形式の文字列として出力するために使用されます。主に、生成した鍵をファイルに保存したり、他のシステムへ共有したりする際に利用される重要な関数です。

この関数は、最初の引数$keyにエクスポートしたいキーリソースを渡します。第二引数&$outputには、エクスポート結果のPEM形式文字列が格納される変数を参照渡しで指定します。もし秘密鍵をエクスポートする場合には、オプションとして第三引数$passphraseにパスフレーズを設定して鍵を保護できますが、公開鍵をエクスポートする際には通常不要です。第四引数$optionsでは、エクスポート形式に関する追加設定を配列で指定できます。処理が成功した場合はtrueを、失敗した場合はfalseを返します。

サンプルコードでは、openssl_pkey_newで秘密鍵を生成した後、openssl_pkey_get_detailsを使ってその秘密鍵から公開鍵の情報を抽出しています。抽出した公開鍵文字列は、openssl_pkey_get_publicによってOpenSSLが扱える公開鍵リソースに変換され、最終的にこの公開鍵リソースをopenssl_pkey_exportでPEM形式の文字列として出力しています。これにより、暗号化通信に利用する公開鍵を安全に管理し、利用可能な形式で取り扱う基本的な手順を学ぶことができます。

openssl_pkey_export関数は、秘密鍵や公開鍵をPEM形式でエクスポートする際に使用します。秘密鍵のエクスポート時には、セキュリティのため必ず強力なパスフレーズを設定してください。エクスポート結果は、第二引数に指定した変数に参照渡しで格納されますので、事前に変数を準備する必要があります。

このサンプルではopenssl_pkey_get_publicで得た公開鍵リソースを使用していますが、元の秘密鍵リソースもこの関数でエクスポート可能です。openssl_pkey_newなどで取得したキーリソースは、使用後にopenssl_pkey_freeで明示的に解放することが推奨されます。

また、各関数の実行後は必ず戻り値を確認し、失敗した場合はopenssl_error_string()でエラーメッセージを取得して原因を特定することが大切です。本番環境で秘密鍵を扱う場合は、スクリプト内で生成せず、厳重に管理してください。

関連コンテンツ

関連IT用語

関連プログラミング言語