openssl_pkey_new

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_newГенерирует новый закрытый ключ

Описание

openssl_pkey_new(?array $options = null): OpenSSLAsymmetricKey|false

Функция openssl_pkey_new() создаёт новый закрытый ключ. Пример на этой странице показывает, как получить открытую часть ключа.

Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.

Список параметров

options

Можно точно настроить генерацию ключей (например, указав количество бит или параметров) с помощью параметра options. Параметры могут быть либо специфическими для алгоритма, используемыми для генерации ключей, либо общими параметрами, используемыми также при генерации CSR, если не указано иное. Посмотрите документацию функции openssl_csr_new() для получения дополнительной информации о том, как использовать параметр options для CSR. Среди этих опций для генерации ключей используются только private_key_bits, private_key_type, curve_name и config. Опции, специфичные для алгоритма, используются, если ассоциативный массив содержит один из специфических ключей.

  • Ключ "rsa" для настройки параметров RSA.
    Опции Тип Формат Обязательность Описание
    "n" string двоичное число да modulus
    "e" string двоичное число нет public exponent
    "d" string двоичное число да private exponent
    "p" string двоичное число нет prime 1
    "q" string двоичное число нет prime 2
    "dmp1" string двоичное число нет exponent1, d mod (p-1)
    "dmq1" string двоичное число нет exponent2, d mod (q-1)
    "iqmp" string двоичное число нет coefficient, (inverse of q) mod p
  • Ключ "dsa" для настройки параметров DSA.
    Опции Тип Формат Обязательность Описание
    "p" string двоичное число нет prime number (public)
    "q" string двоичное число нет 160-bit subprime, q | p-1 (public)
    "g" string двоичное число нет generator of subgroup (public)
    "priv_key" string Ключ PEM нет private key x
    "pub_key" string Ключ PEM нет public key y = g^x
  • Ключ "dh" для настройки параметров DH (Diffie–Hellman key exchange).
    Опции Тип Формат Обязательность Описание
    "p" string двоичное число нет prime number (shared)
    "g" string двоичное число нет generator of Z_p (shared)
    "priv_key" string Ключ PEM нет private DH value x
    "pub_key" string Ключ PEM нет public DH value g^x
  • Ключ "ec" для настройки параметров Elliptic curve.
    Опции Тип Формат Обязательность Описание
    "curve_name" string name нет name of curve, see openssl_get_curve_names()
    "p" string двоичное число нет prime of the field for curve over Fp
    "a" string двоичное число нет coofecient a of the curve for Fp: y^2 mod p = x^3 + ax + b mod p
    "b" string двоичное число нет coofecient b of the curve for Fp: y^2 mod p = x^3 + ax + b mod p
    "seed" string двоичное число нет optional random number seed used to generate coefficient b
    "generator" string binary encoded point нет curve generator point
    "g_x" string двоичное число нет curver generator point x coordinat
    "g_y" string двоичное число нет curver generator point y coordinat
    "cofactor" string двоичное число нет curve cofactor
    "order" string двоичное число нет curve order
    "x" string двоичное число нет x coordinate (public)
    "y" string двоичное число нет y coordinate (public)
    "d" string двоичное число нет private key
  • Ключи "x25519", "x448", "ed25519", "ed448" для настройки параметров Curve25519 и Curve448.
    Опции Тип Формат Обязательность Описание
    "priv_key" string Ключ PEM нет Закрытый ключ
    "pub_key" string Ключ PEM нет Открытый ключ

Возвращаемые значения

При успешном выполнении функция возвращает экземпляр класса OpenSSLAsymmetricKey для закрытого ключа или false, если возникла ошибка.

Список изменений

Версия Описание
8.4.0 Добавлена поддержка ключей на основе Curve25519 и Curve448 с добавлением полей x25519, ed25519, x448 и ed448.
8.3.0 Добавлена поддержка создания ключей EC с настраиваемыми параметрами EC. В частности, с введением опций EC: p, a, b, seed, generator, g_x, g_y, cofactor и order.
8.0.0 В случае успешного выполнения функция возвращает экземпляр OpenSSLAsymmetricKey; раньше возвращался ресурс (resource) типа OpenSSL key.
7.1.0 Для параметра options добавили ключ curve_name, чтобы создавать EC-ключи на основе алгоритмов эллиптических кривых.

Примеры

Пример #1 Пример получения открытой части ключа из закрытого ключа

<?php

$private_key
= openssl_pkey_new();

