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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline pugart  
#1 Оставлено : 11 августа 2021 г. 10:51:46(UTC)
pugart

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

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

Добрый день. Не удается добавить подпись к файлу с прикрепленной подписью, который был подписан плагином из браузера (к расширению файла после подписание плагином добавляется расширение .sig, соответственно размер файла увеличивается на подпись).

- дистрибутив КриптоПро JCP и JTLS R2 (2.0.40035)

Если я правильно понимаю процесс, то сначала мне нужно достать подпись из этого файла (file.pdf.sig)

Цитата:

data = request.getBytes(StandardCharsets.UTF_8)

ByteArrayInputStream dataStream = new ByteArrayInputStream(data);

CAdESSignature existCadesSignature = new CAdESSignature(dataStream,
null, null);

Collection<SignerInformation> existSignerInfos = new ArrayList<>();

for (CAdESSigner signer : existCadesSignature.getCAdESSignerInfos()) {
existSignerInfos.add(signer.getSignerInfo());
}

добавляю новую подпись

CAdESSignature otherSignerCadesSignature = new CAdESSignature(false);

otherSignerCadesSignature.addSigner("JCP", privateKey, Arrays.asList(certificateChain), CAdESType.CAdES_BES, null, false,
new AttributeTable(this.getSignTimeStamp(new Date())),
null);

дальше код из примера

OutputStream outSignatureStream = new ByteArrayOutputStream();

otherSignerCadesSignature.open(outSignatureStream);
cadesSignatureUpdate(otherSignerCadesSignature, dataStream);
otherSignerCadesSignature.close();

InputStream signatureStream = null;

byte[] tmp = ((ByteArrayOutputStream)outSignatureStream).toByteArray();
signatureStream = new ByteArrayInputStream(tmp);

CAdESSignature otherSignerCAdESSignatureParsed = new CAdESSignature(
signatureStream, null, null);
CAdESSigner otherSigner = otherSignerCAdESSignatureParsed.getCAdESSignerInfo(0);

// Добавляем нового подписанта в список подписантов.
existSignerInfos.add(otherSigner.getSignerInfo());

InputStream existCMSSignedDataStream = dataStream;

OutputStream newCMSSignedDataBuffer = new ByteArrayOutputStream();

// Обновляем исходную подпись c ее начальным списком из 1-2 подписантов
// на тот же, но + новый подписант. Т.е. стало подписантов на одного больше.
CAdESSignature.replaceSigners(existCMSSignedDataStream,
new SignerInformationStore(existSignerInfos), newCMSSignedDataBuffer);

existCMSSignedDataStream.close();
newCMSSignedDataBuffer.close();

return ((ByteArrayOutputStream)newCMSSignedDataBuffer).toByteArray();

======================

падаю на строчке, предполагаю, что туда нужно подавать чистую (открепленную подпись), но таковой у меня нет, т.к. файл подписывается плагином и физически данных о подписи у меня нет.
Цитата:

CAdESSignature existCadesSignature = new CAdESSignature(dataStream,
null, null);

2021-08-10 16:55:04.323 WARN 51 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
2021-08-10 17:38:14.970 ERROR 51 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is Unexpected object reading content.; error codes: [-2] 'Application error', ] with root cause
java.lang.ClassCastException: org.bouncycastle.asn1.DERApplicationSpecific cannot be cast to org.bouncycastle.asn1.ASN1SequenceParser
at org.bouncycastle.cms.CMSContentInfoParser.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
at org.bouncycastle.cms.CMSSignedDataParser.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
at org.bouncycastle.cms.CMSSignedDataParser.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
at ru.CryptoPro.CAdES.CAdESSignature.<init>(Unknown Source) ~[CAdES.jar:40035]
at ru.CryptoPro.CAdES.CAdESSignature.<init>(Unknown Source) ~[CAdES.jar:40035]
at ru.CryptoPro.CAdES.CAdESSignature.<init>(Unknown Source) ~[CAdES.jar:40035]
at com.farzoom.common.api.jcp.services.dsig.CAdES_BESCryptoProSigner.sign(CAdES_BESCryptoProSigner.java:69) ~[classes!/:1.3.14]
at com.farzoom.common.api.jcp.services.dsig.BaseCryptoProSigner.getBase64EncodedSignatureAttached(BaseCryptoProSigner.java:57) ~[classes!/:1.3.14]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_222]


