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

作成日: 更新日:

openssl_pkey_get_public関数は、公開鍵リソースを取得する関数です。この関数は、様々な形式で表現された公開鍵から、OpenSSLで使用可能な公開鍵リソースを生成するために使用されます。具体的には、X.509証明書、PEM形式の公開鍵文字列、または既に生成された秘密鍵リソースから公開鍵を抽出することができます。

関数は、公開鍵を表す文字列、ファイルパス、または既存の秘密鍵リソースを引数として受け取ります。引数が文字列またはファイルパスの場合、それはPEM形式でエンコードされた公開鍵であると解釈されます。引数が秘密鍵リソースの場合、対応する公開鍵が抽出されます。

関数が成功した場合、公開鍵リソースが返されます。このリソースは、後続のOpenSSL関数(例えば、データの暗号化や署名の検証)で使用できます。関数が失敗した場合、false が返されます。失敗の原因は、無効な形式の公開鍵が提供されたり、ファイルが存在しない、または読み取り権限がないなどが考えられます。

この関数は、安全な通信やデータ保護を実現するために不可欠な要素である公開鍵暗号方式において、公開鍵を扱う上で重要な役割を果たします。システムエンジニアは、この関数を使用して、証明書や鍵ファイルから公開鍵を読み込み、安全なアプリケーションを構築することができます。特に、HTTPS通信やデジタル署名などの実装においては、この関数の正しい理解と利用が不可欠です。エラー処理を適切に行い、無効な公開鍵が使用されないように注意する必要があります。

基本的な使い方

構文(syntax)

openssl_pkey_get_public(mixed $key): \OpenSSLAsymmetricKey|string|false

引数(parameters)

string|resource|OpenSSLAsymmetricKey $public_key

  • string|resource|OpenSSLAsymmetricKey $public_key: 公開鍵のデータ。文字列、リソース、またはOpenSSLAsymmetricKeyオブジェクトで指定します。

戻り値(return)

OpenSSLAsymmetricKey|false

openssl_pkey_get_public関数は、指定された公開鍵を解析し、それに対応するOpenSSLAsymmetricKeyオブジェクトを返します。鍵の解析に失敗した場合はfalseを返します。

サンプルコード

PHP openssl_pkey_get_publicで公開鍵をロードする

<?php

/**
 * openssl_pkey_get_public 関数の使用例です。
 * PEM形式の公開鍵文字列から OpenSSLAsymmetricKey オブジェクトをロードする方法を示します。
 *
 * @see https://www.php.net/manual/ja/function.openssl-pkey-get-public.php
 */
