6
votes

OpenSSL ne créera pas de clés privées?

Ok, eh bien, c'est ma première fois avec le cryptage sur un projet. J'utilise mon fournisseur d'hébergement pour SSL, mais je souhaite également chiffrer des parties de la base de données sensibles. Pour cela, on m'a dit d'utiliser OpenSSL. Je le teste sur mon localhost (WAMP) et j'ai installé OpenSSL et mis sur les mods PHP et Apache SSL. D'accord, alors j'ai suivi des tutoriels et, en utilisant plusieurs méthodes suggérées, j'ai pu générer la clé publique et le stocker comme fichier. Pour une raison quelconque, je ne peux pas sembler générer la clé privée. Je posterai deux versions de code que j'ai essayé: xxx pré>

ceci génère un fichier public.Key, mais me fournit les avertissements "openssl_pkey_export_to_file (): impossible d'obtenir la clé du paramètre 1:" et "openssl_pkey_get_details () s'attend à ce que le paramètre 1 soit une ressource, Boolean." p>

J'ai également essayé une méthode alternative: p>

$config = array(
    "config" => "E:/wamp/bin/apache/apache2.2.22/conf/openssl.cnf",
    "digest_alg" => "sha512",
    "private_key_bits" => 1024,
    "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, NULL);
echo "Private Key: ".$privKey;
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
echo "Public Key: ".$pubKey;
$data = 'plaintext data goes here';
echo "Data: ".$data;
// Encrypt the data to $encrypted using the public key
openssl_public_encrypt($data, $encrypted, $pubKey);
echo "Encrypted: ".$encrypted;
// Decrypt the data using the private key and store the results in $decrypted
openssl_private_decrypt($encrypted, $decrypted, $privKey);

echo "Decrypted: ".$decrypted;


2 commentaires

Avez-vous vérifié la valeur de retour des fonctions?


J'ai récemment eu cette question lors de la mise à jour d'un projet sur PHP 7.3, et il s'est avéré que la taille de la clé est trop petite - moins de 512 bits ne fonctionnerait pas, ce qui entraînait des cas de test utilisant des valeurs plus petites pour échouer avec ce message.


6 Réponses :


3
votes

Je pense que vous pourriez avoir une heure plus facile avec phpseclib, une implémentation pure PHP RSA . L'exemple suivant créera une clé privée / publique RSA de 1024 bits:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();

extract($rsa->createKey());

echo $privatekey . '<br/>' . $publickey;
?>


0 commentaires

2
votes

J'ai eu le même problème.

et c'est le problème de Windows !!!

Cela ne se produira pas sur les systèmes de base UNIX.

Et, si comme moi, vous utilisez Windows uniquement pour le développement, vous utilisez PutTygen pour générer une clé et l'utiliser, statique, dans Dev Enviroment!

ou

OpenSSL ne fonctionne pas sous Windows, erreurs 0x02001003 0x2006D080 0x0e064002


0 commentaires

9
votes

Je sais que cela a été un moment et que vous l'avez peut-être déjà résolu, mais je pense que ma réponse peut être utile pour d'autres personnes qui ont été confrontées au même problème (comme je l'ai fait).

Donc, si vous jetez un coup d'oeil au openssl_pkey_export () documentation Vous pouvez trouver qu'il prend quatre paramètres différents. Si nous examinons votre deuxième implémentation, nous pouvons voir que vous n'avez que trois.

openssl_pkey_export ($ res, $ privankey, null);

Ce serait aussi bien que si seul votre serveur ait les variables d'environnement appropriées pour OpenSSL_CONF. Liaison au fichier openssl.cnf, qui comme indiqué dans le fichier README-SSL.TXT téléchargé avec XAMPP est nécessaire pour utiliser des fonctions de la génération de CSR et de la génération de clés à partir de PHP.

Pour utiliser les fonctions CSR et de génération de clés à partir de PHP, vous devrez installer un fichier openssl.cnf. Nous avons inclus un exemple de fichier qui peut être utilisé à cet effet dans ce dossier à côté de ce fichier README.

Pour cette raison comme vous l'avez fait pour le openssl_pkey_new ($ config); Vous devez créer un tableau associatif contenant la config => '/path/OPENSSL.CNF' . Tout comme ceci: xxx

Je voudrais également ajouter que le chemin d'openssl.cnf dans mon cas est à l'intérieur:

C: \ xampp \ php \ extras \ openssl \ openssl.cnf

à l'intérieur Vous pourrez également trouver un fichier README-SSL.TXT qui donne une bonne explication de la manière de configurer OpenSSL.

espère qu'il aide. :)


0 commentaires

4
votes

a frappé autour de ma tête avec ce que cela fonctionne pour travailler sur Windows10 avec XAMPP PHP 5.5. Enfin, la réponse de Tabone figurée ci-dessus était dans la bonne direction, à l'exception du format de chemin nécessaire pour être avancé!

C:/xampp/php/extras/openssl/openssl.cnf


0 commentaires

1
votes

Utilisation: openssl_pkey_export_to_file ($ Résultat, 'PrivKey.pem', null, $ config);


0 commentaires

0
votes

Ceci a fonctionné pour Wamp / PHP 7.0.4

$privateKey = openssl_pkey_new(array(
'config' => 'C:/wamp/bin/php/php7.0.4/extras/ssl/openssl.cnf',
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
 ));

// write private key to file
openssl_pkey_export_to_file($privateKey, 'private.key');

// generate public key from private key
$publicKey = openssl_pkey_get_details($privateKey);

// write public key to file
file_put_contents('public.key', $publicKey['key']);

// clear key
echo $privateKey;


0 commentaires