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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Сергей1102  
#1 Оставлено : 21 января 2020 г. 13:55:09(UTC)
Сергей1102

Статус: Участник

Группы: Участники
Зарегистрирован: 04.07.2019(UTC)
Сообщений: 26

Добрый день!

Есть PDF-файл, подписанный при помощи КриптоПро PDF, к этому же файлу как-то прикреплен открытый ключ, которым можно проверить подпись.
Подскажете, как вытащить этот открытый ключ чтоб проверить подпись?
Возможно проверить подпись не вытаскивая ключ?
Offline Михаил Селезнёв  
#2 Оставлено : 22 января 2020 г. 9:06:15(UTC)
Михаил Селезнёв

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

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

Сказал «Спасибо»: 3 раз
Поблагодарили: 54 раз в 53 постах
Добрый день!
На машине, на которой проверяется файл, установлены КриптоПро CSP и КриптоПро PDF?
Offline Сергей1102  
#3 Оставлено : 22 января 2020 г. 11:23:51(UTC)
Сергей1102

Статус: Участник

Группы: Участники
Зарегистрирован: 04.07.2019(UTC)
Сообщений: 26

Автор: Михаил Селезнёв Перейти к цитате
Добрый день!
На машине, на которой проверяется файл, установлены КриптоПро CSP и КриптоПро PDF?


Нет, установлено только JCP. Вышеописанную процедуру нужно проделать в коде Java.
Offline Михаил Селезнёв  
#4 Оставлено : 22 января 2020 г. 12:22:28(UTC)
Михаил Селезнёв

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

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

Сказал «Спасибо»: 3 раз
Поблагодарили: 54 раз в 53 постах
В составе архива samples-sources.jar в дистрибутиве есть пакет PDF, там примеры проверки/создания подписи PDF. Библиотека PDF находится в дистрибутиве в папке Doc\itextpdf\
Offline Сергей1102  
#5 Оставлено : 22 января 2020 г. 16:31:07(UTC)
Сергей1102

Статус: Участник

Группы: Участники
Зарегистрирован: 04.07.2019(UTC)
Сообщений: 26

Автор: Михаил Селезнёв Перейти к цитате
В составе архива samples-sources.jar в дистрибутиве есть пакет PDF, там примеры проверки/создания подписи PDF. Библиотека PDF находится в дистрибутиве в папке Doc\itextpdf\


Если я правильно понял, библиотеку itextpdf нужно пропатчить, чтоб она понимала алгоритмы шифрования криптопро. По указанному пути лежит библиотека itextpdf_patched-5.5.5.jar, из названия вроде как следует, что это пропатченная библиотека, но при ее использовании получаю ошибку: ExceptionConverter: java.security.NoSuchAlgorithmException: GOST3411_2012_256.
Также по тому пути лежит файл - itextpdf_5.5.5.gost.patch. Нужно самостоятельно пропатчить библиотеку при помощи этого файла?
Online Евгений Афанасьев  
#6 Оставлено : 22 января 2020 г. 17:47:13(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,916
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Да, есть 2 версии уже пропатченных библиотек. Также это можно сделать самому, в папках с библиотеками есть readme.
При какой операции получаете ошибку? Приведите пример, пожалуйста. Также нужны версия JCP в формате x.y.zzzzz и bouncycastle (должен быть из папки dependencies дистрибутива JCP).
Offline Сергей1102  
#7 Оставлено : 23 января 2020 г. 13:01:29(UTC)
Сергей1102

Статус: Участник

Группы: Участники
Зарегистрирован: 04.07.2019(UTC)
Сообщений: 26

Автор: Евгений Афанасьев Перейти к цитате
Да, есть 2 версии уже пропатченных библиотек. Также это можно сделать самому, в папках с библиотеками есть readme.
При какой операции получаете ошибку? Приведите пример, пожалуйста. Также нужны версия JCP в формате x.y.zzzzz и bouncycastle (должен быть из папки dependencies дистрибутива JCP).


