Используя PHP 5.2.4 и модуль OpenSSL 0.9.8g, я пытаюсь создать подписанный дайджест
openssl_sign($stuff, $signeddigest, $key, 'sha256WithRSAEncryption');
Увы, $ signeddigest возвращается пустым, и я не получаю ошибок.
Если не указывать алгоритм 'sha256WithRSAEncryption', подписанный дайджест возвращается с использованием алгоритма по умолчанию.
Тот же код работает отлично на PHP 5.3.10 и OpenSSL 1.0.0g. Не поддерживается ли алгоритм 'sha256WithRSAEncryption' в OpenSSL 0.9.8g?
Хороший друг придумал обходной путь для использования sha256WithRSAEncryption на старом модуле PHP 5.2.4 и OpenSSL 0.9.8g.
Используя информацию, доступную по адресу http://www.di-mgt.com.au/rsa_alg.html, он написал мне следующий фрагмент:
function my_openssl_sign($data, &$signature, $priv_key_id, $signature_alg = 'sha256WithRSAEncryption') { $pinfo = openssl_pkey_get_details($priv_key_id); $hash = hash('sha256', $data); $t = '3031300d060960864801650304020105000420'; # sha256 $t .= $hash; $pslen = $pinfo['bits']/8 - (strlen($t)/2 + 3); $eb = '0001' . str_repeat('FF', $pslen) . '00' . $t; $eb = pack('H*', $eb); return openssl_private_encrypt($eb, $signature, $priv_key_id, OPENSSL_NO_PADDING); }
Спасибо, Мэдс, ты сделан из удивительности!