Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Проблемы с подписанием PDF документа установленной подписью #6

Open
pavenkostanislav opened this issue Sep 6, 2017 · 16 comments

Comments

@pavenkostanislav
Copy link

pavenkostanislav commented Sep 6, 2017

Сможете помочь с самим подписанием?

Не выполняется строчка:
let sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1);
Ошибка неустановленного корневого сертификата, но он установлен аж в 3 директориив личные с "Доверенные корневые центры сертификации" и "Доверенные лица"
A certificate chain could not be built to a trusted root authority. (0x800B010A)

@splincode
Copy link
Owner

Посмотрю, что можно сделать

@pavenkostanislav
Copy link
Author

Зараннее спасибо

@splincode
Copy link
Owner

Должны выполняться требования для сертификатов, которые участвуют в подписании (ваш\TSP и т.п.) - должны быть корневые сертификаты в доверенных корневых.
Посмотрите ответы здесь:
http://www.cryptopro.ru/forum2/default.aspx?g=posts&m=83361#post83361

Если используете тестовую службу: скачайте и установите тестовый корневой сертификат "Тестовый УЦ ООО "КРИПТО-ПРО"".
http://www.cryptopro.ru/forum2/default.aspx?g=posts&m=83398#post83398

@pavenkostanislav
Copy link
Author

Да спасибо. С тестовой службой подпись создалась, но теперь проблема в проверке её:

Сервер электронной подписи КриптоПро DSS
Результат проверки

Название документа spravka_soc_viplaty_09.08.2017.pdf.p7s
Подпись 1
Результат проверки
Подпись не действительна

Дополнительная информация
Не удалось проверить подпись CAdES-XLT1. Ошибка: [Неправильное значение хеша]. Код: [0x80091007].Сообщение содержит неверную подпись.

Дополнительная информация о подписи
Формат подписи CAdES
Подпись в формате XLT1

Время подписи, полученное из штампа
9/7/2017 10:21:14 AM
Время подписи
9/7/2017 10:21:02 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

@splincode
Copy link
Owner

В принципе, ответы оставляют на форуме сотрудники КриптоПро, если что пишите сюда решение

@pavenkostanislav
Copy link
Author

pavenkostanislav commented Sep 7, 2017

Форум A certificate chain could not be built to a trusted root authority. (0x800B010A)

Пока нет ответа

но с начала переписки в приципе какая-то подпись создалась и ошибки нет больше.

Вот только эта подпись не проходит проверку в Контуре.Крипто и даже в КриптоПро DSS

@splincode
Copy link
Owner

Приложите документ и подпись

@splincode
Copy link
Owner

А подпись?

@pavenkostanislav
Copy link
Author

pavenkostanislav commented Sep 7, 2017

sign.zip
Вот так лучше всего. не все форматы можно добавлять

@pavenkostanislav
Copy link
Author

pavenkostanislav commented Sep 7, 2017

Если код подписания выглядит так:

this.crypto.then(
            () => {
                this.crypto.signature(certThumbprint, file.file)
                    .then(
                    (res: any) => {
                        this.PDFBase64String = res;
                        console.log(this.PDFBase64String);

                        let b64Data = this.PDFBase64String;
                        if (b64Data) {
                            let contentType = 'application/pkcs7-signature';

                            //let byteCharacters: string;
                            //if (this.crypto.isChromium) {
                            //    byteCharacters = window.atob(b64Data);
                            //} else {
                            //    byteCharacters = Base64.decode(b64Data);
                            //}

                            let byteNumbers = new Array(b64Data.length);

                            for (var i = 0; i < b64Data.length; i++)
                                byteNumbers[i] = b64Data.charCodeAt(i);

                            let byteArray = new Uint8Array(byteNumbers);

                            let blob = new Blob([byteArray], { type: contentType });

                            console.log(blob.size);

                            let url = window.URL.createObjectURL(blob);

                            if (window.navigator.msSaveBlob) {
                                window.navigator.msSaveOrOpenBlob(blob, file.description + ".p7s");
                            } else {
                                var link = document.createElement('a');
                                link.href = window.URL.createObjectURL(blob);
                                link.setAttribute('download', file.description + ".p7s");
                                document.body.appendChild(link);
                                link.click();
                                document.body.removeChild(link);
                            }
                        }
                    }
                    , (error) => {
                        console.error(error);
                    });
            }
            , (error) => {
                console.error(error);
            });
    }

Тогда:
sign.zip

Ключевое отличие тут:

//let byteCharacters: string;
//if (this.crypto.isChromium) {
// byteCharacters = window.atob(b64Data);
//} else {
// byteCharacters = Base64.decode(b64Data);
//}

@splincode
Copy link
Owner

Это рабочая версия? Надо будет добавить код в основной репозиторий, когда появится новая версия, я обязательно вам пришли, чтобы вы сделали pull request

@pavenkostanislav
Copy link
Author

pavenkostanislav commented Sep 7, 2017

Ну как рабочая. Сертификат проверку не проходит
вырезка из рабочего проекта тут pavenkostanislav/GetingCertificatesList можно посмотреть, но если честно я его не компилил.

@splincode
Copy link
Owner

подпись не проходит проверку.

Хеш указанного файла:
CB AE CB 61 1C 3B F9 6A 8E B1 63 B3 CE E7 EA D5 05 1F A4 C1 9B EF 15 FB 98 64 1F 3D 0C BB 84 C3

а в p7s прохешировано было что-то "другое":
64 D5 52 BF 80 B9 0E B1 C9 3D 29 83 5D 54 D5 57 0C F4 B0 45 9B 92 D9 79 D9 43 13 05 81 BB 2B FF

  • ASN.1 анализатор выдал 1 предупреждение и 1 ошибку.

позиция:
3300 0: [0] Error: Object has zero length.
3302 15: GeneralizedTime 07/09/2017 07:21:15 GMT

Warning: Further data follows ASN.1 data at position 10798.

@pavenkostanislav
Copy link
Author

pavenkostanislav commented Sep 7, 2017

Ну для начала спасибо.
Но мне бы больше информации.
Я тем же путём создавал прикреплённую подпись - всё проходит проверку
Ещё ошибку пофиксил:
oSignedData.Content = dataToSign.replace('data:application/pdf;base64,', '');

@pavenkostanislav
Copy link
Author

pavenkostanislav commented Sep 8, 2017

Доброе время суток, уже близок к усуществению отсоединённой подписи, присоединённая уже получается и проходит проверку на сайте Сервер электронной подписи КриптоПро DSS.
Возможно Вы сможете помочь с решением вопроса: "Отсоединённой подпись не проходит проверку, а присоединённая подпись проходит"

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


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

@splincode
Copy link
Owner

Удалось ли что-нибудь сделать?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants