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

iText-生成没有证书链的PDF哈希

施茂
2023-03-14

我试图构建一个应用程序,其中会发生以下情况:

    null
public byte[] simplePresign(String src, String digestAlgorithm) throws IOException, DocumentException, GeneralSecurityException {
    this.digestAlgorithm = digestAlgorithm;
    tsaClient = new CustomTSAClient();

    PdfReader reader = new PdfReader(src);
    os = new ByteArrayOutputStream();
    PdfAStamper stamper = PdfAStamper.createSignature(reader, os, '\0', PdfAConformanceLevel.PDF_A_1B);
    appearance = stamper.getSignatureAppearance();

    PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
    appearance.setCryptoDictionary(dic);

    HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
    exc.put(PdfName.CONTENTS, getEstimatedSize(null, tsaClient) * 2 + 2);
    appearance.preClose(exc);

    InputStream data = appearance.getRangeStream();
    MessageDigest mDigest = DigestAlgorithms.getMessageDigest(digestAlgorithm, null);

    return DigestAlgorithms.digest(data, mDigest);

}

不幸的是,这个散列似乎不正确,签名这个散列并根据签名的散列生成签名的文档会导致无效签名。

如果有人能帮助我改进这个代码片段,或者给我一些关于签名需要消化的数据的见解,我将非常感激。

共有1个答案

龙亮
2023-03-14

您似乎忽略了DeferredSigning示例。

在本例中,我们首先创建一个带有空签名的PDF:

public void emptySignature(String src, String dest, String fieldname, Certificate[] chain) throws IOException, DocumentException, GeneralSecurityException {
    PdfReader reader = new PdfReader(src);
    FileOutputStream os = new FileOutputStream(dest);
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, fieldname);
    appearance.setCertificate(chain[0]);
    ExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
    MakeSignature.signExternalContainer(appearance, external, 8192);
}

当然,公共证书链[0]被传递给外观。在本例中,它用于创建可视外观和创建PDFPKCS7对象。

BouncyCastleDigest digest = new BouncyCastleDigest();
PdfPKCS7 sgn = new PdfPKCS7(null, chain, hashAlgorithm, null, digest, false);
byte[] hash = DigestAlgorithms.digest(is, digest.getMessageDigest(hashAlgorithm));
Calendar cal = Calendar.getInstance();
byte[] sh = sgn.getAuthenticatedAttributeBytes(hash, cal, null, null, CryptoStandard.CMS);

您的外部签名容器可以保持非常简单:它只需要返回签名字节

class MyExternalSignatureContainer implements ExternalSignatureContainer {
    protected byte[] sig;
    public MyExternalSignatureContainer(byte[] sig) {
        this.sig = sig;
    }
    public byte[] sign(InputStream is) throws Exception {
        return sig;
    }
    public void modifySigningDictionary(PdfDictionary signDic) {
    }
}

现在可以在服务器上使用createsignature()方法:

public void createSignature(String src, String dest, String fieldname, PrivateKey pk, Certificate[] chain) throws IOException, DocumentException, GeneralSecurityException {
    
    PdfReader reader = new PdfReader(src);
    FileOutputStream os = new FileOutputStream(dest);
    ExternalSignatureContainer external = new MyExternalSignatureContainer(sig);
    MakeSignature.signDeferred(reader, fieldname, os, external);
}
 类似资料:
  • 问题是如何在Java中以编程方式生成证书链。换言之,我想用java执行此处详述的操作:http://fusesource.com/docs/broker/5.3/security/i382664.html 当然,我可以为新客户端创建RSA密钥: } 并生成相应的证书: } 然后我生成证书签名请求,并将其保存到csrFile文件: 哪里 现在我应该用CA私钥对CSR进行签名,但我不知道如何在java

  • 我使用的是nimbus jose jwt 5.14,我用以下代码生成了RSA密钥对 现在我需要解释一些关于公钥的“元数据”: e 孩子 kty n 使用 x5c 如何获得x5c?是否可以使用此库生成X509证书?此字段为空:

  • GitBook不仅可以生成静态网站,也可以将内容输出为电子书(ePub,Mobi,PDF)格式。 #生成PDF文件 $ gitbook pdf ./ ./mybook.pdf #生成ePub文件 $ gitbook epub ./ ./mybook.epub #生成Mobi文件 $ gitbook mobi ./ ./mybook.mobi 安装ebook-convert ebook-con

  • 我在合并从iText生成的两个PDF时遇到了一个问题。我是iText7的新手,我正在从html创建一个pdf,并用excel(.xls)创建另一个pdf作为pdf的嵌入文档。我想合并这2个文件。 请指教。提前感谢!!

  • 我正在使用iText 5.4.4,我想为一个连续的纸票打印机生成一个PDF。我的疑问是如何设置新文档以避免将pdf分成几页: 这样做有什么可肯定的吗?

  • 问题内容: 我正在使用iText生成一些PDF,这些pdf具有一些汉字(简体中文-GB2312),但是我无法使用这些字符生成pdf。 谁能告诉我我哪里错了? 我尝试使用各种形式的创作,但没有成功: 有人可以帮我吗? 添加问题,这是我当前的测试代码: 问题答案: 您的CLASSPATH中有iText jar,但是您忘记添加(正确的)itext-asian.jar。 请从此处下载额外的jar ZIP文