подскажите, пожалуйста, что делаю не так?

у меня есть работоспособный код, но он добавляет еще одну .sig сверху файла, этот вариант не подходит.
Цитата:

Collection<X509CertificateHolder> holderList = new ArrayList<>();
for (Certificate cert1 : certificateChain) {
holderList.add(new X509CertificateHolder(cert1.getEncoded()));
}

CAdESSignature cadesSignature = new CAdESSignature(false);
cadesSignature.setCertificateStore(new CollectionStore(holderList));

cadesSignature.addSigner("JCP", privateKey, Arrays.asList(certificateChain), CAdESType.CAdES_BES, null, false,
new AttributeTable(this.getSignTimeStamp(new Date())), // неподписываемые атрибуты
null);
ByteArrayOutputStream output = new ByteArrayOutputStream();
cadesSignature.open(output);
cadesSignature.update(data);
cadesSignature.close();

return output.toByteArray();

Отредактировано пользователем 11 августа 2021 г. 10:53:49(UTC)  | Причина: Не указана

Online Евгений Афанасьев  
#2 Оставлено : 13 августа 2021 г. 9:43:51(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Здравствуйте.
В какой строке ошибка?
Offline pugart  
#3 Оставлено : 13 августа 2021 г. 11:31:30(UTC)
pugart

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

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

на этой строчке, она находится в первом блоке. dataStream - это документ с прикрепленной подписью, который получился при подписании плагином через браузер (test.pdf.sig)

Цитата:
CAdESSignature existCadesSignature = new CAdESSignature(dataStream,
null, null);


2021-08-10 16:55:04.323 WARN 51 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
2021-08-10 17:38:14.970 ERROR 51 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is Unexpected object reading content.; error codes: [-2] 'Application error', ] with root cause
java.lang.ClassCastException: org.bouncycastle.asn1.DERApplicationSpecific cannot be cast to org.bouncycastle.asn1.ASN1SequenceParser
at org.bouncycastle.cms.CMSContentInfoParser.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
at org.bouncycastle.cms.CMSSignedDataParser.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
at org.bouncycastle.cms.CMSSignedDataParser.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
at ru.CryptoPro.CAdES.CAdESSignature.<init>(Unknown Source) ~[CAdES.jar:40035]
at ru.CryptoPro.CAdES.CAdESSignature.<init>(Unknown Source) ~[CAdES.jar:40035]
at ru.CryptoPro.CAdES.CAdESSignature.<init>(Unknown Source) ~[CAdES.jar:40035]
at com.farzoom.common.api.jcp.services.dsig.CAdES_BESCryptoProSigner.sign(CAdES_BESCryptoProSigner.java:69) ~[classes!/:1.3.14]
at com.farzoom.common.api.jcp.services.dsig.BaseCryptoProSigner.getBase64EncodedSignatureAttached(BaseCryptoProSigner.java:57) ~[classes!/:1.3.14]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_222]



Online Евгений Афанасьев  
#4 Оставлено : 13 августа 2021 г. 13:49:20(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Из base64 в der декодировали данные перед подачей?
Offline pugart  
#5 Оставлено : 13 августа 2021 г. 16:31:44(UTC)
pugart

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

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

видимо нет, byte[] data = request.getBytes(StandardCharsets.UTF_8)

буду очень благодарен, если сможете привести пример, как это сделать на java.
Online Евгений Афанасьев  
#6 Оставлено : 13 августа 2021 г. 16:34:35(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Например, используя ru.CryptoPro.JCP.tools.Decoder:
Код:

Decoder decoder = new Decoder();
byte[] derData = decoder.decode(request);

Здесь request - строка с подписью в BASE64-формате.

Отредактировано пользователем 13 августа 2021 г. 23:08:20(UTC)  | Причина: Не указана

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