Статус: Новичок
Группы: Участники
Зарегистрирован: 21.11.2021(UTC) Сообщений: 1
Сказал(а) «Спасибо»: 2 раз
|
Добрый день. Возникла проблема с сформированием подписи документа. Получаю по методу presign хэш документа и подписываю через плагин, отправляю полученную подпись - но Dss lite отвечает что подпись неверна. Пробовала получать и через обьект RawSignature и через CadesSignData(код ниже). Причем если подпись сохраняю и проверяю ее через гос услуги или CryptoPro tools показывает что подпись валидная Подпись на стороне клиента(пробовала все методы) Код:
signStringHash (keyThumb, dataToSign) {
let cert = this.certificates;
let store = this.store;
return new Promise(function (resolve, reject) {
cadesplugin.async_spawn(function* (args) {
try {
// поиск сертификата по его хешу (thumbprint)
let oCertificates = yield cert.Find(
cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, keyThumb);
let Count = yield oCertificates.Count;
if (Count === 0) {
throw (`Сертификат не найден: ${args[0]}`);
}
// устустановка сертификата
let oCertificate = yield oCertificates.Item(1);
let oSigner = yield cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner');
yield oSigner.propset_Certificate(oCertificate);
// вычисление хеша
let oHashedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');
yield oHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256);
yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
// Передаем данные
yield oHashedData.Hash(dataToSign);
// Вычисляем хэш-значение
let sHashValue = yield oHashedData.Value;
// из хэш в bytes
yield oHashedData.SetHashValue(sHashValue);
let oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
let sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, cadesplugin.CADESCOM_CADES_BES);
let oSignedData2 = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
let oHashedData2 = yield cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');
// Инициализируем объект заранее вычисленным хэш-значением
// Алгоритм хэширования нужно указать до того, как будет передано хэш-значение
yield oHashedData2.propset_Algorithm = cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
yield oHashedData2.SetHashValue(sHashValue);
// Проверяем подпись
try {
yield oSignedData2.VerifyHash(oHashedData, sSignedMessage, cadesplugin.CADESCOM_CADES_BES);
} catch (err) {
alert('Не получилось проверить созданную подпись: ' + err);
return false;
}
yield store.Close();
args[2]({ signedMessage: sSignedMessage, hashedVal: sHashValue });
} catch (err) {
args[3]('Failed to create signature. Error: ' + err);
}
}, keyThumb, dataToSign, resolve, reject);
})
}
makeRawSignature(keyThumb, dataToSign){
let cert = this.certificates;
let store = this.store;
return new Promise(function (resolve, reject) {
cadesplugin.async_spawn(function* (args) {
try {
//вытаскиваеи аргументы из асинхронной функции
let sCertName = args[0]
// Предварительно вычисленное хэш-значение в виде строки шестнадцатеричных цифр,
// группами по 2 цифры на байт, с пробелами или без пробелов.
// Например, хэш-значение в таком формате возвращают объекты
// CAPICOM.HashedData и CADESCOM.HashedData.
let rawValue = args[1]
//функции промиса
let resolve = args[2]
let reject = args[3];
// Алгоритм хэширования, при помощи которого было вычислено хэш-значение
//ГОСТ Р 34.10-2012 256 бит - для сырой подписи
// Полный список поддерживаемых алгоритмов указан в перечислении CADESCOM_HASH_ALGORITHM
let hashAlg = cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
// открываем хранилище для запроса на сертификата
let oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open( cadesplugin.CAPICOM_CURRENT_USER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
// находим сертификат по отпечатку
let oStoreCerts = yield oStore.Certificates;
let oCertificates = yield oStoreCerts.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, sCertName);
let certsCount = yield oCertificates.Count;
if (certsCount === 0) {
console.log('Certificate not found ')
reject()
}
let oCertificate = yield oCertificates.Item(1);
yield oStore.Close();
// Создаем объект CAdESCOM.HashedData
var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");
// Инициализируем объект заранее вычисленным хэш-значением
// Алгоритм хэширования нужно указать до того, как будет передано хэш-значение
yield oHashedData.propset_Algorithm(hashAlg);
yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
// Передаем данные
yield oHashedData.Hash(rawValue);
/* // Вычисляем хэш-значение
let sHashValue = yield oHashedData.Value;
// из хэш в bytes
yield oHashedData.SetHashValue(sHashValue);*/
// Создаем объект CAdESCOM.RawSignature
var oRawSignature = yield cadesplugin.CreateObjectAsync("CAdESCOM.RawSignature");
console.log(oRawSignature)
// Вычисляем значение подписи
try {
// oRawSignature.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
var sRawSignature = yield oRawSignature.SignHash(oHashedData, oCertificate);
console.log(sRawSignature)
} catch (err) {
console.log('error signature')
// alert("Failed to create signature. Error: " + cadesplugin.getLastError(err));
reject()
}
let oRawSignature2 = yield cadesplugin.CreateObjectAsync("CAdESCOM.RawSignature");
// Проверяем подпись
try {
yield oRawSignature2.VerifyHash(oHashedData, oCertificate, sRawSignature);
alert("Signature verified");
} catch (err) {
console.log(err, 'проверка')
//alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err));
reject()
}
} catch (e) {
reject()
console.log(e)
}
let signatureEncoded = sRawSignature;
resolve({signature : signatureEncoded})
}, keyThumb, dataToSign, resolve, reject);
} )
}
async signWithDateAndTime(hash, dataBase64, signType){
let cert = this.certificates;
let store = this.store;
return new Promise(function (resolve, reject) {
cadesplugin.async_spawn(function* (args) {
try {
// поиск сертификата по его хешу
let oCertificates = yield cert.Find(
cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, hash);
let Count = yield oCertificates.Count;
if (Count === 0) {
throw (`Сертификат не найден: ${args[4]}`);
}
// задаем основные обьекты подписи
let clientTime = new Date();
let oAttrs = yield cadesplugin.CreateObjectAsync('CADESCOM.CPAttribute');
let oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
let oSigner = yield cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner');
//устанавливаем данные подписи
yield oAttrs.propset_Name(cryptoProConstants.Time.AUTHENTICATED_ATTRIBUTE_SIGNING_TIME);
yield oAttrs.propset_Value(clientTime);
// устанавливаем сертификат
let oCertificate = yield oCertificates.Item(1);
yield oSigner.propset_Certificate(oCertificate);
//устанавливаем атрибуты
let attrs = yield oSigner.AuthenticatedAttributes2;
yield attrs.Add(oAttrs);
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(dataBase64);
yield oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY);
let signature = yield oSignedData.SignCades(
oSigner,
cadesplugin.CADESCOM_CADES_BES,
signType
);
yield store.Close();
args[3]({ signature: signature });
} catch (err) {
console.log(err)
args[4]('Failed to create signature. Error: ' + err);
}
}, hash, dataBase64, signType, resolve, reject);
})
}
|