2013-05-31 6 views
5

Okay, nun, das ist das erste Mal, dass ich mit der Verschlüsselung eines Projekts arbeite. Ich verwende meinen Hosting-Provider für SSL, aber ich möchte auch Teile der Datenbank verschlüsseln, die empfindlich sind. Dafür wurde mir gesagt, OpenSSL zu benutzen. Ich teste es auf meinem lokalen Host (WAMP) und habe OpenSSL installiert und die PHP- und Apache-SSL-Mods aktiviert. Okay, also habe ich Tutorials verfolgt und mit mehreren vorgeschlagenen Methoden den öffentlichen Schlüssel generieren und als Datei speichern können. Aus irgendeinem Grund kann ich den privaten Schlüssel nicht generieren. Ich werde zwei Versionen von Code schreiben, die ich versucht habe:OpenSSL wird keine privaten Schlüssel erstellen?

// generate private key 
$privateKey = openssl_pkey_new(array(
    '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; 

?> 

Dies erzeugt eine public.key Datei, sondern bietet mir die Warnungen „openssl_pkey_export_to_file(): nicht Schlüssel aus dem Parameter 1 erhalten können:“ und "openssl_pkey_get_details () erwartet, dass Parameter 1 die Ressource boolean ist. "

Ich habe auch versucht, eine alternative Methode:

$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; 

Dies sollte alles Echo, leider war mein Ergebnis ein leerer privaten Schlüssel, ein feiner öffentlicher Schlüssel, Klartext, und verschlüsselter Text und ein Fehler bei dem Versuch, entschlüsseln: "openssl_private_decrypt(): Schlüsselparameter ist kein gültiger privater Schlüssel"

Offensichtlich habe ich ein Problem mit der Erstellung eines privaten Schlüssels. Ich habe das Internet gründlich durchsucht und konnte es nicht beheben, obwohl ich einfachen Code implementiert habe, der für alle anderen zu funktionieren scheint.

Vielen Dank im Voraus, Elie Zeitouni

+0

Haben Sie den Rückgabewert von Funktionen überprüft? – doptimusprime

Antwort

2

Ich denke, man könnte eine einfachere Zeit mit phpseclib, a pure PHP RSA implementation haben. Das folgende Beispiel erstellt einen 1024-Bit-RSA-privaten/öffentlichen Schlüssel:

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

$rsa = new Crypt_RSA(); 

extract($rsa->createKey()); 

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

Danke! Das hat mein Problem gelöst :) –

2

Ich hatte das gleiche Problem.

Und es ist Windows-Problem !!!

Es wird nicht auf Unix-Basis-Systemen passieren.

Und, wenn Sie wie ich Sie Windows nur für die Entwicklung verwenden, verwenden Sie PuTTYGen, um einen Schlüssel zu generieren, und verwenden Sie es statisch in dev enviroment!

OR

OpenSSL not working on Windows, errors 0x02001003 0x2006D080 0x0E064002

5

Ich weiß, dass es eine Weile gewesen ist und Sie können bereits gelöst es haben, aber ich denke, dass meine Antwort kann für andere Menschen nützlich sein, die das gleiche Problem konfrontiert (wie ich es tat).

Wenn Sie sich also die openssl_pkey_export() Dokumentation ansehen, können Sie feststellen, dass es vier verschiedene Parameter benötigt. Wenn wir uns Ihre zweite Implementierung ansehen, können wir sehen, dass Sie nur drei bereitgestellt haben.

openssl_pkey_export ($ res, $ privKey, NULL);

Dies wäre genauso gut, wenn nur Ihr Server die richtigen Umgebungsvariablen für OPENSSL_CONF hat. Die Verknüpfung mit der Datei openssl.cnf, die in der Datei README-SSL.txt zitiert wird, die mit XAMPP heruntergeladen wird, ist erforderlich, um CSR- und Schlüsselgenerierungsfunktionen von PHP zu verwenden.

Um die CSR- und Schlüsselgenerierungsfunktionen von PHP zu verwenden, müssen Sie eine openssl.cnf-Datei installieren. Zu diesem Zweck haben wir in diesem Ordner neben dieser Readme-Datei eine Beispieldatei eingefügt, die für diesen Zweck verwendet werden kann.

Aus diesem Grund genauso wie für die openssl_pkey_new($config); haben Sie ein assoziatives Array erstellen müssen die Config => ‚/path/to/openssl.cnf‘ enthält. Genau wie folgt aus:

openssl_pkey_export($res, $privKey, NULL, $config); 

Ich mag möchte auch hinzufügen, dass der Weg der openssl.cnf in meinem Fall im Inneren ist:

C: \ xampp \ php \ Extras \ OpenSSL \ openssl.cnf

Hier finden Sie auch eine Datei README-SSL.txt, die eine gute Erklärung zur Konfiguration von OPENSSL bietet.

Ich hoffe, es hilft. :)

3

Banged um meinen Kopf mit diesem auf Windows10 mit Xampp PHP 5.5 zu arbeiten. Letztendlich war Tabones Antwort oben in die richtige Richtung, AUSSER Pfadformat musste nach vorne geschnitten werden!

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

Hoffe, das hilft jemandem.

1

Verwenden Sie: openssl_pkey_export_to_file ($ result, 'privkey.pem', null, $ config);