PHP 8.4.2 Released!

openssl_pkey_new

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

openssl_pkey_newGénère une nouvelle clé privée

Description

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

openssl_pkey_new() génère une nouvelle clé privée. Comment obtenir le composant publique de la clé est démontré dans un exemple ci-dessous.

Note: Vous devez avoir un fichier openssl.cnf valide et installé pour que cette fonction opère correctement. Voir les notes se trouvant dans la section concernant l'installation pour plus d'informations.

Liste de paramètres

options

Il est possible d'affiner la génération de clés (par exemple, en spécifiant le nombre de bits ou les paramètres) à l'aide du paramètre options. Ces options peuvent soit être des paramètres spécifiques à l'algorithme utilisés pour la génération de clés, soit des options génériques également utilisées pour la génération de CSR si non spécifiées. Consultez openssl_csr_new() pour plus d'informations sur l'utilisation de options pour un CSR. Parmi ces options, seules private_key_bits, private_key_type, curve_name, et config sont utilisées pour la génération de clés. Les options spécifiques à un algorithme sont utilisées si le tableau associatif inclut l'une des clés spécifiques.

  • Clé "rsa" pour définir les paramètres RSA.
    options type format requis description
    "n" string nombre binaire oui modulus
    "e" string nombre binaire non exposant public
    "d" string nombre binaire oui exposant privé
    "p" string nombre binaire non premier 1
    "q" string nombre binaire non premier 2
    "dmp1" string nombre binaire non exponent1, d mod (p-1)
    "dmq1" string nombre binaire non exponent2, d mod (q-1)
    "iqmp" string nombre binaire non coefficient, (inverse de q) mod p
  • Clé "dsa" pour définir les paramètres DSA.
    options type format requis description
    "p" string nombre binaire non nombre premier (public)
    "q" string nombre binaire non 160 bits sous-prime, q | p-1 (public)
    "g" string nombre binaire non générateur du sous-groupe (public)
    "priv_key" string clé PEM non clé privée x
    "pub_key" string clé PEM non clé publique y = g^x
  • Clé "dh" pour les paramètres DH (échange de clés Diffie–Hellman).
    Options Type Format Requis Description
    "p" string nombre binaire non nombre premier (partagé)
    "g" string nombre binaire non générateur de Z_p (partagé)
    "priv_key" string clé PEM non valeur DH privée x
    "pub_key" string clé PEM non valeur DH publique g^x
  • Clé "ec" pour les paramètres de courbe elliptique
    Options Type Format Requis Description
    "curve_name" string nom non nom de la courbe, voir openssl_get_curve_names()
    "p" string nombre binaire non nombre premier du champ pour la courbe sur Fp
    "a" string nombre binaire non coefficient a de la courbe pour Fp : y^2 mod p = x^3 + ax + b mod p
    "b" string nombre binaire non coefficient b de la courbe pour Fp : y^2 mod p = x^3 + ax + b mod p
    "seed" string nombre binaire non nombre aléatoire facultatif utilisé pour générer le coefficient b
    "generator" string point encodé en binaire non point générateur de la courbe
    "g_x" string nombre binaire non coordonnée x du point générateur de la courbe
    "g_y" string nombre binaire non coordonnée y du point générateur de la courbe
    "cofactor" string nombre binaire non cofacteur de la courbe
    "order" string nombre binaire non ordre de la courbe
    "x" string nombre binaire non coordonnée x (publique)
    "y" string nombre binaire non coordonnée y (publique)
    "d" string nombre binaire non clé privée
  • Clés "x25519", "x448", "ed25519", "ed448" pour les paramètres Curve25519 et Curve448.
    Options Type Format Requis Description
    "priv_key" string clé PEM non clé privée
    "pub_key" string clé PEM non clé publique

Valeurs de retour

Retourne une instance de OpenSSLAsymmetricKey en cas de succès, false en cas d'erreur.

Historique