function exampleOpensslPkeyGetPublic(): void
{
    echo "openssl_pkey_get_public の使用例を開始します。\n";

    // 1. 新しいキーペア(秘密鍵と公開鍵)を生成します。
    //    このステップは、openssl_pkey_get_public に渡す公開鍵のPEM文字列を準備するために行います。
    //    通常は、既存の公開鍵ファイルや文字列を直接使用します。
    $config = [
        "digest_alg"       => "sha512",
        "private_key_bits" => 2048,
        "private_key_type" => OPENSSL_KEYTYPE_RSA,
    ];
    $privateKey = openssl_pkey_new($config);

    if ($privateKey === false) {
        echo "エラー: 秘密鍵の生成に失敗しました。\n";
        return;
    }
    echo "秘密鍵ペアを生成しました。\n";

    // 2. 生成したキーペアから公開鍵のPEM形式文字列を抽出します。
    //    openssl_pkey_get_details() はキーに関する詳細な情報を提供します。
    $details = openssl_pkey_get_details($privateKey);

    if ($details === false || !isset($details['key'])) {
        echo "エラー: 公開鍵の詳細の取得に失敗しました。\n";
        return;
    }
    $publicKeyPem = $details['key'];
    echo "PEM形式の公開鍵を抽出しました。\n";
    // echo "抽出された公開鍵 (PEM):\n" . $publicKeyPem . "\n"; // デバッグ用

    // 3. openssl_pkey_get_public を使用して、PEM形式の公開鍵文字列から
    //    OpenSSLAsymmetricKey オブジェクトをロードします。
    echo "openssl_pkey_get_public を使用して公開鍵をロード中...\n";
    $loadedPublicKey = openssl_pkey_get_public($publicKeyPem);

    if ($loadedPublicKey === false) {
        echo "エラー: openssl_pkey_get_public が公開鍵のロードに失敗しました。\n";
        // OpenSSLのエラーメッセージがあれば表示
        while ($msg = openssl_error_string()) {
            echo "OpenSSL エラー: " . $msg . "\n";
        }
        return;
    }

    echo "公開鍵が OpenSSLAsymmetricKey オブジェクトとして正常にロードされました。\n";

    // ロードされたオブジェクトが OpenSSLAsymmetricKey のインスタンスであることを確認します。
    if ($loadedPublicKey instanceof OpenSSLAsymmetricKey) {
        echo "ロードされたオブジェクトは OpenSSLAsymmetricKey のインスタンスです。\n";

        // ロードされた公開鍵オブジェクトから詳細情報を再取得して確認する例
        $loadedDetails = openssl_pkey_get_details($loadedPublicKey);
        if ($loadedDetails !== false && isset($loadedDetails['bits'])) {
            echo "ロードされたキーのビット数: " . $loadedDetails['bits'] . "\n";
            echo "ロードされたキーのタイプ: " . (
                $loadedDetails['type'] === OPENSSL_KEYTYPE_RSA ? 'RSA' : '不明なタイプ'
            ) . "\n";
        }
    } else {
        echo "エラー: ロードされたオブジェクトは OpenSSLAsymmetricKey のインスタンスではありません。\n";
    }

    echo "\nopenssl_pkey_get_public の使用例を終了します。\n";
    // PHP 8.0 以降では OpenSSLAsymmetricKey オブジェクトはGCによって自動的に解放されます。
}

// 関数の実行
exampleOpensslPkeyGetPublic();

openssl_pkey_get_public関数は、公開鍵の情報をPHPで扱えるOpenSSLAsymmetricKeyオブジェクトに変換するために利用されます。引数$public_keyには、PEM形式の文字列や既存の公開鍵リソースなど、読み込みたい公開鍵のデータを指定します。この関数が成功すると、変換された公開鍵を表すOpenSSLAsymmetricKeyオブジェクトが返され、そのオブジェクトを通じて公開鍵を用いたセキュリティ関連の操作が可能になります。失敗した場合はfalseが返されるため、戻り値の確認は非常に重要です。

サンプルコードでは、まず一時的にキーペアを生成し、そこから抽出したPEM形式の公開鍵文字列をopenssl_pkey_get_publicに渡すことで、公開鍵オブジェクトが正常にロードされる様子を示しています。これにより、外部から受け取った公開鍵のデータをPHPプログラムで安全かつ効率的に利用するための基盤が構築されます。デジタル署名の検証や、公開鍵暗号化の準備などでこのオブジェクトが活用されます。

openssl_pkey_get_public関数は、PEM形式などの公開鍵情報をPHPで利用可能なOpenSSLAsymmetricKeyオブジェクトとしてロードします。サンプルコード冒頭でキーペアを生成している部分は、この関数の引数となる公開鍵のPEM文字列を準備するためのものであり、実際のアプリケーションでは、通常は既存の公開鍵文字列やファイルから直接読み込むことになります。関数が失敗した場合はfalseを返すため、必ず戻り値をチェックし、openssl_error_string()関数で詳細なエラー原因を確認することが非常に重要です。これにより、公開鍵のロードを安全かつ正確に行うことができます。PHP 8.0以降では、ロードされたOpenSSLAsymmetricKeyオブジェクトは自動的にメモリから解放されますので、明示的なリソース解放は不要です。

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