Openssl pkey new: примеры (PHP)
openssl_pkey_new(?array $options = null): OpenSSLAsymmetricKey|falseФункция openssl_pkey_new() генерирует новую приватную и соответствующую ей публичную часть ключевой пары (приватный ключ). Она применяется для создания криптографических ключей, используемых в алгоритмах шифрования, цифровых подписей и обмена ключами.
Использование функции актуально при необходимости программной генерации ключей для протоколов TLS, подписи данных, шифрования информации или создания сертификатов.
Функция принимает один необязательный аргумент:
- configargs (array) - массив параметров конфигурации, которые переопределяют настройки из openssl.cnf. Если аргумент не указан, используются параметры по умолчанию.
- 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 при возникновении ошибки.
Код:
<?php
// Генерация ключа RSA со значениями по умолчанию
$keyResource = openssl_pkey_new();
?>Результат (тип):
resource(4) of type (OpenSSL key)
Код:
<?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)
Извлекает массив с деталями ключа (тип, биты, ключи) из ресурса, созданного openssl_pkey_new(). Используется для получения публичного ключа после генерации.
Экспортирует ключ в строку в формате PEM. Часто применяется вместе с openssl_pkey_new() для сохранения сгенерированного приватного ключа.
Функции для работы с запросами на подпись сертификатов (CSR). openssl_pkey_new() может создавать ключевую пару, которая затем передается в эти функции для генерации CSR или самоподписанного сертификата.
openssl_pkey_new() предназначена непосредственно для генерации ключевых пар. Для операций с уже существующими ключами (чтение, экспорт) применяются другие функции модуля 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().
Тип возвращаемого значения изменен с ресурса (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
$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
// 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
$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)
Код:
<?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...
Код:
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.
Код:
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 нет. Ключи обычно генерируются на стороне приложения.