Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|