Openssl get publickey: примеры (PHP)
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 при неудаче.
Короткие примеры использования
$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) {}$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.
// Если файл содержит сам ключ, а не путь к другому файлу
$key = openssl_get_publickey('public_key.pem'); // Может быть прочитано как строка-путьРешение: Для чтения ключа из файла явно использовать file_get_contents() или префикс file://.
Изменения в последних версиях PHP
Тип возвращаемого значения изменен с ресурса (resource) на объект (OpenSSLAsymmetricKey). Функция теперь также принимает объекты OpenSSLAsymmetricKey и OpenSSLCertificate в качестве аргумента и возвращает их без изменений.
Добавлена возможность передавать массив с деталями ключа, полученный от openssl_pkey_get_details().
Расширенные примеры применения
$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$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'];// Генерация пары ключей
$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)
$plaintext = "Секретное сообщение";
$publicKey = openssl_get_publickey($recipientPublicKeyPem);
openssl_public_encrypt($plaintext, $encrypted, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);
$encryptedBase64 = base64_encode($encrypted);
echo "Зашифрованные данные: " . $encryptedBase64;Аналоги в других языках программирования
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())const crypto = require('crypto');
const publicKey = `-----BEGIN PUBLIC KEY-----...`;
const keyObject = crypto.createPublicKey(publicKey);В MySQL функции для работы с асимметричными ключами в основном служат для расшифровки или проверки подписи, а не для извлечения ключевых объектов в стиле PHP.
Основное отличие PHP-функции — простота получения ключевого объекта из строки. В других языках часто требуется явно указывать формат и использовать более многословный API.