IText将证书信息添加到外观签名字段

问题描述

我正在尝试使用iText进行数字签名(PKCS12文件),但是找不到用于签名的证书信息的外观。

更新1: 以下测试类使您可以使用p12证书对文档进行签名,并在PDF文档上添加视觉效果:

package ma.sigital.dsp.prosigngateway.service;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.util.Date;

import com.itextpdf.text.Rectangle;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfSignatureAppearance.RenderingMode;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.security.BouncyCastleDigest;
import com.itextpdf.text.pdf.security.DigestAlgorithms;
import com.itextpdf.text.pdf.security.ExternalDigest;
import com.itextpdf.text.pdf.security.MakeSignature;
import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard;
import com.itextpdf.text.pdf.security.PrivateKeySignature;

public class Test {
public static final String DEST = "B:/Hash-et-Reconstitution/tmp/SIGNED-Doc_test.pdf";

public static final String KEYSTORE = "C:/lp7command/tools/certificate.p12";
public static final String SRC = "B:/Hash-et-Reconstitution/tmp/Doc_test.pdf";
public static final String IMG = "C:/Repo_LP7/logo-cire.png";

public static final char[] PASSWORD = "123456".toCharArray();

public static final String[] RESULT_FILES = new String[] {
        "signature_appearance_1.pdf","signature_appearance_2.pdf","signature_appearance_3.pdf","signature_appearance_4.pdf"
};

public void sign(String src,String name,String dest,Certificate[] chain,PrivateKey pk,String digestAlgorithm,String provider,CryptoStandard subfilter,String reason,String location,RenderingMode renderingMode,Image image)
        throws GeneralSecurityException,IOException,DocumentException {
    // Creating the reader and the stamper
    PdfReader reader = new PdfReader(src);
    FileOutputStream os = new FileOutputStream(dest);
    PdfStamper stamper = PdfStamper.createSignature(reader,os,'\0');
    // Creating the appearance
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
    appearance.setReason(reason);
    appearance.setLocation(location);
    appearance.setVisibleSignature(new Rectangle(200,100,600,5),2,"sig");
    appearance.setLayer2Text("Signed on " + new Date().toString());

    appearance.setRenderingMode(renderingMode);
    appearance.setSignatureGraphic(image);
    // Creating the signature
    PrivateKeySignature pks = new PrivateKeySignature(pk,digestAlgorithm,provider);
    ExternalDigest digest = new BouncyCastleDigest();
    MakeSignature.signDetached(appearance,digest,pks,chain,null,subfilter);
}

public static void main(String[] args) throws GeneralSecurityException,DocumentException {
    BouncyCastleProvider provider = new BouncyCastleProvider();
    Security.addProvider(provider);
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(new FileInputStream(KEYSTORE),PASSWORD);
    String alias = (String)ks.aliases().nextElement();
    PrivateKey pk = (PrivateKey) ks.getKey(alias,PASSWORD);
    Certificate[] chain = ks.getCertificateChain(alias);
    Image image = Image.getInstance(IMG);
    Test app = new Test();

    app.sign(SRC,"Signature1",String.format(DEST,3),pk,DigestAlgorithms.SHA256,provider.getName(),CryptoStandard.CMS,"Appearance 3","Ghent",RenderingMode.GRAPHIC_AND_DESCRIPTION,image);

}
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...