JCP 2.0.40502, bouncycastle 1.50

Код:

PdfReader pdfReader = new PdfReader(IN_PDF_FILE);
AcroFields fields = pdfReader.getAcroFields();
fields.getFields();
ArrayList<String> signatureNames = fields.getSignatureNames();
for (String signatureName : signatureNames) {
   log.info("signatureName: " + signatureName);
   PdfPKCS7 pkcs7 = fields.verifySignature(signatureName, JCP.PROVIDER_NAME);
   log.info("pkcs7.verify(): " + pkcs7.verify());
}


При использовании itextpdf_patched-5.5.5 на 8-й строке вылетает:

ExceptionConverter: java.security.NoSuchAlgorithmException: GOST3411_2012_256
at com.itextpdf.text.pdf.security.BouncyCastleDigest.getMessageDigest(BouncyCastleDigest.java:95)
at com.itextpdf.text.pdf.security.PdfPKCS7.<init>(PdfPKCS7.java:437)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2371)

Если сходить в класс, который возвращает ошибку:
Код:

package com.itextpdf.text.pdf.security;

import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.bouncycastle.jcajce.provider.digest.MD2.Digest;

public class BouncyCastleDigest implements ExternalDigest {
    public BouncyCastleDigest() {
    }

    public MessageDigest getMessageDigest(String hashAlgorithm) throws GeneralSecurityException {
        String oid = DigestAlgorithms.getAllowedDigests(hashAlgorithm);
        if (oid == null) {
            throw new NoSuchAlgorithmException(hashAlgorithm);
        } else if (oid.equals("1.2.840.113549.2.2")) {
            return new Digest();
        } else if (oid.equals("1.2.840.113549.2.5")) {
            return new org.bouncycastle.jcajce.provider.digest.MD5.Digest();
        } else if (oid.equals("1.3.14.3.2.26")) {
            return new org.bouncycastle.jcajce.provider.digest.SHA1.Digest();
        } else if (oid.equals("2.16.840.1.101.3.4.2.4")) {
            return new org.bouncycastle.jcajce.provider.digest.SHA224.Digest();
        } else if (oid.equals("2.16.840.1.101.3.4.2.1")) {
            return new org.bouncycastle.jcajce.provider.digest.SHA256.Digest();
        } else if (oid.equals("2.16.840.1.101.3.4.2.2")) {
            return new org.bouncycastle.jcajce.provider.digest.SHA384.Digest();
        } else if (oid.equals("2.16.840.1.101.3.4.2.3")) {
            return new org.bouncycastle.jcajce.provider.digest.SHA512.Digest();
        } else if (oid.equals("1.3.36.3.2.2")) {
            return new org.bouncycastle.jcajce.provider.digest.RIPEMD128.Digest();
        } else if (oid.equals("1.3.36.3.2.1")) {
            return new org.bouncycastle.jcajce.provider.digest.RIPEMD160.Digest();
        } else if (oid.equals("1.3.36.3.2.3")) {
            return new org.bouncycastle.jcajce.provider.digest.RIPEMD256.Digest();
        } else if (oid.equals("1.2.643.2.2.9")) {
            return new org.bouncycastle.jcajce.provider.digest.GOST3411.Digest();
        } else {
            throw new NoSuchAlgorithmException(hashAlgorithm);
        }
    }
}


то увидим, что OID 1.2.643.7.1.1.2.2, который идентифицирует GOST3411_2012_256 нету в этой череде else if, потому возвращает NoSuchAlgorithmException.

НО, если использовать itextpdf_patched-5.1.3, то все отрабатывает и строка 10 моего кода возвращает true.
При этом в itextpdf_patched-5.1.3 вообще нет package com.itextpdf.text.pdf.security


Вопрос 1 - что-то не так с библиотекой itextpdf_patched-5.5.5?
Вопросы 2 - если pkcs7.verify() == true, значит с сертом все ОК? В таком случае, где происходит участие открытого ключа при проверке подписи?



