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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Максим Лукьянович  
#1 Оставлено : 17 января 2022 г. 18:38:10(UTC)
Максим Лукьянович

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

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

Сказал(а) «Спасибо»: 2 раз
Добрый день!
Нужно реализовать вывод данных про подпись файла на фронтенде.
Является ли возможным вывести данные, которые я вижу на Госуслугах (пункт электронного документа. ЭП — отсоединенная, в формате PKCS#7):
Пример

Если да, каким методом могу для этого воспользоваться? Плохо ориентируюсь в работе плагина. Изучение документации не помогло решить задачу.
Пытаюсь воспользоваться методом VerifyCades для получения данных, но:
1) Получаю ошибку "Криптографическое сообщение не содержит всех запрошенных атрибутов" при попытке проверить подпись.
2) Не уверен, что после устранения ошибки я получу желаемые данные на выходе.

О реализации:
Пользователем подписывается документ, генерируется отдельная подпись:
Код:

                            // Получаю base64 подписываемого файла:
                            // ...
                            var header = ";base64,";
                            var sFileData = oFREvent.target.result;
                            var sBase64Data = sFileData.substr(sFileData.indexOf(header) + header.length);
                            // ...

                            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, sCertName);
                            var certsCount = yield oCertificates.Count;
                            if (certsCount === 0) {
                                alert("Certificate not found: " + sCertName);
                                return;
                            }
                            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");
                            yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY);
                            yield oSignedData.propset_Content(sBase64Data);
                            try {
                                var sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true);
                            } catch (err) {
                                alert("Failed to create signature. Error: " + cadesplugin.getLastError(err));
                                return;
                            }
        
                            yield oStore.Close();



При подписании проходит проверка:
Код:

                var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
                try {
                    yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY);
                    yield oSignedData.propset_Content(sBase64Data);
                    yield oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_BES, true);
                    alert("Signature verified");
        
                } catch (err) {
                    alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err));
                    return;
                }

Верификация проходит успешно.

Дальше реализовываю необходимый функционал проверки подписи по нажатию кнопки. Входящие данные - url на файлы подписи (.sig) и подписываемого документа (к примеру, .doc).
Снова следующим способом получаю base64 файлов:
Код:

            fetch(url)
                .then(res => res.blob())
                .then(blob => {
                    var oFReader = new FileReader();
                    oFReader.readAsDataURL(blob);

                    oFReader.onload = function (oFREvent) {
                        var header = ";base64,";
                        var sFileData = oFREvent.target.result;
                        var sBase64Data = sFileData.substr(sFileData.indexOf(header) + header.length);


И пробую выполнить VerifyCades:
Код:

                            var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
                            try {
                                yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY);
                                yield oSignedData.propset_Content(base64File);
                                oSignedData.VerifyCades(base64Sign, CADESCOM_CADES_BES, true);
                            } catch (err) {
                                alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err));
                                return false;
                            }

В результате чего получаю ошибку "Криптографическое сообщение не содержит всех запрошенных атрибутов".

Подскажите, пожалуйста, в правильном ли направлении вообще я работаю и можно ли получить необходимые мне данные (пример на скриншоте с Госуслуг)?
Offline Андрей *  
#2 Оставлено : 17 января 2022 г. 18:55:37(UTC)
Андрей *

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

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

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

Да, можно решить задачу через плагин (а почему не сервер?).
Ошибка на других файлах или тех же (которые успешно проверяются)?

Примеры файлов... ?
Техническую поддержку оказываем тут
Наша база знаний
Offline Максим Лукьянович  
#3 Оставлено : 17 января 2022 г. 19:48:33(UTC)
Максим Лукьянович

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Андрей * Перейти к цитате
Здравствуйте.
а почему не сервер?

Принципиальной разницы нет, но при реализации на сервере возникнет аналогичный вопрос: какими методами можно достать эти данные?Anxious

Автор: Андрей * Перейти к цитате

Ошибка на других файлах или тех же (которые успешно проверяются)?

Файлы одни и те же. Файл подписи .sig формируется на сервере из полученного в ходе подписания base64.

Автор: Андрей * Перейти к цитате

Примеры файлов... ?

test.zip (10kb) загружен 3 раз(а).

Отредактировано пользователем 17 января 2022 г. 19:56:25(UTC)  | Причина: Корректировка

Offline Андрей *  
#4 Оставлено : 17 января 2022 г. 21:40:07(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
Всё нормально, проверяется, CAdESBES, отсоединенная подпись:
Snimok ehkrana ot 2022-01-17 22-36-48.png (53kb) загружен 7 раз(а).


через phpcades
https://docs.cryptopro.ru/cades/phpcades
как пример:
Snimok ehkrana ot 2022-01-17 22-37-53.png (58kb) загружен 7 раз(а).

значит нужно смотреть в код js...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#5 Оставлено : 17 января 2022 г. 21:42:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
что в переменных:
Цитата:
yield oSignedData.propset_Content(base64File);
oSignedData.VerifyCades(base64Sign,


?
Техническую поддержку оказываем тут
Наша база знаний
Offline Максим Лукьянович  
#6 Оставлено : 17 января 2022 г. 22:36:56(UTC)
Максим Лукьянович

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Андрей * Перейти к цитате
что в переменных:
Цитата:
yield oSignedData.propset_Content(base64File);
oSignedData.VerifyCades(base64Sign,


?


Получаю с сервера .sig и .docx файлы и на фронтенде делаю следующее:
Код:

            fetch(url)
                .then(res => res.blob())
                .then(blob => {
                    var oFReader = new FileReader();
                    oFReader.readAsDataURL(blob);

                    oFReader.onload = function (oFREvent) {
                        var header = ";base64,";
                        var sFileData = oFREvent.target.result;
                        var sBase64Data = sFileData.substr(sFileData.indexOf(header) + header.length);


Загоняю sBase64Data соответственно в base64File и base64Sign.
Получаю следующее:

base64Sign:


base64File:

Offline Андрей *  
#7 Оставлено : 17 января 2022 г. 22:49:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
т.е. подготовленный в base64 файл, кодируется еще раз и подается в переменную base64File ?

Цитата:
FReader.onload = function (oFREvent) {
var header = ";base64,";
var sBase64Data = sFileData.substr(sFileData.indexOf(header) + header.length);
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#8 Оставлено : 17 января 2022 г. 22:50:23(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
аналогичный "вопрос" к двойному base64-кодированию в подписи...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#9 Оставлено : 17 января 2022 г. 22:55:22(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
хотя нет... закодировано же 1 раз, перед передачей в функцию..
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#10 Оставлено : 17 января 2022 г. 23:12:30(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
вот этого почему нет? : yield oSignedData.VerifyCades(base64Sign, CADESCOM_CADES_BES, true);
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.