Подпись PDF itext pkcs7 с несколькими знаками ⇐ JAVA
Подпись PDF itext pkcs7 с несколькими знаками
Я хотел бы поставить несколько подписей в документе PDF, как в рабочем процессе. Я использую следующий код для подписи написанного мной PDF-файла, и он работает нормально.
Чтобы получить хеш
public String getHash() { LOGGER.debug("PDFSigner.getHash: метод вызван"); Строка pdfHashValue = null; пытаться { int contentEstimated = PDFSigner.CONTENT_ESTIMATED;//8192 HashMap exc = new HashMap(); exc.put(PdfName.CONTENTS, contentEstimated * 2 + 2); PdfSignature pdfSignature = новая PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED); pdfSignature.setReason(appearance.getReason()); pdfSignature.setLocation(appearance.getLocation()); pdfSignature.setContact(appearance.getContact()); pdfSignature.setDate(new PdfDate(appearance.getSignDate())); появление.setCryptoDictionary(pdfSignature); появление.preClose(искл); Данные InputStream = появление.getRangeStream(); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); байт buf[] = новый байт[contentEstimated]; интервал п = 0; while ((n = data.read(buf, 0, contentEstimated)) > 0) { messageDigest.update(buf, 0, n); } байтовый хеш[] = messageDigest.digest(); byte[] reqBytesdata = Hex.encode(хеш); pdfHashValue = новая строка (reqBytesdata, «UTF8»); } catch (опыт исключения) { LOGGER.error("Произошла ошибка PDFSigner getHash", exp); } вернуть pdfHashValue; } Чтобы подписать документ
//dSignature — полученная закодированная подпись pkcs7 (SHA256). //начинается с MIIOWQYJKoZIhvcNAQcCo..... public boolean doSign(String dSignature) выдает IOException, DocumentException { логическое значение pdfGenerationStatus = false; пытаться { byte[] PKCS7Response = Base64.decode(dSignature .getBytes("UTF8")); byte[]paddedSig = новый байт[PDFSigner.CONTENT_ESTIMATED]; System.arraycopy(PKCS7Response, 0, PaddedSig, 0, PKCS7Response.length); PdfDictionary pdfDictionary = новый PdfDictionary(); pdfDictionary.put(PdfName.CONTENTS, новый PdfString(paddedSig).setHexWriting(true)); появление.закрыть(pdfDictionary); pdfGenerationStatus = правда; } catch (опыт исключения) { LOGGER.error("doSign", exp); } вернуть pdfGenerationStatus; } И приведенный выше код работает нормально. Мое новое требование — добавить несколько подписей. Есть ли способ повторно использовать этот фрагмент кода для того же самого. Я прошел через это, это и это, но безуспешно.
Кроме этого я попробовал создать несколько пустых подписей и попытаться прикрепить их. Но это привело к созданию поврежденных файлов. Я также попытался создать файл, используя метод, упомянутый в этой ссылке. MakeSignature.signExternalContainer Также просмотрел отличный документ «Цифровые подписи для PDF-документов».
Сценарий использования похож
[*]Создать PDF-файл [*]Создать хеш документа [*]отправить на внешний сервер [*]внешний сервер вернет строку в кодировке pkcs7 base64 [*]добавить подпись в PDF-файл
ОБНОВЛЕНИЕ
Изменение кода касалось «режима добавления», следующее изменение кода привело к тому, что мой код стал поддерживать мультиподпись, спасибо @Paulo Soares, @mlk
private void initAppearanceAppend(String customerName) выдает IOException, DocumentException { System.out.println("PDFSigner.initAppearanceAppend"); PdfReader readpdf = новый PdfReader(this.getInputPdfFilePath()); int LastPageNumber = Readerpdf.getNumberOfPages(); this.pdfSignatureMetaData.setPageNumber(lastPageNumber); this.pdfSignatureMetaData.setSignerName(имя клиента); //this.pdfSignatureMetaData.setPageNumber(PDFSigner.SIGNATURE_PAGE_NUMBER); OutputStream fout = новый FileOutputStream(this.outputPdfFilePath); //PdfStamper Stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0'); СТАРЫЙ КОД БЕЗ РЕЖИМА ДОБАВЛЕНИЯ PdfStamper Stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0', новый файл("E://temp"), true); this.appearance = Stamperpdf.getSignatureAppearance(); LOGGER.debug("PDFSigner.initAppearanceAppend: создаются конфигурации по умолчанию"); }
Я хотел бы поставить несколько подписей в документе PDF, как в рабочем процессе. Я использую следующий код для подписи написанного мной PDF-файла, и он работает нормально.
Чтобы получить хеш
public String getHash() { LOGGER.debug("PDFSigner.getHash: метод вызван"); Строка pdfHashValue = null; пытаться { int contentEstimated = PDFSigner.CONTENT_ESTIMATED;//8192 HashMap exc = new HashMap(); exc.put(PdfName.CONTENTS, contentEstimated * 2 + 2); PdfSignature pdfSignature = новая PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED); pdfSignature.setReason(appearance.getReason()); pdfSignature.setLocation(appearance.getLocation()); pdfSignature.setContact(appearance.getContact()); pdfSignature.setDate(new PdfDate(appearance.getSignDate())); появление.setCryptoDictionary(pdfSignature); появление.preClose(искл); Данные InputStream = появление.getRangeStream(); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); байт buf[] = новый байт[contentEstimated]; интервал п = 0; while ((n = data.read(buf, 0, contentEstimated)) > 0) { messageDigest.update(buf, 0, n); } байтовый хеш[] = messageDigest.digest(); byte[] reqBytesdata = Hex.encode(хеш); pdfHashValue = новая строка (reqBytesdata, «UTF8»); } catch (опыт исключения) { LOGGER.error("Произошла ошибка PDFSigner getHash", exp); } вернуть pdfHashValue; } Чтобы подписать документ
//dSignature — полученная закодированная подпись pkcs7 (SHA256). //начинается с MIIOWQYJKoZIhvcNAQcCo..... public boolean doSign(String dSignature) выдает IOException, DocumentException { логическое значение pdfGenerationStatus = false; пытаться { byte[] PKCS7Response = Base64.decode(dSignature .getBytes("UTF8")); byte[]paddedSig = новый байт[PDFSigner.CONTENT_ESTIMATED]; System.arraycopy(PKCS7Response, 0, PaddedSig, 0, PKCS7Response.length); PdfDictionary pdfDictionary = новый PdfDictionary(); pdfDictionary.put(PdfName.CONTENTS, новый PdfString(paddedSig).setHexWriting(true)); появление.закрыть(pdfDictionary); pdfGenerationStatus = правда; } catch (опыт исключения) { LOGGER.error("doSign", exp); } вернуть pdfGenerationStatus; } И приведенный выше код работает нормально. Мое новое требование — добавить несколько подписей. Есть ли способ повторно использовать этот фрагмент кода для того же самого. Я прошел через это, это и это, но безуспешно.
Кроме этого я попробовал создать несколько пустых подписей и попытаться прикрепить их. Но это привело к созданию поврежденных файлов. Я также попытался создать файл, используя метод, упомянутый в этой ссылке. MakeSignature.signExternalContainer Также просмотрел отличный документ «Цифровые подписи для PDF-документов».
Сценарий использования похож
[*]Создать PDF-файл [*]Создать хеш документа [*]отправить на внешний сервер [*]внешний сервер вернет строку в кодировке pkcs7 base64 [*]добавить подпись в PDF-файл
ОБНОВЛЕНИЕ
Изменение кода касалось «режима добавления», следующее изменение кода привело к тому, что мой код стал поддерживать мультиподпись, спасибо @Paulo Soares, @mlk
private void initAppearanceAppend(String customerName) выдает IOException, DocumentException { System.out.println("PDFSigner.initAppearanceAppend"); PdfReader readpdf = новый PdfReader(this.getInputPdfFilePath()); int LastPageNumber = Readerpdf.getNumberOfPages(); this.pdfSignatureMetaData.setPageNumber(lastPageNumber); this.pdfSignatureMetaData.setSignerName(имя клиента); //this.pdfSignatureMetaData.setPageNumber(PDFSigner.SIGNATURE_PAGE_NUMBER); OutputStream fout = новый FileOutputStream(this.outputPdfFilePath); //PdfStamper Stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0'); СТАРЫЙ КОД БЕЗ РЕЖИМА ДОБАВЛЕНИЯ PdfStamper Stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0', новый файл("E://temp"), true); this.appearance = Stamperpdf.getSignatureAppearance(); LOGGER.debug("PDFSigner.initAppearanceAppend: создаются конфигурации по умолчанию"); }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Цифровая подпись дайджеста PDF в подписанный хэш pkcs7 с помощью AWS CloudHSM
Anonymous » » в форуме JAVA - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-