Статус: Активный участник
Группы: Участники
Зарегистрирован: 11.12.2019(UTC) Сообщений: 30
Сказал(а) «Спасибо»: 11 раз
|
Добрый день, используем JCP 2.0.41940-A для подписи pdf с визуализацией подписи через библиотеку itextpdf-5.5.5-patched.jar из состава JCP. Код очень похож на пример из samples.jar: Код:
PdfReader reader = new PdfReader("test_in.pdf");
FileOutputStream fout = new FileOutputStream("test_out.pdf");
PdfStamper stp = false //не добавляем подписи, всегда новая
? PdfStamper.createSignature(reader, fout, '\0', null, true)
: PdfStamper.createSignature(reader, fout, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setReason("test");
sap.setLocation("MSK");
sap.setCertificate(cert); // серт которым подписываем
FileInputStream fis = new FileInputStream("scr.png"); //чтение картинки которая будет добавлена в подпись для визуализации
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while ((n = fis.read(buf, 0, buf.length)) != -1) {
baos.write(buf, 0, n);
}
fis.close();
byte[] im = baos.toByteArray();
Image image = Image.getInstance(im);
sap.setImage(image);
sap.setVisibleSignature(new Rectangle(150, 150), 1, null);
PdfSignature dic = new PdfSignature(PdfName.ADOBE_CryptoProPDF, PdfName.ADBE_PKCS7_DETACHED); // не уверен что тут правильные значения
dic.setReason(sap.getReason());
dic.setLocation(sap.getLocation());
dic.setSignatureCreator(sap.getSignatureCreator());
dic.setContact(sap.getContact());
dic.setDate(new PdfDate(sap.getSignDate())); // time-stamp will over-rule this
sap.setCryptoDictionary(dic);
int estimatedSize = 8192 * 4; // пришлось увеличить это значение, если в цепочку добавлять все серты, но с одним сертификатом проблема такая же
HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
exc.put(PdfName.CONTENTS, new Integer(estimatedSize * 2 + 2));
sap.preClose(exc);
PdfPKCS7 sgn = new PdfPKCS7(privateKey, chain,
JCP.GOST_DIGEST_2012_256_NAME, JCP.PROVIDER_NAME, null, false);
InputStream stream = sap.getRangeStream();
MessageDigest md = MessageDigest.getInstance(JCP.GOST_DIGEST_2012_256_NAME);
byte hash[] = DigestAlgorithms.digest(stream, md);
Calendar cal = Calendar.getInstance();
byte[] sh = sgn.getAuthenticatedAttributeBytes(hash, cal,
null, null, MakeSignature.CryptoStandard.CMS);
sgn.update(sh, 0, sh.length);
byte[] encodedSig = sgn.getEncodedPKCS7(hash, cal);
if (estimatedSize < encodedSig.length) {
throw new IOException("Not enough space");
} // if
byte[] paddedSig = new byte[estimatedSize];
System.arraycopy(encodedSig, 0, paddedSig, 0, encodedSig.length);
PdfDictionary dic2 = new PdfDictionary();
dic2.put(PdfName.CONTENTS, new PdfString(paddedSig).setHexWriting(true));
sap.close(dic2);
stp.close();
fout.close();
reader.close();
После выполнения кода картинка добавляется на pdf, но signed by пустой - ""(). Дальнейшая проверка подписи также показывает что подпись не выполнена. Пробовали добавлять в chain и только сертификат для privateKey и вообще все сертификаты находящиеся в контейнере, но подпись так и не проставляется. Помогите понять в чем дело пожалуйста.
|