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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline pavenko_sv  
#1 Оставлено : 8 сентября 2017 г. 8:45:23(UTC)
pavenko_sv

Статус: Активный участник

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

Сказал «Спасибо»: 39 раз
Доброе время суток, что не так выполняю?

Вот этим кодом я делаю подпись:

Код:
function SignCreate(thumbprint, dataToSign) {

    let oCertificate;
    let oSigner;
    let oSignedData;
    let sSignedMessage;

    let oStore = cadesplugin.CreateObject("CAPICOM.Store");
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

    let oCertificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);

    if (oCertificates.Count == 0) {
        return "Certificate not found: " + thumbprint;
    }

    oCertificate = oCertificates.Item(1);
    oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
    oSigner.Certificate = oCertificate;
    oSigner.TSAAddress = "http://testca.cryptopro.ru/tsp/tsp.srf";

    oSignedData = cadesplugin.CreateObject("CAdESCOM.CadesSignedData");
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
    oSignedData.Content = dataToSign.replace('data:application/pdf;base64,', '');

    try {
        sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1, true);
    } catch (err) {
        return "Failed to create signature. Error: " + GetErrorMessage(err);
    }

    try {
        oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_X_LONG_TYPE_1, true);
    } catch (err) {
        alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err));
        return false;
    }

    oStore.Close();
    return sSignedMessage;
}


Пробую два варианта:
Вариант отсоединённой подписи не проходит проверку ЭП в КриптоПро DSS:
Код:
sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1, true);

Цитата:
Результат проверки
Название документа spravka_soc_viplaty_09.08.2017.pdfОП.p7s
Подпись 1
Результат проверки
Подпись не действительна
Дополнительная информация
Не удалось проверить подпись CAdES-XLT1. Ошибка: [Неправильное значение хеша]. Код: [0x80091007].Сообщение содержит неверную подпись.
Дополнительная информация о подписи
Формат подписи CAdES
Подпись в формате XLT1
Время подписи, полученное из штампа
9/8/2017 8:20:37 AM
Время подписи
9/8/2017 8:20:21 AM
Информация о сертификате
Субъект
C=RU, S=Нижегородская Область, L=Нижний Новгород, O="ООО ""КазАУП""", OU=Отдел разработки, CN=Stanislav, E=pavenko_sv@mail.ru
Издатель
CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, E=support@cryptopro.ru
Срок действия
07.09.2017 09:43:43 - 07.12.2017 09:53:43

Вариант присоединённой подписи проверку проходит:
Код:
sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1, false);

Цитата:

Сервер электронной подписи КриптоПро DSS
Результат проверки
Название документа spravka_soc_viplaty_09.08.2017.pdfПП.p7s
Подпись 1
Результат проверки
Подпись действительна
Дополнительная информация
Отсутствует
Дополнительная информация о подписи
Формат подписи CAdES
Подпись в формате XLT1
Время подписи, полученное из штампа
9/8/2017 8:39:21 AM
Время подписи
9/8/2017 8:39:00 AM
Информация о сертификате
Субъект
C=RU, S=Нижегородская Область, L=Нижний Новгород, O="ООО ""КазАУП""", OU=Отдел разработки, CN=Stanislav, E=pavenko_sv@mail.ru
Издатель
CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, E=support@cryptopro.ru
Срок действия
07.09.2017 09:43:43 - 07.12.2017 09:53:43

Оба варианта отрабатывают без ошибок и возвращают на выходе файл
Во вложении оба варианта рассмотрены
sign.zip (89kb) загружен 11 раз(а).

Отредактировано пользователем 8 сентября 2017 г. 8:46:00(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#2 Оставлено : 8 сентября 2017 г. 10:16:15(UTC)
Андрей *

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

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

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

А в dataToSign - что именно находится, дважды закодированный файл в base64?

Если извлечь подписанные данные из spravka_soc_viplaty_09.08.2017.pdfПП.p7s
то не получится PDF-документ, на выходе base64-данные.

Отсюда:
а) присоединенная подпись - да, будет проверяться
б) отсоединенная подпись - нет, т.к. на вход подается pdf, а подписывался и считался хеш от base64-строки
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
pavenko_sv оставлено 08.09.2017(UTC)
Offline Андрей Писарев  
#3 Оставлено : 8 сентября 2017 г. 10:33:29(UTC)
Андрей *

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

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

Сказал «Спасибо»: 489 раз
Поблагодарили: 2032 раз в 1576 постах
Извлек из присоединенной подписи подписанные данные и подал их на вход, при проверке отсоединенной ЭП.
Всё корректно проверилось. Прикладываю ваши файлы.

test.zip (44kb) загружен 26 раз(а).

Ищите места, где dataToSign кодируется в base64.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
pavenko_sv оставлено 08.09.2017(UTC)
Offline pavenko_sv  
#4 Оставлено : 8 сентября 2017 г. 12:32:41(UTC)
pavenko_sv

Статус: Активный участник

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

Сказал «Спасибо»: 39 раз
Автор: Андрей * Перейти к цитате
Извлек из присоединенной подписи подписанные данные и подал их на вход, при проверке отсоединенной ЭП.
Всё корректно проверилось. Прикладываю ваши файлы.

test.zip (44kb) загружен 26 раз(а).

Ищите места, где dataToSign кодируется в base64.


Можете помочь?

Код получающий файл взят у Вас с сайта:

HTML:
Код:
 <input type='file'
                   (change)="fileChangeEvent($event)"
                   placeholder="Upload file..."
                   accept=".pdf, application/pdf"
                   required="required"
                   title="Выбрать PDF">

TS:

