Подпись по ГОСТ в php
Добавил в OpenSSL GOST Engine, проверил
adminka@ubuntu-nginx:/$ openssl ciphers|tr ':' '\n'|grep GOST
GOST2012-GOST8912-GOST8912
GOST2001-GOST89-GOST89
собрал из исходников PHP 7.2.24 с ключами --with-system-ciphers --with-openssl
Теперь вроде бы PHP видит гостовские алгоритмы
openssl_get_md_methods();
Array (
[0] => GOST 28147-89 MAC
[1] => GOST R 34.11-2012 with 256 bit hash
[2] => GOST R 34.11-2012 with 512 bit hash
[3] => GOST R 34.11-94
[4] => blake2b512
[5] => blake2s256
[6] => gost-mac
[7] => gost-mac-12
[8] => md4
[9] => md5
[10] => md5-sha1
[11] => md_gost12_256
[12] => md_gost12_512
[13] => md_gost94
[14] => ripemd160
[15] => sha1
[16] => sha224
[17] => sha256
[18] => sha3-224
[19] => sha3-256
[20] => sha3-384
[21] => sha3-512
[22] => sha384
[23] => sha512
[24] => sha512-224
[25] => sha512-256
[26] => shake128
[27] => shake256
[28] => sm3
[29] => whirlpool
)
Выпустил самоподписанный сертификат и закрытый ключ по ГОСТу 2012 256 бит, задал пароль
openssl req -newkey gost2012_256 -pkeyopt paramset:A -out cert.csr -keyout key.pem
openssl x509 -req -in cert.csr -out cert.pem -signkey key.pem -days 730
Пытаюсь пописать строку через openssl_sign
<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
$sert = 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'certs' . DIRECTORY_SEPARATOR . 'cert.pem';
$private = 'file://' . __DIR__ . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'certs' . DIRECTORY_SEPARATOR . 'key.pem';
$data = 'test string test string test string test string';
openssl_sign($data, $sign, openssl_get_privatekey($private, '123456'), 'md_gost12_256');
var_dump(base64_encode($sign));
while ($msg = openssl_error_string())
echo $msg . "<br />\n";
?>
На выходе получаю
Warning: openssl_sign(): key type not supported in this PHP build! in /home/adminka/callbacksoap/test.php on line 11
string(88) "xlRC/hbqWkqDb/ENW0QlvWC/Bx9pqZfr6hEZvA9ZazLKVE7rjIWwWciVFU8xPKH0MKmfHKltouC5xk32GZ3Erg=="
Если тип ключа не поддерживается, то каким образом openssl_sign не выдал false? Подозреваю что сертификат и ключ еще нужно во что-то преобразовывать. openssl_pkcs7_sign с моими сертификатами работает, но то что он выдает - это не то что нужно. Как мне решить эту проблему?
P.S.: Пытаюсь реализовать XMLDSig на ГОСТ 2012, конкретно тут я пытаюсь сформировать <ds:SignatureValue></ds:SignatureValue>. Тестовый самоподписанный сертификат на продакшене должен замениться подтвержденным в УЦ сертификатом.