Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline hooper  
#1 Оставлено : 21 июля 2022 г. 17:21:25(UTC)
hooper

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.03.2020(UTC)
Сообщений: 6
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Добрый день.
Пишу вэб приложение с функцией подписи документов пользователями при помощи Крипто Про Browser plug-in. Беру код из примеров - подпись ставится.
Сейчас есть задача проставить и штамп времени (у меня на ПК установлены все необходимые лицензии) и при генерации подписи через КриптоАРМ - все отрабатывает и штамп проставляется (после запроса адреса Службы штампов времени).
Но в коде из примеров не нашел получение подписи со штампов времени.
Подскажите что нужно вставить в код чтобы осуществить простановку штампа времени


Используемый код для создания подписи



Код:
var CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d;
    var CAPICOM_CURRENT_USER_STORE = 2;
    var CAPICOM_MY_STORE = "My";
    var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
    var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;

    function SignCreate(certSubjectName, dataToSign) {
        return new Promise(function (resolve, reject) {
            cadesplugin.async_spawn(function* (args) {
                var oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
                yield oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
                    CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

                var oStoreCerts = yield oStore.Certificates;
                var oCertificates = yield oStoreCerts.Find(
                    CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
                var certsCount = yield oCertificates.Count;
                if (certsCount === 0) {
                    err = "Certificate not found: " + certSubjectName;
                    alert(err);
                    args[1](err);
                }
                var oCertificate = yield oCertificates.Item(1);
                var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
                yield oSigner.propset_Certificate(oCertificate);
                yield oSigner.propset_CheckCertificate(true);
                yield oSigner.propset_TSAAddress("http://cryptopro.ru/tsp/");

                var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
                yield oSignedData.propset_Content(dataToSign);

                try {
                    var sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1);
                }
                catch (e) {
                    err = cadesplugin.getLastError(e);
                    alert("Failed to create signature. Error: " + err);
                    args[1](err);
                }
                yield oStore.Close();
                return args[0](sSignedMessage);
            }, resolve, reject);
        });
    }

    function Verify(sSignedMessage) {
        return new Promise(function (resolve, reject) {
            cadesplugin.async_spawn(function* (args) {
                var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
                try {
                    yield oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_X_LONG_TYPE_1);
                }
                catch (e) {
                    err = cadesplugin.getLastError(e);
                    alert("Failed to verify signature. Error: " + err);
                    return args[1](err);
                }
                return args[0]();
            }, resolve, reject);
        });
    }

    function run() {
        var oCertName = document.getElementById("CertName");
        var sCertName = oCertName.value; // Здесь следует заполнить SubjectName сертификата
        if ("" === sCertName) {
            alert("Введите имя сертификата (CN).");
            return;
        }

        SignCreate(sCertName, "Message").then(
            function (signedMessage) {
                document.getElementById("signature").innerHTML = signedMessage;
                Verify(signedMessage).then(
                    function () {
                        alert("Signature verified");
                    },
                    function (err) {
                        document.getElementById("signature").innerHTML = err;
                    });
            },
            function (err) {
                document.getElementById("signature").innerHTML = err;
            }
        );



Подскажите как быть с данным примером:
Код:

var CADESCOM_CADES_BES = 1;
    var CAPICOM_CURRENT_USER_STORE = 2;
    var CAPICOM_MY_STORE = "My";
    var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
    var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
    var CADESCOM_BASE64_TO_BINARY = 1;

    function SignCreate(certSubjectName, dataInBase64) {
        return new Promise(function (resolve, reject) {
            cadesplugin.async_spawn(function* (args) {
                var oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
                yield oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
                CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

                var oStoreCerts = yield oStore.Certificates;
                var oCertificates = yield oStoreCerts.Find(
                CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
                var certsCount = yield oCertificates.Count;
                if (certsCount === 0) {
                    err = "Certificate not found: " + certSubjectName;
                    alert(err);
                    return args[1](err);
                }
                var oCertificate = yield oCertificates.Item(1);
                var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
                yield oSigner.propset_Certificate(oCertificate);
                yield oSigner.propset_CheckCertificate(true);

                var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
                // Значение свойства ContentEncoding должно быть задано
                // до заполнения свойства Content
                yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY);
                yield oSignedData.propset_Content(dataInBase64);

                var sSignedMessage = "";
                try {
                    sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true);
                } catch (err) {
                    e = cadesplugin.getLastError(err);
                    alert("Failed to create signature. Error: " + e);
                    return args[1](e);
                }

                yield oStore.Close();
                return args[0](sSignedMessage);
            }, resolve, reject);
        });
    }

Отредактировано пользователем 21 июля 2022 г. 19:47:56(UTC)  | Причина: Расширил вопрос

Offline Андрей *  
#2 Оставлено : 21 июля 2022 г. 18:16:53(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,161
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2389 раз в 1880 постах
Здравствуйте.

В приведенном примере всё необходимое есть,
propset_TSAAddress и указание на тип CADESCOM_CADES_X_LONG_TYPE_1.

Только заменить адрес на другой, например:
http://qs.cryptopro.ru/tsp/tsp.srf
http://pki.tax.gov.ru/tsp/tsp.srf
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
hooper оставлено 21.07.2022(UTC)
Offline hooper  
#3 Оставлено : 21 июля 2022 г. 19:21:44(UTC)
hooper

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.03.2020(UTC)
Сообщений: 6
Российская Федерация

Сказал(а) «Спасибо»: 5 раз
Спасибо больше!


Подскажите пожалуйста при подписании данных в base64 принцип простановки штампа не меняется?
Offline Андрей *  
#4 Оставлено : 21 июля 2022 г. 23:05:49(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,161
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2389 раз в 1880 постах
Принцип не меняется, в коде выше указано (из примера в документации)

Цитата:

// Значение свойства ContentEncoding должно быть задано до заполнения свойства Content
yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(dataInBase64);



Для штампа времени - указать TSAAddress и тип подписи (CAdES-T или CAdES XLongType1)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
hooper оставлено 22.07.2022(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.