Код:
private fileChangeEvent(fileInput: any) {
        this.file.description = fileInput.target.files[0].name;
        this.onClickRefreshList();
        let selectedFile = fileInput.target.files;
        if (selectedFile.length > 0) {
            let fileToLoad = selectedFile[0];
            let myReader: FileReader = new FileReader();
            myReader.onloadend = (e) => {
                let header = ";base64,";
                let fileData = myReader.result;
                this.file.file = fileData.substr(fileData.indexOf(header) + header.length);
                console.log(this.file);
            };
            myReader.readAsDataURL(fileToLoad);
        }
    }


Далее вызываю метод с сертификатом
Код:
private onClickSignCreated(cert: Cert) {
        this.srvCerts.signCreated(cert.thumbprint, this.file);
    }



По сути то что Вы прислали это и есть сам файл в base64 может метод которым я пользуюсь подписывает строку и возвращает подпись не файла а строки?Возможно ему нужен какой-то ещё параметр который скажет о том что это строка в формате base64 и её нужно раскодировать для начала прежде чем подписывать и подписывать сам ХЕШ?

Отредактировано пользователем 8 сентября 2017 г. 12:54:58(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#5 Оставлено : 8 сентября 2017 г. 15:12:05(UTC)
Андрей *

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

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

Сказал «Спасибо»: 489 раз
Поблагодарили: 2032 раз в 1576 постах
Еще раз ...


На тестовой странице указано:
Цитата:
yield oSignedData.propset_ContentEncoding(1); //CADESCOM_BASE64_TO_BINARY
yield oSignedData.propset_Content(dataToSign);



у Вас в коде:
Цитата:
oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
oSignedData.Content = dataToSign.replace('data:application/pdf;base64,', '');



dataToSign - где кодируется в base64?
в dataToSign - что при присвоении oSignedData.Content = ... ?
Сохранить строку на диск и декодировать... что мешает?
Получается исходный PDF?

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
pavenko_sv оставлено 14.09.2017(UTC)
Offline Андрей Писарев  
#6 Оставлено : 8 сентября 2017 г. 15:13:31(UTC)
Андрей *

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

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

Сказал «Спасибо»: 489 раз
Поблагодарили: 2032 раз в 1576 постах
>может метод которым я пользуюсь подписывает строку и возвращает подпись не файла а строки?

Именно так и есть, отсоединенная подпись подходит к base64 (в unicode) от PDF.


Если указать явно: oSignedData.ContentEncoding = 1 - так, что получается?
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
pavenko_sv оставлено 14.09.2017(UTC)
Offline pavenko_sv  
#7 Оставлено : 14 сентября 2017 г. 12:00:54(UTC)
pavenko_sv

Статус: Активный участник

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

Сказал «Спасибо»: 39 раз
С Вашит тестовым ключём все подписи теперь формируются. Большое спасибо.

Для тех кому интересна последняя версия можно посмотреть на гитхабе тут: pavenkostanislav/GetingCertificatesList

Отредактировано пользователем 14 сентября 2017 г. 12:02:56(UTC)  | Причина: Не указана

Offline cromlehg1  
#8 Оставлено : 9 февраля 2019 г. 17:24:01(UTC)
cromlehg1

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

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

Добрый день.

У меня аналогичная ситуация.
Исходные данные - строка: "test". Эту строку кодирую в BASE64, получаю - "dGVzdA==".

Проверяю присоединенную подпись на госуслугах - все работает.

Проверяю отсоединенную подпись на сервисе (https://www.gosuslugi.ru/pgu/eds/) - получаю "Подлинность документа НЕ ПОДТВЕРЖДЕНА". (сохранил подпись и base64 строку в соответствующих файлах).
Аналогичные результат получаю на сервисе - https://crypto.kontur.ru/verify

Также попробовал вытащить подписанные данные из присоединенной подписи и проверить их с подписью отсоединенной - не проходит валидацию.

ContentEcnoding устанавливаю в CADESCOM_BASE64_TO_BINARY до того как устанавливаю данные в Content. Подписываю с опцией CADESCOM_CADES_BES.




Offline two_oceans  
#9 Оставлено : 11 февраля 2019 г. 8:09:50(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: cromlehg1 Перейти к цитате
Исходные данные - строка: "test". Эту строку кодирую в BASE64, получаю - "dGVzdA==".
...
Проверяю отсоединенную подпись на сервисе (https://www.gosuslugi.ru/pgu/eds/) - получаю "Подлинность документа НЕ ПОДТВЕРЖДЕНА". (сохранил подпись и base64 строку в соответствующих файлах).
Аналогичные результат получаю на сервисе - https://crypto.kontur.ru/verify
Сервисы ничего не знают о том, что Вы уже закодировани файл в Base64 и при передаче файла закодируют его в base64 еще раз, то есть в файл, который загружаете при проверке отсоединенной подписи надо записать "test", а не "dGVzdA==", тогда кодировка сойдется.

В присоединенной подписи данные тоже скорее всего обернуты, кроме того в подписи могут быть подписаны атрибуты, то есть это не совсем те исходные данные которые можно просто так "на коленке" вытащить, есть специальная процедура "снятия подписи" учитывающая снятие оберток и исключение атрибутов - попробуйте получить "исходный файл" с помощью ее в КриптоАРМ или аналогичной программе (и загрузить "исходный файл" с отсоединенной подписью). Практически уверен, что в нем (в "исходный файл") будет написано "test".
Offline cromlehg1  
#10 Оставлено : 11 февраля 2019 г. 8:14:11(UTC)
cromlehg1

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

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

Пробовали и test тоже записать. И пробовали вытаскивать данные из присоединеннонго сертификата (грешили на кодировку). Все равно подпись не валидна.
Тот же функционал работает с тестовым сертификатом под macos и windows.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.