Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.12.2021(UTC) Сообщений: 253 Откуда: Новосибирск Сказал(а) «Спасибо»: 77 раз Поблагодарили: 1 раз в 1 постах
|
Подскажите по файлу получить информацию ЭЦП? ФИО подписанта, организация, дата подписания и т.п. что касается подписанта - вроде нашел CAdESSignature cAdESSignature = new CAdESSignature(Base64.decode(fileContent), null, null); CAdESSigner cAdESSigner = cAdESSignature.getCAdESSignerInfo(1); получаюю сертификат (хотел из него SubjectName вытащить и оттуда ФИО и т.п.) - возвращает null X509Certificate certificate = cAdESSigner.getSignerCertificate(); файл с присоединённой подписью создал CAdESSignature cadesSignature = new CAdESSignature(isDetached); ... в ГУИ проверка проходит - и информацию о подписанте отображает Отредактировано пользователем 6 декабря 2024 г. 14:55:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.12.2021(UTC) Сообщений: 253 Откуда: Новосибирск Сказал(а) «Спасибо»: 77 раз Поблагодарили: 1 раз в 1 постах
|
Проверку получилось реализовать, но только передав контейнер ключа - такой метод не подходит, т.к. нужно проверять подпись без сертификата которым подписывалось - т.е. на входе файл с присоединённой подписью (либо отсодинённая и файл с данными) Код:
try {
cmsSignedData.verifySignatures();
KeyStore keyStore = KeyStore.getInstance("RutokenStore", "JCP");
keyStore.load(null, null);
// Получаем цепочку сертификатов.
List<Certificate> lChain = Arrays.asList(keyStore.getCertificate("3e428a1c-af93-451d-a456-9889564df7c1"));
// Конвертируем цепочку в X509Certificate.
Collection<X509Certificate> xChain =
Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));
Collection<X509Certificate> chain = new ArrayList<>(List.of());
chain.addAll(xChain);
CAdESSignature cadesToVerify = new CAdESSignature(Base64.decode(fileContent),null,null);
cadesToVerify.verify(new HashSet<>(chain));
CAdESSignature cAdESSignature = new CAdESSignature(Base64.decode(fileContent), null, null);
CAdESSigner cAdESSigner = cAdESSignature.getCAdESSignerInfo(0);
X509Certificate certificate = cAdESSigner.getSignerCertificate();
System.out.println("certificate : "+certificate);
} catch (CAdESException e) {
throw new RuntimeException(e);
}
Да и сам сертификат почему то null В общем этот метод не подохдит, попробую реализовать через CMSSignedData Т.е. цель - адаптировать вот такой код на php https://docs.cryptopro.ru/cades/phpcades/phpcades-samplesна java
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,446 Сказал «Спасибо»: 553 раз Поблагодарили: 2235 раз в 1743 постах
|
Здравствуйте.
Цепочка должна строиться из хранилищ корневых и промежуточных УЦ, а не подключением сертификата из контейнера. |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.12.2021(UTC) Сообщений: 253 Откуда: Новосибирск Сказал(а) «Спасибо»: 77 раз Поблагодарили: 1 раз в 1 постах
|
Автор: Андрей * Здравствуйте.
Цепочка должна строиться из хранилищ корневых и промежуточных УЦ, а не подключением сертификата из контейнера. Как её построить из хранилищ корневых и промежуточных УЦ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.12.2021(UTC) Сообщений: 253 Откуда: Новосибирск Сказал(а) «Спасибо»: 77 раз Поблагодарили: 1 раз в 1 постах
|
в моём случае проверка заработала после того как я изменил её формирование - при подписании добавил сертификаты выложу код, может пригодиться кому Код:
keyStore = KeyStore.getInstance("HDImageStore", "JCP");
alias = "PHP1"; // контейнер с тестовым сертификатом
password = "".toCharArray();
keyStore.load(null, null);
// Закрытый ключ подписи
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password);
// Цепочка сертификатов подписи
List<Certificate> lChain = Arrays.asList(keyStore.getCertificateChain(alias));
// Создаем CAdES подпись.
CAdESSignature cadesSignature = new CAdESSignature(isDetached);
Collection<X509CertificateHolder> certificateHolders = new ArrayList<>();
certificateHolders.add(new X509CertificateHolder(keyStore.getCertificate(alias).getEncoded()));
CollectionStore<X509CertificateHolder> store = new CollectionStore<>(certificateHolders);
cadesSignature.setCertificateStore(store);
// Добавляем CAdES-BES подпись
cadesSignature.addSigner(
JCP.PROVIDER_NAME,
JCP.GOST_DIGEST_OID,
JCP.GOST_EL_KEY_OID,
privateKey,
lChain,
CAdESType.CAdES_BES,
null,
false
);
// Будущая подпись в виде массива.
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
cadesSignature.open(signatureStream); // подготовка контекста
cadesSignature.update(fileContent); // хеширование
cadesSignature.close(); // создание подписи с выводом в signatureStream
signatureStream.close();
// Получаем подпись в виде массива.
return signatureStream.toByteArray();
сама проверка Код:
byte[] fileContent = Base64.decode(file.getBytes());
CAdESSignature cadesToVerify = new CAdESSignature(fileContent, null, null);
cadesToVerify.verify(null);
для отсоединённой Код:
byte[] fileContent = file.getBytes();
byte[] signatureContent = Base64.decode(signature.getBytes());
CAdESSignature cadesToVerify = new CAdESSignature(signatureContent, fileContent, null);
cadesToVerify.verify(null);
правда отрабатывает долго - секунд 30 ... этот вопрос пока не решил Отредактировано пользователем 11 декабря 2024 г. 10:36:59(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close