Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.03.2012(UTC) Сообщений: 54 Откуда: Белгород
|
Скажите, пожалуйста, чем отличаются эти два способа подписи PDF? Первый: Цитата: private byte[] sign(byte[] pdf, Certificate certificate, PrivateKey privateKey) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, DocumentException, XmlDSignException, InternalCryptoException { Certificate[] chain = new Certificate[] {certificate};
PdfReader reader = new PdfReader(pdf); ByteArrayOutputStream out = new ByteArrayOutputStream(); PdfStamper stp = PdfStamper.createSignature(reader, out, '\0'); PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(privateKey, chain, null, PdfName.ADOBE_CryptoProPDF); sap.setReason("I'm the author"); sap.setLocation("Lisbon"); // comment next line to have an invisible signature sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null); stp.close();
return out.toByteArray(); }
Второй: Цитата: private byte[] a(byte[] pdf, X509Certificate certificate, PrivateKey privateKey) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, DocumentException, XmlDSignException, InternalCryptoException, CryptoDataException { PdfReader reader = new PdfReader(pdf); ByteArrayOutputStream out = new ByteArrayOutputStream(); PdfStamper st = PdfStamper.createSignature(reader, out, '\0');
PdfSignatureAppearance sap = st.getSignatureAppearance();
X509Certificate[] chain = new X509Certificate[] {certificate}; sap.setCrypto(null, chain, null, null); sap.setReason("I like to sign"); sap.setLocation("Universe"); sap.setAcro6Layers(true); sap.setRender(PdfSignatureAppearance.SignatureRenderNameAndDescription); sap.setSignDate(new GregorianCalendar());
// Выбираем подходящий тип фильтра PdfName filterName = new PdfName("CryptoPro#20PDF");
// Создаем подпись PdfSignature dic = new PdfSignature(filterName, PdfName.ADBE_PKCS7_DETACHED); dic.setDate(new PdfDate(sap.getSignDate())); dic.setName(PdfPKCS7.getSubjectFields(chain[0]).getField("CN")); if (sap.getReason() != null) { dic.setReason(sap.getReason()); } if (sap.getLocation() != null) { dic.setLocation(sap.getLocation()); } sap.setCryptoDictionary(dic);
int intCSize = 100000; HashMap<PdfName, Integer> hashtable = new HashMap<PdfName, Integer>(); hashtable.put(PdfName.CONTENTS, intCSize * 2 + 2); sap.preClose(hashtable);
// Вычисляем подпись
byte[] pk = cryptoService.signData(IOUtils.toByteArray(sap.getRangeStream()), certificate.getEncoded(), null, null);
// Помещаем подпись в документ PdfDictionary dic2 = new PdfDictionary(); byte[] outc = Arrays.copyOf(pk, pk.length); dic2.put(PdfName.CONTENTS, new PdfString(outc).setHexWriting(true)); sap.close(dic2); return out.toByteArray(); }
Используется алгоритм ГОСТ. Первый способ не проверяется потом в Java-коде и Adobe Reader с плагином говорит, что SIGNATURE INVALID. Второй способ успешно проверяется в Java-коде, но Adobe Reader пишет, что подпись требует валидации, жму проверку, он предлагает выбрать обработчик, выбираю и получаю ошибку: Цитата:Error during signature verification.
Signature contains incorrect, unrecognized, corrupted or suspicious data. Support Information: SigDict /Contents illegal data Отредактировано пользователем 23 июля 2012 г. 17:26:40(UTC)
| Причина: Не указана
|