Статус: Активный участник
Группы: Участники
Зарегистрирован: 05.08.2019(UTC) Сообщений: 65
Сказал(а) «Спасибо»: 4 раз
|
Автор: Санчир Момолдаев  //hardcoded CMStools.DIGEST_OID и т.д. по тексту. используются старые оиды.т.к. примеры старые. сама ключевая пара у вас скорее всего 2012-256. необходимо поправить оиды Здравствуйте! Проблема, вроде как, решилась частично. В нашем проекте идет как и встроенная, так и открепленная подпись PDF документа. Сначала PDF подписывается встроенной, а потом открепленной. Почему так было сделано, не очень понятно. Тем не менее, если выбрать рандомный файл, получить из него массив байт - JCP без проблем его подписывает. Думаю, тут больше вопрос к itext и их утилитам, а не к криптопро. (непонятно как получить массив байт из созданного и уже подписанного PDFника). Хотя не исключаю ошибки в коде: Цитата:public void signPdf(InputStream is, String folder, String fileNameWoExtension) throws Exception { PrivateKey key = keyStore.getPrivateKey(); Certificate[] chain = new Certificate[1]; chain[0] = keyStore.getCertificate();
X509Certificate cert = (X509Certificate)chain[0]; Date notBefore = cert.getNotBefore(); Date notAfter = cert.getNotAfter(); String serial = cert.getSerialNumber().toString(16).toUpperCase(); String subject = PdfPKCS7.getSubjectFields(cert).getField("CN"); String number = fileNameWoExtension.replace("doc_", ""); // reader and stamper PdfReader reader = new PdfReader(is); FileOutputStream fout = new FileOutputStream(folder + File.separator + fileNameWoExtension + ".pdf"); PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
StampsCreator.createEdsStamp(folder, serial, subject, notBefore, notAfter); StampsCreator.createRegisterStamp(folder, new Date(), number);
PdfContentByte pcb = stp.getOverContent(1); Image imageEds = Image.getInstance(folder + File.separator + StampsCreator.EDS_STAMP); imageEds.scaleAbsolute(200, 87); imageEds.setAbsolutePosition(75, 80); imageEds.setAnnotation(new Annotation(0, 0, 0, 0, 3)); pcb.addImage(imageEds);
Image imageReg = Image.getInstance(folder + File.separator + StampsCreator.REGNUMBER_STAMP); imageReg.scaleAbsolute(207, 20); int height = (int) Math.floor(reader.getPageSize(1).getHeight()); imageReg.setAbsolutePosition(70, height - 130); imageReg.setAnnotation(new Annotation(0, 0, 0, 0, 3)); pcb.addImage(imageReg);
PdfSignatureAppearance sap = stp.getSignatureAppearance(); sap.setSignDate(new GregorianCalendar()); sap.setCrypto(null, chain, null, null); sap.setAcro6Layers(true); sap.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION); PdfSignature dic; dic = new PdfSignature(PdfName.ADOBE_CryptoProPDF, PdfName.ADBE_PKCS7_DETACHED); dic.setDate(new PdfDate(sap.getSignDate()));
dic.setName(subject); dic.setReason("Signed with CryptoPro"); sap.setCryptoDictionary(dic); int csize = 4000; HashMap<PdfName,Integer> exc = new HashMap<PdfName,Integer>(); exc.put(PdfName.CONTENTS, new Integer(csize * 2 + 2)); sap.preClose(exc); System.out.println("preclosed " + key.getClass().getName() + " " + key.getAlgorithm());
X509Certificate signerCert = (X509Certificate)chain[0];
byte [] pk = createPKCS7(IOUtils.toByteArray(sap.getRangeStream()), key, signerCert); System.out.println("p7s data ready."); byte[] outc = new byte[csize]; PdfDictionary dic2 = new PdfDictionary(); System.arraycopy(pk, 0, outc, 0, pk.length); dic2.put(PdfName.CONTENTS, new PdfString(outc).setHexWriting(true)); System.out.println("signed ready."); sap.close(dic2); FileOutputStream fos = new FileOutputStream(folder + File.separator + fileNameWoExtension + ".p7s"); fos.write(pk); fos.close(); } По коду видно, что открепленная подпись кладется в оригинальный PDF файл. Не думаю, что это правильно. Хотя опять же, вопрос не совсем к вам, но если знаете или можете помочь - буду благодарен! А по поводу алгоритмов - я создал утильный класс, позволяющий динамически определять алгоритмы хэширования и подписи, было протестировано, все работает.
|