Version Description
8.4.0 Ajout de la prise en charge des clés basées sur Curve25519 et Curve448 avec l'introduction des champs x25519, ed25519, x448, et ed448.
8.3.0 Ajout de la prise en charge de la génération de clés EC avec des paramètres EC personnalisés. Plus précisément, avec l'introduction des options EC : p, a, b, seed, generator, g_x, g_y, cofactor, et order.
8.0.0 En cas de succès, cette fonction retourne désormais une instance de OpenSSLAsymmetricKey ; auparavant, une resource de type OpenSSL key était retournée.
7.1.0 L'option curve_name a été ajouté pour permettre la création de clés EC.

Exemples

Exemple #1 Obtain the public key from a private key

<?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);

?>

Résultat de l'exemple ci-dessus est similaire à :

// Résultat avant PHP 8.0.0 ; notez que la fonction retourne une ressource
-----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)

// Résultat à partir de PHP 8.0.0 ; notez que la fonction retourne un objet
-----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) {
}

Exemple #2 Génération d'une clé RSA à partir de paramètres

<?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);

?>
add a note

User Contributed Notes 7 notes

up
50
dirt at awoms dot com
11 years ago
Working example:

$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey);

// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

$data = 'plaintext data goes here';

// Encrypt the data to $encrypted using the public key
openssl_public_encrypt($data, $encrypted, $pubKey);

// Decrypt the data using the private key and store the results in $decrypted
openssl_private_decrypt($encrypted, $decrypted, $privKey);

echo $decrypted;
up
18
gomez dot alejandre at gmail dot com
6 years ago
Not forget the $configArgs for windows users :D, or the method throws a error with the primary key

//write your configurations :D
$configargs = array(
"config" => "C:/xampp/php/extras/openssl/openssl.cnf",
'private_key_bits'=> 2048,
'default_md' => "sha256",
);

// Create the keypair
$res=openssl_pkey_new($configargs);
// Get private key
openssl_pkey_export($res, $privKey,NULL,$configargs);

and it's for all methods ._ .

a full implementation example here.

https://gist.github.com/DuckHunter213/269a0efd17e709f7f1f177ae7da46ad1

this error take me 3 full days you'r welcome :)
up
13
scott at brynen dot com
9 years ago
If you try and generate a new key using openssl_pkey_new(), and need to specify the size of the key, the key MUST be type-bound to integer

// works
$keysize = 1024;
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// fails
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// works (force to int)
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => (int)$keysize));
up
3
Andrew
3 years ago
It's not documented here but you can also create ECC keys from existing key parameters (e.g. from JWK):

<?php
$key
= openssl_pkey_new([
'ec' => [
'curve_name' => 'prime256v1',
'x' => $someXValue,
'y' => $someYValue,
'd' => $someDValue
]
]);
?>

You can just provide x/y if it's a public key, or you can just provide d if it's a private key.
up
5
Brad
16 years ago
It's easier than all that, if you just want the keys:

<?php
// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privkey);

// Get public key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
?>
up
0
Jan
5 years ago
In case this function returns false, then check your openssl.cnf and make sure that in the [req] section of this file the entry default_bits is not commented out.
up
-1
dodginess at yahoo dot com
7 years ago
If you're using openssl_pkey_new() in conjunction with openssl_csr_new() and want to change the CSR digest algorithm as well as specify a custom key size, the configuration override should be defined once and sent to both functions:

<?php
$config
= array(
'digest_alg' => 'sha1',
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
);

$privkey = openssl_pkey_new($config);

$csr = openssl_csr_new($dn, $privkey, $config);
?>

Although openssl_pkey_new() will accept the 'digest_alg' argument it won't use it, and setting the value has no effect unless you also set this value for openssl_csr_new(). The reason for this is that the $config array is acting as a drop-in replacement for the values found in the openssl.cnf file, so it must contain all of the override values that you need even if the function they're being sent to won't use them.

Also, if you change the 'digest_alg' to something like 'sha256' and still get an MD5 signed CSR check your openssl.cnf file to see whether the digest algorithm you want to use is actually supported.
To Top