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

Примеры и руководство по функции openssl_pkey_new в PHP
Раздел: Шифрование (OpenSSL)
openssl_pkey_new(?array $options = null): OpenSSLAsymmetricKey|false
Функция openssl_pkey_new в PHP

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

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

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

Функция принимает один необязательный аргумент:

  • configargs (array) - массив параметров конфигурации, которые переопределяют настройки из openssl.cnf. Если аргумент не указан, используются параметры по умолчанию.
Ключевые параметры configargs
  • digest_alg - алгоритм хеширования (например, 'sha256').
  • private_key_bits - длина приватного ключа в битах (для RSA).
  • private_key_type - тип ключа (например, OPENSSL_KEYTYPE_RSA, OPENSSL_KEYTYPE_EC).
  • config - путь к альтернативному файлу конфигурации OpenSSL.
  • curve_name - название эллиптической кривой (для EC ключей, например, 'prime256v1').

Функция возвращает ресурс типа OpenSSL key или объект OpenSSLAsymmetricKey в случае успеха, и false при возникновении ошибки.

Короткие примеры использования
Создание ключа RSA с параметрами по умолчанию

Код:

<?php
// Генерация ключа RSA со значениями по умолчанию
$keyResource = openssl_pkey_new();
?>

Результат (тип):

resource(4) of type (OpenSSL key)
Генерация RSA ключа заданной длины

Код:

<?php
$config = array(
    'private_key_bits' => 4096,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
);
$key = openssl_pkey_new($config);
?>

Результат (при выводе деталей):

Объект OpenSSLAsymmetricKey
Создание ключа на эллиптической кривой

Код:

<?php
$config = array(
    'private_key_type' => OPENSSL_KEYTYPE_EC,
    'curve_name' => 'prime256v1',
);
$ecKey = openssl_pkey_new($config);
?>

Результат:

resource(5) of type (OpenSSL key)
Похожие функции в PHP

Извлекает массив с деталями ключа (тип, биты, ключи) из ресурса, созданного openssl_pkey_new(). Используется для получения публичного ключа после генерации.

Экспортирует ключ в строку в формате PEM. Часто применяется вместе с openssl_pkey_new() для сохранения сгенерированного приватного ключа.

openssl_csr_new и openssl_csr_sign

Функции для работы с запросами на подпись сертификатов (CSR). openssl_pkey_new() может создавать ключевую пару, которая затем передается в эти функции для генерации CSR или самоподписанного сертификата.

Выбор функции

openssl_pkey_new() предназначена непосредственно для генерации ключевых пар. Для операций с уже существующими ключами (чтение, экспорт) применяются другие функции модуля OpenSSL.

Типичные ошибки
Отсутствие расширения OpenSSL

Код:

<?php
$key = openssl_pkey_new();
var_dump($key);
?>

Результат при отключенном расширении:

Fatal error: Uncaught Error: Call to undefined function openssl_pkey_new()
Некорректные параметры конфигурации

Код:

<?php
$config = array('private_key_bits' => 'abc');
$key = openssl_pkey_new($config); // Не число
if ($key === false) {
    echo 'Ошибка генерации ключа';
}
?>

Результат:

Ошибка генерации ключа
Попытка использования ресурса как строки

Код:

<?php
$key = openssl_pkey_new();
echo $key; // Прямой вывод ресурса
?>

Результат:

Resource id #4

Для получения содержимого ключа необходимо использовать функции экспорта, такие как openssl_pkey_export().

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

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

Код для проверки:

<?php
$key = openssl_pkey_new();
echo gettype($key) . ' ' . get_class($key); // PHP 8.x
?>

Результат в PHP 8.x:

object OpenSSLAsymmetricKey

В PHP 7.x результат был бы: resource.

Расширенные примеры
Генерация ключа и немедленный экспорт

Код:

Пример php
<?php
$config = array('private_key_bits' => 2048);
$key = openssl_pkey_new($config);
if ($key) {
    openssl_pkey_export($key, $privateKeyPem);
    $keyDetails = openssl_pkey_get_details($key);
    $publicKeyPem = $keyDetails['key'];
    echo 'Приватный ключ (первые 100 символов): ' . substr($privateKeyPem, 0, 100) . '...\n';
    echo 'Публичный ключ (первые 100 символов): ' . substr($publicKeyPem, 0, 100) . '...';
}
?>

Результат:

Приватный ключ (первые 100 символов): -----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDZ...
Публичный ключ (первые 100 символов): -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2...
Создание самоподписанного сертификата

Код:

Пример php
<?php
// 1. Генерация ключа
$key = openssl_pkey_new(array(
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
));

// 2. Создание данных для сертификата
$dn = array(
    'countryName' => 'RU',
    'commonName' => 'Test Certificate',
);

// 3. Генерация CSR
$csr = openssl_csr_new($dn, $key);

// 4. Подпись CSR (создание самоподписанного сертификата)
$x509 = openssl_csr_sign($csr, null, $key, 365);

// 5. Экспорт сертификата
openssl_x509_export($x509, $certPem);
echo substr($certPem, 0, 120) . '...';
?>

Результат:

-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIUV7j8LZJqjB5Q4LvW5pXKbwQ2l9kwDQYJKoZIhvcNAQEL
BQAw...
Использование конкретного файла конфигурации

Код:

Пример php
<?php
$config = array(
    'config' => 'C:/openssl/openssl.cnf', // Указание полного пути
    'digest_alg' => 'sha512',
    'private_key_bits' => 4096,
);
$key = openssl_pkey_new($config);
var_dump($key !== false);
?>

Результат:

bool(true)
Генерация EC ключа и извлечение параметров кривой

Код:

Пример php
<?php
$config = array(
    'private_key_type' => OPENSSL_KEYTYPE_EC,
    'curve_name' => 'secp384r1',
);
$key = openssl_pkey_new($config);
openssl_pkey_export($key, $pem);
$details = openssl_pkey_get_details($key);
echo 'Тип ключа: ' . $details['type'] . '\n';
echo 'Название кривой: ' . ($details['ec']['curve_name'] ?? 'N/A') . '\n';
echo 'Координата X: ' . bin2hex($details['ec']['x']) . '\n';
?>

Результат (пример):

Тип ключа: 3
Название кривой: secp384r1
Координата X: 7b5e7e0c...
Альтернативы в других языках
Python (cryptography)

Код:

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
private_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)
print(private_pem.decode())

Результат:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

Библиотека cryptography предлагает более объектно-ориентированный и явный API по сравнению с процедурным стилем PHP.

JavaScript (Node.js - crypto)

Код:

const crypto = require('crypto');
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 2048,
});
console.log(privateKey.export({type: 'pkcs1', format: 'pem'}));

В Node.js функция generateKeyPairSync сразу возвращает объекты ключей, что отличается от подхода PHP, где требуется дополнительный экспорт.

Openssl pkey new в MySQL

Прямого аналога для генерации ключей в SQL нет. Ключи обычно генерируются на стороне приложения.

PHP openssl_pkey_new function comments

En
Openssl pkey new Generates a new private key