Из исходного кода PHP видно, что openssl_pkey_new
вызывает php_openssl_generate_private_key
, который проверяет размер ключа, переданный с помощью private_key_bits
, независимо от типа ключа, и возвращает опубликованную ошибку, если размер меньше MIN_KEY_LENGTH
, который определяется как 384
. Это относится к текущей версии (v 7.4.7) до v 4.0. В отличие от текущей версии, v 4.0 только поддерживает ключи RSA, поэтому можно сделать вывод, что размер ключа 384
бит относится к ключам RSA.
Поскольку E C ключей меньше, чем ключи RSA с сопоставимой безопасностью ( NIST и ECRYPT , Глава 7 , Рекомендуемый размер ключа ), более полезной будет проверка c с указанием типа ключа. Минимальная длина для ключей E C в 384
бит не является разумной. Но и для RSA значение 384
битов слишком мало с сегодняшней точки зрения.
В php_openssl_generate_private_key
также можно увидеть, что во время генерации ключа размер ключа используется только в контексте RSA, DSA и ключи DH, но совсем не в контексте ключей E C, где вместо этого используется имя кривой. Т.е. размер ключа, указанный с помощью private_key_bits
, не требуется для контекста ключей E C (и, вероятно, не предназначен), и поэтому его следует опустить, что также позволяет избежать сообщения об ошибке:
<?php
$config = array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
"curve_name" => "prime256v1"
);
$res = openssl_pkey_new($config);
print_r(openssl_pkey_get_details($res));
?>
For полнота: если размер ключа не указан с помощью private_key_bits
, он инициализируется значением по умолчанию из файла конфигурации OpenSSL, которое составляет 2048
бит для текущей версии. Это значение соответствует текущей рекомендации для RSA ( NIST , Рекомендации по управлению ключами , 2.2.1 Рекомендуемые размеры ключей и алгоритмы ) а также является причиной того, что сообщение об ошибке не запускается в контексте ключей E C.