Подпись по ГОСТ в 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>. Тестовый самоподписанный сертификат на продакшене должен замениться подтвержденным в УЦ сертификатом.


Ответы (0 шт):