OpenSSL не будет создавать закрытые ключи?

Хорошо, это мой первый опыт работы с шифрованием в проекте. Я использую мой хостинг-провайдер для SSL, но я также хочу зашифровать части чувствительной базы данных. Для этого мне сказали использовать OpenSSL. Я тестирую его на своем localhost (WAMP), и установил OpenSSL и включил мотивы PHP и Apache SSL. Хорошо, поэтому я следил за учебниками и, используя несколько предложенных методов, смог сгенерировать открытый ключ и сохранить его как файл. По какой-то причине я не могу создать секретный ключ. Я отправлю две версии кода, которые я пробовал:

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

Это генерирует файл public.key, но предоставляет мне предупреждения «openssl_pkey_export_to_file (): невозможно получить ключ от параметра 1:» и «openssl_pkey_get_details () ожидает, что параметр 1 будет ресурсом, boolean».

Я также попробовал альтернативный метод:

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

Это должно было отражать все, к сожалению, мой результат был пустым личным ключом, прекрасным открытым ключом, открытым текстом и зашифрованным текстом, а также ошибкой при попытке расшифровки: «openssl_private_decrypt (): ключевой параметр не является допустимым закрытым ключом»

Понятно, что у меня проблема с созданием секретного ключа. Я тщательно искал Интернет и не смог его исправить, хотя я реализовал простой код, который, похоже, работает для всех остальных.

Заранее спасибо, Elie Zeitouni

Solutions Collecting From Web of "OpenSSL не будет создавать закрытые ключи?"

Я думаю, что у вас может быть более легкое время с phpseclib, чистой реализацией PHP RSA . В следующем примере будет создан 1024-разрядный закрытый / открытый ключ RSA:

 <?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); extract($rsa->createKey()); echo $privatekey . '<br/>' . $publickey; ?> в <?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); extract($rsa->createKey()); echo $privatekey . '<br/>' . $publickey; ?> 

Я знаю, что прошло какое-то время, и вы, возможно, уже решили его, но я думаю, что мой ответ может быть полезен другим людям, которые столкнулись с одной и той же проблемой (как и я).

Поэтому, если вы посмотрите на документацию openssl_pkey_export (), вы можете обнаружить, что он принимает четыре разных параметра. Если мы посмотрим на вашу вторую реализацию, мы увидим, что вы предоставили только три.

openssl_pkey_export ($ res, $ privKey, NULL);

Это будет так же хорошо, если только ваш сервер имеет правильные переменные среды для OPENSSL_CONF. Связывание с файлом openssl.cnf, который, как указано в файле README-SSL.txt, загружаемом с помощью XAMPP, требуется для использования функций CSR и генерации ключей из PHP.

Чтобы использовать CSR и функции генерации ключей из PHP, вам нужно будет установить файл openssl.cnf. Мы включили образец файла, который можно использовать для этой цели в этой папке вместе с этим файлом readme.

По этой причине так же, как и для openssl_pkey_new($config); вы должны создать ассоциативный массив, содержащий config => '/path/to/openssl.cnf'. Именно так:

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

Я также хотел бы добавить, что путь openssl.cnf в моем случае находится внутри:

C: \ XAMPP \ PHP \ Extras \ OpenSSL \ openssl.cnf

Здесь вы также сможете найти файл README-SSL.txt, который даст хорошее объяснение того, как настроить OPENSSL.

Надеюсь, поможет. 🙂

Повесил мне голову, чтобы заставить работать на windows10 с xampp php 5.5. Наконец, выяснилось, что ответ табона выше был в правильном направлении. ИСКЛЮЧИТЕЛЬНЫЙ формат пути, который необходимо перерезать!

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

Надеюсь, это поможет кому-то.

У меня такая же проблема.

И это проблема Windows !!!

Это не произойдет в базовых системах Unix.

И, если вы, как я, используете Windows только для разработки, вы используете PuTTYGen для генерации ключа и используете его, статически, в среде разработки!

ИЛИ

OpenSSL не работает в Windows, ошибки 0x02001003 0x2006D080 0x0E064002

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