If you want to change the default private key size (1024) too something else you can use the following code:
<?php
$config = array('private_key_bits' => 512);
$privKey = openssl_pkey_new($config);
?>
Mind though that the minimum number of bits is 384. Any lower will trigger an error.
openssl_pkey_new
(PHP 4 >= 4.2.0, PHP 5)
openssl_pkey_new — Génère une nouvelle clé privée
Description
$configargs
] )openssl_pkey_new() génère une nouvelle paire de clés, une privée et une publique. La partie publique en est accessible via la fonction openssl_pkey_get_public().
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
-
configargs -
Vous pouvez calibrer la génération de la clé (comme le nombre de bits) en utilisant le paramètre
configargs. Voir la fonction openssl_csr_new() pour plus de détails surconfigargs.
Valeurs de retour
Retourne un identifiant de ressource pour la pkey en cas de succès, FALSE
sinon.
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"];
?>
As you probably found, getting the public key is not as direct as you might think with this documentation.
You can easily get into messages like:
Warning: openssl_pkey_get_public(): Don't know how to get public key from this private key (the documentation lied) in D:\www\keys.php on line 4
The correct steps to get the whole thing seem to be these:
<?
$dn = array("countryName" => 'XX', "stateOrProvinceName" => 'State', "localityName" => 'SomewhereCity', "organizationName" => 'MySelf', "organizationalUnitName" => 'Whatever', "commonName" => 'mySelf', "emailAddress" => 'user@domain.com');
$privkeypass = '1234';
$numberofdays = 365;
$privkey = openssl_pkey_new();
$csr = openssl_csr_new($dn, $privkey);
$sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays);
openssl_x509_export($sscert, $publickey);
openssl_pkey_export($privkey, $privatekey, $privkeypass);
openssl_csr_export($csr, $csrStr);
echo $privatekey; // Will hold the exported PriKey
echo $publickey; // Will hold the exported PubKey
echo $csrStr; // Will hold the exported Certificate
?>
Now all you need to do is to make some research on each individual function.
