(Этот вопрос был первоначально отправлен на ServerFault – я удалил его там и переместил его сюда.)
У меня есть машина разработки под управлением PHP 5.3.5 и производственная машина с PHP 5.3.8.
Следующий код запускается на машине разработки:
<?php $key = "-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0x+2RiQ+LCZNAUcl/Ecf1NrTr lhjOiHaVC+w/y+UJevqVcDstD22OJGwT13B9T47OuQG9BmzcZQYLcShUMhVD/Owu 9+8PcK51EnBd0lym6+z/WixpnqfQonyKiqq5ytmYKUlUv39J8QQUI2geyvY9VpWS wyNcFUs7wPl2zsLCPQIDAQAB -----END PUBLIC KEY-----"; $data = "Hello, world!"; $key1 = openssl_get_publickey($key); print_r ($key1); echo "<p>"; $res = openssl_public_encrypt($data, $encrypted_data, $key1, OPENSSL_PKCS1_PADDING); echo base64_encode($encrypted_data);
На моей машине разработки этот код выводит ресурс и закодированную строку. Я бы скопировал его здесь, но, конечно, он меняется каждый раз. На производственной машине этот код создает номер ресурса и следующие ошибки PHP:
PHP Warning: openssl_public_encrypt(): Don't know how to get public key from this private key in C:\xxx\test.php on line 15 PHP Warning: openssl_public_encrypt(): key parameter is not a valid public key in C:\xxx\test.php on line 15
К сожалению, установка старой версии PHP на производственной машине в настоящий момент не является опцией из-за других приложений, которые работают на ней, что требует минимум 5.3.8.
Помогло бы мне, если бы я обновился до 5.4.x?
Я знаю, что версия OpenSSL на 5.3.5 равна 0.9.8, тогда как версия 5.3.8 равна 1.0.0. Я предполагаю, что там может быть проблема. Есть ли способ обойти это?
Я попытался найти как можно больше с сайта OpenSSL.org, и отладчик ошибок PHP, но я не знаю, что я ищу.
С Уважением,
Филипп
Согласно этому сообщению , проблема связана с различными версиями OpenSSL Apache и PHP в установке XAMPP / Windows. У меня была аналогичная проблема с openssl_verify. Я решил это, используя ту же версию OpenSSL для Apache и PHP (заменяя библиотеки DLL). Вот ссылка на решение .
«Я нашел решение проблемы, кажется, что есть два неправильных файла в / apache / bin / в установке по умолчанию 1.7.7, которые необходимо заменить файлами, существующими в / php / (libeay32.ddl и ssleay32.dll )»
Вы передали неправильный параметр openssl_public_encrypt
openssl_public_encrypt($data, $encrypted_data, $key1, OPENSSL_PKCS1_PADDING)
где $key1
– это идентификатор ресурса, который использует $key
вместо $key1
. Вы можете использовать
openssl_public_encrypt($data, $encrypted_data, $key, OPENSSL_PKCS1_PADDING)