Статус: Участник
Группы: Участники
Зарегистрирован: 04.07.2019(UTC) Сообщений: 26
|
Добрый день!
Есть PDF-файл, подписанный при помощи КриптоПро PDF, к этому же файлу как-то прикреплен открытый ключ, которым можно проверить подпись. Подскажете, как вытащить этот открытый ключ чтоб проверить подпись? Возможно проверить подпись не вытаскивая ключ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 05.04.2017(UTC) Сообщений: 363   Сказал «Спасибо»: 3 раз Поблагодарили: 54 раз в 53 постах
|
Добрый день! На машине, на которой проверяется файл, установлены КриптоПро CSP и КриптоПро PDF?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.07.2019(UTC) Сообщений: 26
|
Автор: Михаил Селезнёв  Добрый день! На машине, на которой проверяется файл, установлены КриптоПро CSP и КриптоПро PDF? Нет, установлено только JCP. Вышеописанную процедуру нужно проделать в коде Java.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 05.04.2017(UTC) Сообщений: 363   Сказал «Спасибо»: 3 раз Поблагодарили: 54 раз в 53 постах
|
В составе архива samples-sources.jar в дистрибутиве есть пакет PDF, там примеры проверки/создания подписи PDF. Библиотека PDF находится в дистрибутиве в папке Doc\itextpdf\
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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. Нужно самостоятельно пропатчить библиотеку при помощи этого файла?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Да, есть 2 версии уже пропатченных библиотек. Также это можно сделать самому, в папках с библиотеками есть readme. При какой операции получаете ошибку? Приведите пример, пожалуйста. Также нужны версия JCP в формате x.y.zzzzz и bouncycastle (должен быть из папки dependencies дистрибутива JCP). |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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, значит с сертом все ОК? В таком случае, где происходит участие открытого ключа при проверке подписи?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Автор: Сергей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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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().
Добрый день. Спасибо за ответы. Правильно я понимаю, что этот код проверяет только валидность подписи и нужно проверить еще сам сертификат, его корневые сертификаты и так же по списку отозванных?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
У itextpdf есть методы проверки, посмотрите пример SignVerifyPDFExample из пакета PDF в sampels-sources.jar. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close