使用itext无法正常工作的数字签名验证

dpi*_*wal 1 java bouncycastle itext digital-signature

我正在使用itext库验证数字签名的pdf,以下示例可在https://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-5站点上找到.我在验证数字签名文档时遇到以下错误.任何人都可以帮助解决这个问题.

Exception in thread "main" ExceptionConverter: java.security.NoSuchAlgorithmException: SHA256with1.2.840.10045.4.3.2 Signature not available
at java.security.Signature.getInstance(Signature.java:229)
at com.itextpdf.text.pdf.security.PdfPKCS7.initSignature(PdfPKCS7.java:697)
at com.itextpdf.text.pdf.security.PdfPKCS7.<init>(PdfPKCS7.java:459)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2420)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2373)
at nic.test.C5_01_SignatureIntegrity.verifySignature(C5_01_SignatureIntegrity.java:24)
at test.ExtractSignInfor.inspectSignature(ExtractSignInfor.java:95)
at test.ExtractSignInfor.inspectSignatures(ExtractSignInfor.java:135)
at test.ExtractSignInfor.main(ExtractSignInfor.java:63)
Run Code Online (Sandbox Code Playgroud)

Mic*_*mey 5

如果你搜索iText呛到的OID,你会发现这是"ecdsa-with-sha256":

http://www.oid-info.com/get/1.2.840.10045.4.3.2

这在iText 5中不受支持.但我们确实在iText 7中添加了对此的支持.尝试使用最新的iText 7版本运行此代码示例:

BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);

PdfReader reader = new PdfReader(INPUT);
PdfDocument pdfDocument = new PdfDocument(reader);

PdfAcroForm acroForm = PdfAcroForm.getAcroForm(pdfDocument, false);

for ( String name : acroForm.getFormFields().keySet() ) {
    PdfFormField formField = acroForm.getField(name);
    if (formField != null && formField instanceof PdfSignatureFormField)    {
        SignatureUtil signatureUtil = new SignatureUtil(pdfDocument);
        PdfPKCS7 pkcs7 = signatureUtil.verifySignature(name);
        pkcs7.verify();
        [...]
Run Code Online (Sandbox Code Playgroud)