Online Евгений Афанасьев  
#8 Оставлено : 23 января 2020 г. 13:56:15(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,916
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Автор: Сергей1102 Перейти к цитате

ExceptionConverter: java.security.NoSuchAlgorithmException: GOST3411_2012_256
at com.itextpdf.text.pdf.security.BouncyCastleDigest.getMessageDigest(BouncyCastleDigest.java:95)
at com.itextpdf.text.pdf.security.PdfPKCS7.<init>(PdfPKCS7.java:437)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2371)
увидим, что OID 1.2.643.7.1.1.2.2, который идентифицирует GOST3411_2012_256 нету в этой череде else if, потому возвращает NoSuchAlgorithmException.
НО, если использовать itextpdf_patched-5.1.3, то все отрабатывает и строка 10 моего кода возвращает true.
При этом в itextpdf_patched-5.1.3 вообще нет package com.itextpdf.text.pdf.security
Вопрос 1 - что-то не так с библиотекой itextpdf_patched-5.5.5?
Вопросы 2 - если pkcs7.verify() == true, значит с сертом все ОК? В таком случае, где происходит участие открытого ключа при проверке подписи?

Вопрос 1:
Возможно, у вас CAdES подпись (а не PKCS7) в PDF, тогда выполняется условие isCades и далее используется метод (new BouncyCastleDigest()).getMessageDigest(), не учитывающий ГОСТ, вместо модифицированного DigestAlgorithms.getMessageDigest(). Спасибо, учтем это в следующей сборке.
Текущее решение для 5.5.5: применить патч к библиотеке itextpdf, как в readme, и исправить место в BouncyCastleDigest, добавив в getMessageDigest проверку на ГОСТ и создание объекта с нужным алгоритмом (MessageDigest.getInstance(algorithm)).
Вопросы 2:
да, подпись проверилась. Получение открытого ключа происходит при проверке подписи, в объект Signature внутри itextpdf передается сертификат, с помощью его открытого ключа происходит проверка подписи. Также этот сертификат можно получить после verify() - это pkcs7.getSigningCertificate().

Отредактировано пользователем 23 января 2020 г. 14:05:46(UTC)  | Причина: Не указана

Offline Сергей1102  
#9 Оставлено : 17 февраля 2020 г. 16:20:56(UTC)
Сергей1102

Статус: Участник

Группы: Участники
Зарегистрирован: 04.07.2019(UTC)
Сообщений: 26

Автор: Евгений Афанасьев Перейти к цитате

Вопрос 1:
Возможно, у вас CAdES подпись (а не PKCS7) в PDF, тогда выполняется условие isCades и далее используется метод (new BouncyCastleDigest()).getMessageDigest(), не учитывающий ГОСТ, вместо модифицированного DigestAlgorithms.getMessageDigest(). Спасибо, учтем это в следующей сборке.
Текущее решение для 5.5.5: применить патч к библиотеке itextpdf, как в readme, и исправить место в BouncyCastleDigest, добавив в getMessageDigest проверку на ГОСТ и создание объекта с нужным алгоритмом (MessageDigest.getInstance(algorithm)).
Вопросы 2:
да, подпись проверилась. Получение открытого ключа происходит при проверке подписи, в объект Signature внутри itextpdf передается сертификат, с помощью его открытого ключа происходит проверка подписи. Также этот сертификат можно получить после verify() - это pkcs7.getSigningCertificate().


Добрый день. Спасибо за ответы. Правильно я понимаю, что этот код проверяет только валидность подписи и нужно проверить еще сам сертификат, его корневые сертификаты и так же по списку отозванных?

Online Евгений Афанасьев  
#10 Оставлено : 18 февраля 2020 г. 11:19:41(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,916
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
У itextpdf есть методы проверки, посмотрите пример SignVerifyPDFExample из пакета PDF в sampels-sources.jar.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.