Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PDF签名itext pkcs7多签名_Java_Pdf_Itext_Digital Signature - Fatal编程技术网

Java PDF签名itext pkcs7多签名

Java PDF签名itext pkcs7多签名,java,pdf,itext,digital-signature,Java,Pdf,Itext,Digital Signature,我想在pdf文档上做多重签名,就像在工作流中一样。 我用下面的代码来签署我写的pdf文件,效果很好 得到散列 public String getHash() { LOGGER.debug("PDFSigner.getHash : method invoked"); String pdfHashValue = null; try { int contentEstimated = PDFSigner.CONTENT_ESTIMATED;//8192

我想在pdf文档上做多重签名,就像在工作流中一样。 我用下面的代码来签署我写的pdf文件,效果很好

得到散列

public String getHash() {
    LOGGER.debug("PDFSigner.getHash : method invoked");
    String pdfHashValue = null;
    try {
        int contentEstimated = PDFSigner.CONTENT_ESTIMATED;//8192
        HashMap<PdfName, Integer> exc = new HashMap<>();
        exc.put(PdfName.CONTENTS, contentEstimated * 2 + 2);
        PdfSignature pdfSignature = new 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()));
        appearance.setCryptoDictionary(pdfSignature);
        appearance.preClose(exc);
        InputStream data = appearance.getRangeStream();
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        byte buf[] = new byte[contentEstimated];
        int n = 0;
        while ((n = data.read(buf, 0, contentEstimated)) > 0) {
            messageDigest.update(buf, 0, n);
        }
        byte hash[] = messageDigest.digest();
        byte[] reqBytesdata = Hex.encode(hash);
        pdfHashValue = new String(reqBytesdata, "UTF8"); 
    } catch (Exception exp) {
        LOGGER.error("PDFSigner error occured getHash", exp);
    }
    return pdfHashValue;
}
上面的代码运行良好。 我的新要求是添加多个签名。是否有任何方法可以将此代码段重新用于相同的目的。 我经历过,但没有运气

除此之外,我尝试的是,创建多个空白签名并尝试附加签名。但它导致创建损坏的文件。我还尝试使用本文中提到的方法创建文件。MakeSignature.signExternalContainer 还经历了一个伟大的文件数字签名的PDF文件

用例如下

创建pdf 生成文档哈希 发送到外部服务器 外部服务器将返回pkcs7 base64编码字符串 将签名附加到pdf 更新

代码更改是为了“附加模式”,下面的代码更改使我的代码支持多重签名,这要感谢@Paulo Soares,@mlk

private void initAppearanceAppend(String customerName) throws IOException, DocumentException {
    System.out.println("PDFSigner.initAppearanceAppend");
    PdfReader readerpdf = new PdfReader(this.getInputPdfFilePath());
    int lastPageNumber = readerpdf.getNumberOfPages();
    this.pdfSignatureMetaData.setPageNumber(lastPageNumber);
    this.pdfSignatureMetaData.setSignerName(customerName);
    //this.pdfSignatureMetaData.setPageNumber(PDFSigner.SIGNATURE_PAGE_NUMBER);
    OutputStream fout = new FileOutputStream(this.outputPdfFilePath);
    //PdfStamper stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0'); OLD CODE WITHOUT APPEND MODE
    PdfStamper stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0', new File("E://temp"), true);

    this.appearance = stamperpdf.getSignatureAppearance();
    LOGGER.debug("PDFSigner.initAppearanceAppend : default configurations are made");
}

您正在使用iText 2.1.7,是吗?这已经很老了,很多问题都在5年内解决了,还有更多的问题在7年内解决了


添加更多签名与添加第一个签名相同,只需使用附加模式。除非第一个签名是具有适当权限的认证签名,否则只有最后一个签名将显示为有效,但它们都是有效的,只需提取一个修订以进行检查。

用例类似于…-到底是什么阻止您一次又一次地执行该用例?如果您知道如何在文档中添加一个签名,那么添加另一个签名的具体问题是什么?我使用了上述代码两次,第一个签名在附加第二个签名时失效。在上面的文档中,我没有创建带有空签名的文档。我认为这应该是问题所在。请纠正我。关于这个问题,你很可能只需要遵循@Paulo答案中的建议:使用附加模式。如果这没有帮助,请共享一个带有一个和两个签名的PDF。非常感谢。如果您正在使用iText 2.1.7,我将尝试这种方法。请升级,因为您不应该再在商业环境中使用旧版本。我正在使用Itext 5.5.10。
private void initAppearanceAppend(String customerName) throws IOException, DocumentException {
    System.out.println("PDFSigner.initAppearanceAppend");
    PdfReader readerpdf = new PdfReader(this.getInputPdfFilePath());
    int lastPageNumber = readerpdf.getNumberOfPages();
    this.pdfSignatureMetaData.setPageNumber(lastPageNumber);
    this.pdfSignatureMetaData.setSignerName(customerName);
    //this.pdfSignatureMetaData.setPageNumber(PDFSigner.SIGNATURE_PAGE_NUMBER);
    OutputStream fout = new FileOutputStream(this.outputPdfFilePath);
    //PdfStamper stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0'); OLD CODE WITHOUT APPEND MODE
    PdfStamper stamperpdf = PdfStamper.createSignature(readerpdf, fout, '\0', new File("E://temp"), true);

    this.appearance = stamperpdf.getSignatureAppearance();
    LOGGER.debug("PDFSigner.initAppearanceAppend : default configurations are made");
}