2012-03-16 20 views
0

我有跡象要求使用openssl_sign PHP代碼:分段故障在apache下openssl_sign,但還好吧在CLI

if (($pkeyid = openssl_pkey_get_private($keystr)) === false) 
{ 
    $this->setError('Cannot retrieve private key from: ' . $this->getParam('keyFile')); 
    return false; 
} 
if (!openssl_sign($message, $sign, $pkeyid, OPENSSL_ALGO_SHA1)) 
{ 
    $this->setError('Cannot sign with private key'); 
    return false; 
} 

如果代碼在CLI運行它正常工作,但是Apache(PHP 5.2.17下作爲模塊)與!openssl_sign($message, $sign, $pkeyid, OPENSSL_ALGO_SHA1)一致導致段錯誤(11)。

$pkeyid = openssl_pkey_get_private($keystr)給出有效密鑰。

有沒有人遇到過這樣的錯誤?什麼是解決方案?替代品符合openssl_sign?如何快速診斷?

回答

2

最可能的原因:你的PHP模塊和Apache httpd本身都鏈接到libopenssl,但它的不同版本,從而導致「錯誤」庫中的符號被調用。

ulimit -c unlimited,讓httpd轉儲core,並與gdb進行分析:

gdb /path/to/httpd /path/to/core 
(gdb) info shared 
# look for more than one instance of openssl 

(gdb) info func EVP_SignFinal 
# look for more than one definition -- one could be statically linked into httpd 
+0

感謝。只有一個問題 - 我如何讓httpd轉儲核心? – dmitry 2012-03-18 18:22:16

+0

我決定重新編譯httpd,無論如何,感謝有關httpd和php中不同版本的lib的想法。 – dmitry 2012-03-19 11:29:40