Ошибка сегментации в openssl_sign под apache, но все в CLI - PullRequest
0 голосов
/ 16 марта 2012

У меня есть PHP-код, который подписывает запрос, используя openssl_sign:

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) приводит к segfault (11).

$pkeyid = openssl_pkey_get_private($keystr) дает действительный ключ.

Кто-нибудь сталкивался с такой ошибкой? Какое решение, если есть? Альтернативы, совместимые с openssl_sign? Как это можно было быстро диагностировать?

1 Ответ

2 голосов
/ 18 марта 2012

Наиболее вероятная причина: и ваш PHP-модуль, и сам apache httpd связаны с libopenssl, но разными его версиями, вызывая вызов символов из "неправильной" библиотеки.

Установите ulimit -c unlimited, пусть httpd dump 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
...