PHP上的OpenSSL问题 - 不同版本的不同行为

时间:2012-07-09 16:50:57

标签: php openssl public-key-encryption

(此问题最初发布在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会有帮助吗?

我知道5.3.5上的OpenSSL版本是0.9.8而5.3.8版本是1.0.0。我想那里可能有问题。有什么方法可以解决这个问题吗?

我试图尽可能多地从OpenSSL.org网站和PHP bug跟踪器中找到它,但我不知道我在寻找什么。

此致

菲利普

2 个答案:

答案 0 :(得分:8)

根据this post,该问题与XAMPP / Windows安装中的不同OpenSSL版本的Apache和PHP有关。我在openssl_verify上遇到了类似的问题。我通过对Apache和PHP使用相同的OpenSSL版本(替换DLL)解决了这个问题。这是一个link to the solution

“我找到了问题的解决方案,似乎默认1.7.7安装中的/ apache / bin /中有2个错误的文件需要被/ php /中存在的文件替换(libeay32 .ddl和ssleay32.dll)“

答案 1 :(得分:0)

您传递了错误的openssl_public_encrypt

参数

openssl_public_encrypt($data, $encrypted_data, $key1, OPENSSL_PKCS1_PADDING)

其中$key1是资源ID使用$key而不是$key1。你可以使用

openssl_public_encrypt($data, $encrypted_data, $key, OPENSSL_PKCS1_PADDING)