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

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

Функция openssl_pkey_get_private() является частью модуля OpenSSL в PHP и предназначена для получения ресурса (в PHP 8 - объекта OpenSSLAsymmetricKey) закрытого ключа из строки или файла. Она используется при выполнении операций, требующих криптографической подписи, расшифровки данных или аутентификации с помощью закрытого ключа.

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

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

  1. private_key (string) - строка, содержащая ключ в формате PEM, или путь к файлу с ключом.
  2. passphrase (string) - необязательный аргумент, парольная фраза для расшифровки ключа, если он защищен паролем. По умолчанию - пустая строка.
Примеры использования
Чтение ключа из строки
$privateKeyPem = <<<KEY
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6V5A6lUk...
-----END PRIVATE KEY-----
KEY;

$keyResource = openssl_pkey_get_private($privateKeyPem);
var_dump($keyResource);
object(OpenSSLAsymmetricKey)#1 (0) {}
Чтение защищенного ключа из файла
$key = openssl_pkey_get_private('file:///path/to/encrypted.key', 'myPass123');
if ($key === false) {
    echo 'Ошибка: ' . openssl_error_string();
} else {
    echo 'Ключ успешно загружен';
}
Ключ успешно загружен
Похожие функции в PHP

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

Создает новую пару закрытого и открытого ключей. Полезно при генерации ключевых пар программно.

Алиас для openssl_pkey_get_private(). Функции идентичны.

Типичные ошибки
Некорректный формат ключа
$key = openssl_pkey_get_private('invalid_key_string');
if ($key === false) {
    echo openssl_error_string();
}
error:0909006C:PEM routines:get_name:no start line
Неверный пароль
$key = openssl_pkey_get_private($encryptedKey, 'wrong_password');
if ($key === false) {
    echo openssl_error_string();
}
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
Изменения в PHP 8

В PHP 8.0 функция возвращает объект OpenSSLAsymmetricKey вместо ресурса. Старая сигнатура сохранилась, но тип возвращаемого значения изменился. Это часть общей модернизации ресурсов в объекты.

Расширенные примеры
Подпись данных с последующей проверкой
Пример php
$data = "Важные данные для подписи";
$privateKey = openssl_pkey_get_private($privateKeyPem);

// Создание подписи
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$signatureBase64 = base64_encode($signature);

// Получение открытого ключа из закрытого
$publicKey = openssl_pkey_get_details($privateKey)['key'];

// Проверка подписи
$verified = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
echo $verified === 1 ? 'Подпись верна' : 'Ошибка проверки';
Подпись верна
Использование с аппаратными токенами (PKCS#11)
Пример php
$engine = openssl_engine_load('dynamic', 'pkcs11');
$privateKey = openssl_pkey_get_private(
    'pkcs11:model=Token;id=%01',
    'pin123'
);
Работа с ключами в формате PKCS#8
Пример php
$pkcs8Key = "-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhki...\n-----END ENCRYPTED PRIVATE KEY-----";
$key = openssl_pkey_get_private($pkcs8Key, 'strongPassword');
Альтернативы в других языках
Python (cryptography)
from cryptography.hazmat.primitives import serialization

with open("private_key.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=b'passphrase'
    )
JavaScript (Node.js crypto)
const fs = require('fs');
const crypto = require('crypto');

const privateKey = fs.readFileSync('private_key.pem', 'utf8');
const keyObject = crypto.createPrivateKey({
    key: privateKey,
    passphrase: 'myPass123'
});

Openssl pkey get private в MySQL

Прямого аналога нет. Работа с закрытыми ключами обычно выполняется на уровне приложения.

PHP openssl_pkey_get_private function comments

En
Openssl pkey get private Get a private key