Pdf文件签名检查

如何检查pdf的签名

首先这里有一个已经签名的pdf文件,通过pdf软件可以看到文件的数字签名。

下面就是如何代码检查这里pdf文件的签名

1.引入依赖

xml 复制代码
 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
       
        <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.3</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
  1. 编写检查签名的方法
java 复制代码
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.security.PdfPKCS7;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.Principal;
import java.security.Provider;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.Calendar;
import java.util.List;


/**
 * pdf文件签名检查
 */
public class PdfDigitalSignatureCheck {

    private static final Logger LOGGER = LoggerFactory.getLogger(PdfDigitalSignatureCheck.class);

    public static final boolean verifySignature(PdfReader pdfReader)
            throws GeneralSecurityException, IOException {
        boolean valid = false;
        AcroFields acroFields = pdfReader.getAcroFields();
        List<String> signatureNames = acroFields.getSignatureNames();
        if (!signatureNames.isEmpty()) {
            for (String name : signatureNames) {
                if (acroFields.signatureCoversWholeDocument(name)) {
                    //设定签名提供者
                    Provider provider=Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
                    if(provider==null){
                        provider=new BouncyCastleProvider();
                        Security.addProvider(provider);
                    }
                    PdfPKCS7 pkcs7 = acroFields.verifySignature(name);
                    valid = pkcs7.verify();
                    String reason = pkcs7.getReason();
                    Calendar signedAt = pkcs7.getSignDate();
                    X509Certificate signingCertificate = pkcs7.getSigningCertificate();
                    Principal issuerDN = signingCertificate.getIssuerDN();
                    Principal subjectDN = signingCertificate.getSubjectDN();
                    LOGGER.info("valid = {}, date = {}, reason = '{}', issuer = '{}', subject = '{}'",
                            valid, signedAt.getTime(), reason, issuerDN, subjectDN);
                    break;
                }
            }
        }
        return valid;
    }

    /**
     * 验证签名
     *
     * @param name
     * @return
     * @throws IOException
     * @throws GeneralSecurityException
     */
    public static boolean validate(String name)
            throws IOException, GeneralSecurityException {
        PdfReader reader = new PdfReader(name);
        boolean isSign = verifySignature(reader);
        return isSign;
    }

}
  1. 编写测试用例,并执行,可以看到数字证书相关信息。

如果有多个签名,则会显示多个签名

java 复制代码
    @Test
    void pdfDigitalSignatureCheck() throws IOException, GeneralSecurityException {
        System.out.println("-----------数字签名检查------------");
        String[] files = {"D:\\test3\\test1_sign.pdf", "D:\\test3\\test1.pdf"};
        for (String file : files) {
            boolean validate = PdfDigitalSignatureCheck.validate(file);
            log.info("{} 是否签名:{}", file, validate);
        }
    }

遇到的问题

签名设定

如果你的签入使用的BouncyCastleProvider,那么你的签名检查也应该使用BouncyCastleProvider,否则可能会报错。

相关推荐
新老农1 小时前
php数据导出pdf,然后pdf转图片,再推送钉钉群
pdf·php·钉钉
琉璃℡初雪4 小时前
vue2/3 中使用 @vue-office/docx 在网页中预览(docx、excel、pdf)文件
vue.js·pdf·excel
一个懒鬼8 小时前
Edge浏览器打开PDF文件显示空白(每次需要等上一会)
windows·pdf
Lauren_Lu17 小时前
pdf 不是扫描件,但却无法搜索关键词【问题尝试解决未果记录】
pdf
Python猫1 天前
付费专栏·Python潮流周刊电子书合集(epub、pdf、markdown)下载
python·计算机·pdf·电子书·资料
JackieZhengChina1 天前
用python清除PDF文件中的水印(Adobe Acrobat 无法删除)
pdf
geovindu1 天前
vue3: pdf.js 3.4.120 using javascript
开发语言·javascript·vue.js·pdf
TextIn智能文档云平台2 天前
PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!
图像处理·人工智能·算法·自然语言处理·pdf·ocr
old_power2 天前
【Python】PDF文件处理(PyPDF2、borb、fitz)
python·pdf
belldeep2 天前
vite:npm 安装 pdfjs-dist , PDF.js View 预览功能示例
javascript·pdf·pdfjs-dist·pdf.worker