当前位置: 首页 > 知识库问答 >
问题:

PDF签名itext pkcs7多符号

龚昊然
2023-03-14

我想做多个签名的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;
}

签署文件

//dSignature is the received encoded signature pkcs7 (SHA256).
//starts with MIIOWQYJKoZIhvcNAQcCo.....
    public boolean doSign(String dSignature) throws IOException, DocumentException {

        boolean pdfGenerationStatus = false;
        try {
            byte[] PKCS7Response = Base64.decode(dSignature
                    .getBytes("UTF8"));
            byte[] paddedSig = new byte[PDFSigner.CONTENT_ESTIMATED];
            System.arraycopy(PKCS7Response, 0, paddedSig, 0,
                    PKCS7Response.length);
            PdfDictionary pdfDictionary = new PdfDictionary();
            pdfDictionary.put(PdfName.CONTENTS,
                    new PdfString(paddedSig).setHexWriting(true));  
            appearance.close(pdfDictionary);
            pdfGenerationStatus = true;

        } catch (Exception exp) {
            LOGGER.error("doSign ", exp);
        }
        return pdfGenerationStatus; 

    }

而且上面的代码工作得很好。我的新要求是添加多个签名。是否有任何方法可以重用此代码段。我经历了这,这,这,但没有运气。

除此之外,我尝试的是,创建了空白多个空白签名,并尝试附加签名。但它导致创建损坏的文件。我还尝试使用本链接中提到的方法创建文件。Makesignature.SignExternalContainer还对PDF文档进行了很好的文档数字签名

    null

由于@Paulo Soares,@MLK,我的代码被修改为“append mode”,随后的代码修改使我的代码支持多符号

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");
}

共有1个答案

和和裕
2023-03-14

(你使用的是iText 2.1.7,是吗?那是旧的,很多问题在5版就解决了,在7版就解决了更多。)

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

 类似资料:
  • 我正在将代码从iText5迁移到iText7,目前我正在努力将一个签名添加到已经包含另一个签名的PDF中。这些签名是用我们的国民身份证(公民卡)进行的。 在iText5中,我使用了PdfStamper,但它在Itext7中丢失了... 这是我目前所掌握的: POReID(https://github.com/POReID/POReID)是用于与智能卡交互的库。 当第一次签署文件时,它工作得很好。再

  • 我对iTextSharp有意见。我有一个带有表单字段的文档,并且我已经为签名生成了字段。当第一个人在文件上签字时,它就会正常工作。Adobe Reader显示有效签名。当我让第二个人在文档上签名时,Adobe Reader显示签名1现在是“未知签名”,签名无效。Adobe reader显示: 此签名中包含的格式或信息有错误(支持信息:SigDict/Contents非法数据)

  • Client=My application,Server=MSSP(移动签名服务提供商) 服务器仅对哈希值进行签名。 要签名数据: *Base64编码的SHA-384待签名数据摘要。(64个字符) *Base64编码的SHA-512待签名数据摘要。(88个字符) *要签名的Base64编码的DER编码的PKCS#1摘要信息。 注意:我使用MSSP(移动签名服务提供商)架构。对于SHA256算法,D

  • 我有一个关于计算PDF文档摘要以用于数字签名的快速问题(与我前面的一个问题有点相关,我试图弄清楚为什么您需要知道客户的证书以创建正确的摘要)。在Adobe关于PDF格式的文档中,指定了以下内容: 字节范围摘要应在文件中的一个字节范围内计算,该范围应由签名字典中的字节范围条目指示。这个范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目)。 因此,在这一点上,事情似乎相当简单,只需消化除/

  • 我用从GlobalSign收到的通用串行总线令牌签署了一个PDF文件。但是我看不到Adobe的任何图标表明证书是有效的。 我从GlobalSign收到的USB令牌是一个可信任(安全/信任)证书。但我不确定为什么看不到可信/安全证书图标。 签名PDF如下所示: 我还可以从Adobe Acrobat DC看到这个图标的签名: