【问题标题】:Issues with OpenSSL on PHP - different behaviour for different versionsPHP 上的 OpenSSL 问题 - 不同版本的不同行为
【发布时间】:2012-07-09 02:53:54
【问题描述】:

(此问题最初发布在 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 错误跟踪器中尽可能多地查找,但我不知道我在寻找什么。

问候,

菲利普

【问题讨论】:

  • 你对比过各个php.ini配置文件的设置吗?
  • @RobB:从表面上看,是的。两者都加载了 OpenSSL 扩展。这两个文件都没有任何其他 OpenSSL 设置。我还应该寻找什么?
  • @RobB 我已经对两个 php.ini 文件进行了比较 - 两者之间没有显着差异,这无法通过一个是生产服务器而一个是开发服务器。

标签: php openssl public-key-encryption


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我可以确认我替换了 libeay32.dll 和 openssl.exe。从那里开始,它似乎奏效了。也许只有 libeay32.dll 需要更改?
【解决方案2】:

你传递了错误的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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多