Openssl get publickey: примеры (PHP)

Функция openssl_get_publickey: синтаксис и применение
Раздел: Шифрование (OpenSSL)
openssl_get_publickey(OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key): OpenSSLAsymmetricKey|false

Основы функции openssl_get_publickey

Функция openssl_get_publickey() извлекает или подготавливает публичный ключ для использования в других функциях модуля OpenSSL. Чаще всего функция применяется для проверки цифровых подписей или для шифрования данных.

Аргументы функции

Функция принимает один аргумент, который может быть в одном из следующих форматов:

  • string $public_key — строка с ключом в формате PEM (текстовый, с заголовками -----BEGIN PUBLIC KEY-----) или как содержимое файла с ключом.
  • OpenSSLAsymmetricKey|OpenSSLCertificate|array (начиная с PHP 8.0) — уже существующий ресурс ключа, сертификата или массив с данными ключа.

Функция возвращает объект OpenSSLAsymmetricKey (в PHP 8.0+), представляющий публичный ключ, или false при неудаче.

Короткие примеры использования

Извлечение ключа из строки PEM
$publicKeyPem = "-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAI9rQlzM6W6XVJc3m7wJ2wPv/8fV5tD
...
-----END PUBLIC KEY-----";
$key = openssl_get_publickey($publicKeyPem);
var_dump($key !== false);
bool(true)
Использование пути к файлу
$key = openssl_get_publickey('file://path/to/public_key.pem');
var_dump($key);
object(OpenSSLAsymmetricKey)#1 (0) {}
Передача сертификата X.509
$cert = file_get_contents('certificate.crt');
$pubKey = openssl_get_publickey($cert);
var_dump($pubKey);
object(OpenSSLAsymmetricKey)#1 (0) {}

Похожие функции в PHP

Функция для получения ресурса приватного ключа. Используется при создании подписи или расшифровке данных.

Это псевдоним функции openssl_get_publickey(). Они идентичны.

Возвращает массив с деталями ключа (тип, битность, строковое представление). Применяется после получения ключа для его анализа.

Использование openssl_get_publickey() предпочтительно как первого шага при работе с шифрованием или верификацией подписей, когда ключ представлен в виде строки или файла.

Типичные ошибки и их решение

Некорректный формат ключа
$wrongKey = "invalid key data";
$result = openssl_get_publickey($wrongKey);
var_dump($result);
bool(false)

Решение: Проверять возвращаемое значение и использовать openssl_error_string() для диагностики.

Передача приватного ключа вместо публичного
$privateKey = "-----BEGIN PRIVATE KEY-----...";
$key = openssl_get_publickey($privateKey);
var_dump($key);
bool(false) // или ошибка в зависимости от версии PHP

Решение: Убедиться, что передается именно публичный ключ в корректном формате PEM.

Забытый префикс file:// для файлов
// Если файл содержит сам ключ, а не путь к другому файлу
$key = openssl_get_publickey('public_key.pem'); // Может быть прочитано как строка-путь

Решение: Для чтения ключа из файла явно использовать file_get_contents() или префикс file://.

Изменения в последних версиях PHP

PHP 8.0

Тип возвращаемого значения изменен с ресурса (resource) на объект (OpenSSLAsymmetricKey). Функция теперь также принимает объекты OpenSSLAsymmetricKey и OpenSSLCertificate в качестве аргумента и возвращает их без изменений.

PHP 7.2

Добавлена возможность передавать массив с деталями ключа, полученный от openssl_pkey_get_details().

Расширенные примеры применения

Проверка подписи данных
Пример php
$data = "Важные данные для проверки";
$signature = base64_decode($receivedSignatureBase64);
$publicKey = openssl_get_publickey($pemKey);
$verify = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($verify === 1) {
    echo "Подпись верна";
} elseif ($verify === 0) {
    echo "Подпись неверна";
} else {
    echo "Ошибка проверки";
}
openssl_free_key($publicKey); // В PHP < 8.0
Извлечение публичного ключа из сертификата и вывод его деталей
Пример php
$cert = file_get_contents('https://example.com/cert.pem');
$pubKey = openssl_get_publickey($cert);
$details = openssl_pkey_get_details($pubKey);
echo "Тип ключа: " . $details['type'] . "\n";
echo "Битность: " . $details['bits'] . "\n";
echo "Ключ в формате PEM:\n" . $details['key'];
Использование с массивом деталей ключа
Пример php
// Генерация пары ключей
$config = array("private_key_bits" => 2048);
$keyPair = openssl_pkey_new($config);
$details = openssl_pkey_get_details($keyPair);
// Передача массива с ключом обратно в openssl_get_publickey
$pubKeyFromArray = openssl_get_publickey($details);
var_dump($pubKeyFromArray instanceof OpenSSLAsymmetricKey);
bool(true)
Шифрование данных для одного получателя
Пример php
$plaintext = "Секретное сообщение";
$publicKey = openssl_get_publickey($recipientPublicKeyPem);
openssl_public_encrypt($plaintext, $encrypted, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);
$encryptedBase64 = base64_encode($encrypted);
echo "Зашифрованные данные: " . $encryptedBase64;

Аналоги в других языках программирования

Python (cryptography)
from cryptography.hazmat.primitives import serialization
with open("public_key.pem", "rb") as key_file:
    public_key = serialization.load_pem_public_key(key_file.read())
JavaScript (Node.js - crypto)
const crypto = require('crypto');
const publicKey = `-----BEGIN PUBLIC KEY-----...`;
const keyObject = crypto.createPublicKey(publicKey);
MySQL (ASYMMETRIC_DERIVE)

В MySQL функции для работы с асимметричными ключами в основном служат для расшифровки или проверки подписи, а не для извлечения ключевых объектов в стиле PHP.

Основное отличие PHP-функции — простота получения ключевого объекта из строки. В других языках часто требуется явно указывать формат и использовать более многословный API.

PHP openssl_get_publickey function comments

En
Openssl get publickey Alias of openssl_pkey_get_public