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

Руководство по использованию openssl_get_privatekey для работы с закрытыми ключами
Раздел: Шифрование (OpenSSL)
openssl_get_privatekey(OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key, ?string $passphrase = null): OpenSSLAsymmetricKey|false
Функция openssl_get_privatekey в PHP

Функция openssl_get_privatekey используется для получения ресурса или объекта закрытого ключа из строкового представления или файла. Это необходимо для операций цифровой подписи, расшифровки данных и аутентификации в криптографических процессах.

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

Функция принимает два параметра:

  • private_key (string) – Строка, содержащая закрытый ключ в формате PEM, или путь к файлу с ключом.
  • passphrase (string | null) – Парольная фраза для расшифровки ключа, если он защищен. Необязательный аргумент, по умолчанию null.

Функция возвращает ресурс (resource) типа OpenSSL key в PHP 7 или объект OpenSSLAsymmetricKey в PHP 8. При ошибке возвращается false.

Краткие примеры использования
Загрузка ключа из строки без пароля
<?php
$privateKeyPem = "-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2...
-----END PRIVATE KEY-----";
$key = openssl_get_privatekey($privateKeyPem);
var_dump($key);
?>
object(OpenSSLAsymmetricKey)#1 (0) {
}
Загрузка ключа из файла с паролем
<?php
$key = openssl_get_privatekey('file://path/to/key.pem', 'myPassword');
if ($key === false) {
    echo 'Ошибка: ' . openssl_error_string();
}
?>
object(OpenSSLAsymmetricKey)#1 (0) {
}
Неверный ключ
<?php
$key = openssl_get_privatekey('invalid key');
var_dump($key);
?>
bool(false)
Похожие функции в PHP
  • openssl_get_publickey – Получает ресурс открытого ключа. Используется для проверки подписей и шифрования.
  • openssl_pkey_get_private – Псевдоним функции openssl_get_privatekey. Полностью идентична.
  • openssl_pkey_get_details – Возвращает массив с деталями ключа. Часто используется после получения ключа для извлечения параметров.
  • openssl_pkey_new – Генерирует новую пару ключей. Применяется для создания ключей, а не для их загрузки.

Выбор зависит от задачи: для загрузки существующего закрытого ключа применяется openssl_get_privatekey, для генерации нового – openssl_pkey_new.

Типичные ошибки при использовании
Неверный формат ключа
<?php
$key = openssl_get_privatekey('invalid data');
if ($key === false) {
    echo openssl_error_string();
}
?>
error:0909006C:PEM routines:get_name:no start line
Неправильный пароль
<?php
$key = openssl_get_privatekey($encryptedKey, 'wrongPassword');
if ($key === false) {
    echo openssl_error_string();
}
?>
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
Забытый аргумент пароля
<?php
$key = openssl_get_privatekey($encryptedKey); // Пароль не указан
if ($key === false) {
    echo openssl_error_string();
}
?>
error:0909006C:PEM routines:get_name:no start line
Изменения в последних версиях PHP

В PHP 8.0 функция перестала возвращать ресурс (resource). Теперь возвращается объект класса OpenSSLAsymmetricKey. Это изменение является частью общей инициативы по замене ресурсов на объекты.

В PHP 8.2 улучшены сообщения об ошибках, связанных с некорректными паролями или форматами ключей.

Расширенные примеры
Создание подписи данных
Пример php
<?php
$data = "Важные данные для подписи";
$privateKey = openssl_get_privatekey(file_get_contents('private.pem'), 'pass');
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
echo base64_encode($signature);
?>
c2YzU0hQYzVWbWx1YzNOM2FYSmhiV1Z6TDJSdlkzVjBhVzVu...
Расшифровка данных
Пример php
<?php
$encrypted = base64_decode('...'); // Зашифрованные данные
$privateKey = openssl_get_privatekey('file://key.pem');
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo $decrypted;
?>
Исходный текст
Работа с ключами в формате PKCS#12
Пример php
<?php
$pkcs12 = file_get_contents('certificate.p12');
openssl_pkcs12_read($pkcs12, $certs, 'password');
$privateKey = openssl_get_privatekey($certs['pkey']);
var_dump($privateKey !== false);
?>
bool(true)
Получение деталей ключа
Пример php
<?php
$privateKey = openssl_get_privatekey($keyPem);
$details = openssl_pkey_get_details($privateKey);
print_r(['bits' => $details['bits'], 'type' => $details['type']]);
?>
Array
(
    [bits] => 2048
    [type] => 0
)
Аналоги в других языках программирования
Python (cryptography)
from cryptography.hazmat.primitives import serialization
with open("key.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=b'myPassword',
        backend=None
    )
print(private_key)
<cryptography.hazmat.backends.openssl.rsa._RSAPrivateKey object at 0x7f8b2c1b7d30>
JavaScript (Node.js crypto)
const fs = require('fs');
const crypto = require('crypto');
const privateKey = fs.readFileSync('key.pem', 'utf8');
const keyObject = crypto.createPrivateKey({
    key: privateKey,
    passphrase: 'myPassword'
});
console.log(keyObject);
KeyObject { type: 'private' }
MySQL (функции асимметричного шифрования)

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

PHP openssl_get_privatekey function comments

En
Openssl get privatekey Alias of openssl_pkey_get_private