2012-07-09 64 views
2

(这个问题最初发布于ServerFault - 我还没有删除,并搬到这里了。)使用OpenSSL PHP的问题 - 不同的行为不同版本

我必须运行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错误跟踪器中找到尽可能多的东西,但我不知道我在找什么。

问候,

菲利普

+0

你有没有比较每个php.ini配置文件的设置? – RobB 2012-07-09 17:02:50

+0

@RobB:表面上,是的。两个都加载了OpenSSL扩展。这两个文件都没有进一步的OpenSSL设置。我还应该寻找什么? – Philip 2012-07-09 19:06:15

+0

@RobB我在两个php.ini文件上做了一个比较 - 两者之间没有明显的区别,无法用一个是生产服务器和一个是开发服务器来解释。 – Philip 2012-07-09 19:18:36

回答

8

this post,该问题涉及到在XAMPP/Windows安装Apache和PHP的不同版本的OpenSSL。我和openssl_verify有类似的问题。我通过为Apache和PHP(替换DLL)使用相同的OpenSSL版本来解决此问题。这是一个link to the solution

“我发现问题的解决方案,似乎有2个错误的文件在/ apache/bin /默认的1.7.7安装中需要被替换为/ php /(libeay32中的文件。 DDL和ssleay32.dll)”

+0

谢谢。我可以确认我更换了libeay32.dll和openssl.exe。从那里,它似乎工作。也许只有libeay32.dll需要改变? – Philip 2012-07-13 15:57:06

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)