2012-07-09 92 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)