$public_key_pem = openssl_pkey_get_details($private_key)['key'];
echo
$public_key_pem, PHP_EOL;

$public_key = openssl_pkey_get_public($public_key_pem);
var_dump($public_key);

?>

Вывод приведённого примера будет похож на:

// Вывод до PHP 8.0.0; обратите внимание, функция возвращает ресурс
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknBFEherZe74BiRjTFA
hqwZ1SK7brwq7C/afnLXKhRR7jnrpfM0ypC46q8xz5UZswenZakJ7kd5fls+r4Bv
3P8XsKYLTh2m1GiWQhV1g77cNIN4qNWh70PiDO3fB2446o1LBgToQYuRZS5YQRfJ
rVD0ysgtVcCU9tjaey28HlgApOpYFTaaKPj2MBmEYpMC+kG2HhL12GfpHUi2eiXI
dXT2WskWHWvUrmQ7fJIfI92JlDokV62DH/q1oiedLs9OPNb0rL1aAmYdzaVN6XNH
x/o4Lh125v2vAPV9E3fZCDc/HDEUaahpjanMiCQEgEDp5Hr+CRkvERT5/ydN+p08
5wIDAQAB
-----END PUBLIC KEY-----

resource(6) of type (OpenSSL key)

// Вывод с PHP 8.0.0; обратите внимание, функция возвращает объект
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwknBFEherZe74BiRjTFA
hqwZ1SK7brwq7C/afnLXKhRR7jnrpfM0ypC46q8xz5UZswenZakJ7kd5fls+r4Bv
3P8XsKYLTh2m1GiWQhV1g77cNIN4qNWh70PiDO3fB2446o1LBgToQYuRZS5YQRfJ
rVD0ysgtVcCU9tjaey28HlgApOpYFTaaKPj2MBmEYpMC+kG2HhL12GfpHUi2eiXI
dXT2WskWHWvUrmQ7fJIfI92JlDokV62DH/q1oiedLs9OPNb0rL1aAmYdzaVN6XNH
x/o4Lh125v2vAPV9E3fZCDc/HDEUaahpjanMiCQEgEDp5Hr+CRkvERT5/ydN+p08
5wIDAQAB
-----END PUBLIC KEY-----

object(OpenSSLAsymmetricKey)#2 (0) {
}

Пример #2 Создание ключа RSA из параметров

<?php

$nhex
= "BBF82F090682CE9C2338AC2B9DA871F7368D07EED41043A440D6B6F07454F51F" .
"B8DFBAAF035C02AB61EA48CEEB6FCD4876ED520D60E1EC4619719D8A5B8B807F" .
"AFB8E0A3DFC737723EE6B4B7D93A2584EE6A649D060953748834B2454598394E" .
"E0AAB12D7B61A51F527A9A41F6C1687FE2537298CA2A8F5946F8E5FD091DBDCB";

$ehex = "11";
$dhex = "A5DAFC5341FAF289C4B988DB30C1CDF83F31251E0668B42784813801579641B2" .
"9410B3C7998D6BC465745E5C392669D6870DA2C082A939E37FDCB82EC93EDAC9" .
"7FF3AD5950ACCFBC111C76F1A9529444E56AAF68C56C092CD38DC3BEF5D20A93" .
"9926ED4F74A13EDDFBE1A1CECC4894AF9428C2B7B8883FE4463A4BC85B1CB3C1";

$phex = "EECFAE81B1B9B3C908810B10A1B5600199EB9F44AEF4FDA493B81A9E3D84F632" .
"124EF0236E5D1E3B7E28FAE7AA040A2D5B252176459D1F397541BA2A58FB6599";

$qhex = "C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D86" .
"9840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF461503";

$dphex = "11";
$dqhex = "11";
$qinvhex = "b06c4fdabb6301198d265bdbae9423b380f271f73453885093077fcd39e2119f" .
"c98632154f5883b167a967bf402b4e9e2e0f9656e698ea3666edfb25798039f7";

$rsa= openssl_pkey_new([
'rsa' => [
'n' => hex2bin($nhex),
'e' => hex2bin($ehex),
'd' => hex2bin($dhex),
'p' => hex2bin($phex),
'q' => hex2bin($qhex),
'dmp1' => hex2bin($dphex),
'dmq1' => hex2bin($dqhex),
'iqmp' => hex2bin($qinvhex),
],
]);
$details = openssl_pkey_get_details($rsa);
var_dump($details);

?>