Здравствуйте никак не могу понять некоторые вещи формируемой подписи КриптоПРО ЭЦП Browser plug-in:
1) Почему Хеш строки в base64 из КриптоПРО ЭЦП Browser plug-in отличается от того же алгоритма хеша полученного из openssl + gost.dll ?
var base64 = Base64.encode('test');
console.log(base64);
// dGVzdA==
var oHashDat = cadesplugin.CreateObject('CAdESCOM.HashedData');
oHashDat.Algorithm = 100;
oHashDat.DataEncoding = 1;
oHashDat.Hash(base64);
console.log(oHashDat.Value);
// BD87D56277DCC8EA36416BE9127E9BD3F54A6066B84851D638323E888859CE69
Тоже самое в openssl:
Положил строку 'dGVzdA==' в файл 'in.txt'
Запускаю в консоль:
openssl dgst -engine gost -md_gost94 in.txt
// md_gost94(in.txt)= a4c3fbf7c6f4d1311c957116c7cad3ccf41062a501423fc5ed26caaab9686fc7
2) Не получается проверить полученную в итоге подпись на сервере через openssl...
var oStore = cadesplugin.CreateObject('CAdESCOM.Store'),
oRawSig = cadesplugin.CreateObject('CAdESCOM.RawSignature'),
sign1, sign2;
oStore.Open();
var Certs = oStore.Certificates.Find(0, th); // th - sha1 отпечаток сертификата, устанавливается ранее...
if (!Certs.Count) alert('Сертификат #' + th + ' не найден!');
else {
var base64 = Base64.encode('test');
var oHashDat = cadesplugin.CreateObject('CAdESCOM.HashedData');
oHashDat.Algorithm = 100;
oHashDat.DataEncoding = 1;
oHashDat.Hash(base64);
sign1 = oRawSig.SignHash(oHashDat, Certs.Item(1));
console.log('sign1:',sign1); // HEX
// переворот, оставляю в тот же HEX формате но в перевернутом виде...
// код функций reverse, hex2bin, bin2hex не превожу в них проблем нет...
// переворот срабатывает правильно
sign2 = bin2hex(reverse(hex2bin(sign1)));
console.log('sign2:', sign2); // revHEX
}
Серверная часть:
PHP КОД:
$f = '/path/to/pub.key';
// $s - полученный бинарный файл подписи...
// tmp - создает временный файл с префиксом
// и содержимое полученной из первого аргумента
// pack - упаковка в бинарную строку...
$s = tmp ( pack ( 'H*' , $sign ) , 's' );
// $f - публичный ключ в pem формате
// можно получить из сертификата (openssl x509 -pubkey -noout -in cert.crt > pub.key)
// или извлечением из сертификата с приватным ключом в формат p12.pfx...
// cmd_exec - функция открывающая процесс и передающая в stdin исходную строку
// и выводящая результат из stdout для проверки подписи...
// вместо неё можно использовать и другую функцую...
// system ( 'openssl dgst -engine gost -verify "' . $f . '" -signature "' . $s . '" "' . $src . '" )
// но надо будет сохранить исходную строку в файл $src...
$r = cmd_exec ( 'openssl dgst -engine gost -verify "' . $f . '" -signature "' . $s . '"' , $data );
И в результате все время получаю только:
Verification Failure
Отдельно делал подпись и проверку на сгенерированном ключе и на экспортированном приватном ключе из КриптоПРО
все силами самого openssl и проверка проходит без проблем...
А вот как только не пытался вертеть байты подписи из плагина постоянно ошибка...
Подскажите пожалуйста в чем проблема в 1-ом вопросе и как быть со 2-ым вопросом...
Отредактировано пользователем 28 ноября 2017 г. 16:49:25(UTC)
| Причина: опечатка названия темы