验证数字签名pdf java IText

时间:2018-04-03 10:30:38

标签: java security itext signature verify

我试图用我的令牌验证我添加到带有IText的pdf文件的签名,但是我遇到了一些错误:

java.security.InvalidKeyException: No installed provider supports this key: (null)

这是我的代码:

//verifying pdf signatures
public PdfPKCS7 verifySignature(AcroFields fields, String name) throws GeneralSecurityException, IOException {
    System.out.println("Signature covers whole document: " + fields.signatureCoversWholeDocument(name));
    System.out.println("Document revision: " + fields.getRevision(name) + " of " + fields.getTotalRevisions());
    PdfPKCS7 pkcs7 = fields.verifySignature(name);
    System.out.println("Integrity check OK? " + pkcs7.verify());
    return pkcs7;
}

public void verifySignatures(String path) throws IOException, GeneralSecurityException {
    System.out.println(path);
    PdfReader reader = new PdfReader(path);
    AcroFields fields = reader.getAcroFields();
    ArrayList<String> names = fields.getSignatureNames();
    for (String name : names) {
        System.out.println("===== " + name + " =====");
        verifySignature(fields, name);
    }
    System.out.println();
}

这是整个日志:

===== sig_2 =====
Signature covers whole document: true
Document revision: 1 of 1
Exception in thread "main" ExceptionConverter: 
java.security.InvalidKeyException: No installed provider supports this key: (null)
at java.security.Signature$Delegate.chooseProvider(Unknown Source)
at java.security.Signature$Delegate.engineInitVerify(Unknown Source)
at java.security.Signature.initVerify(Unknown Source)
at com.itextpdf.text.pdf.security.PdfPKCS7.<init>(PdfPKCS7.java:452)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2317)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2270)
at com.pdf.sign.Main.verifySignature(Main.java:91)
at com.pdf.sign.Main.verifySignatures(Main.java:103)
at com.pdf.sign.Main.main(Main.java:147)

2 个答案:

答案 0 :(得分:0)

您的密钥库似乎没有被初始化,因此您的密钥为空。

有关使用示例,我发现了这一点:http://grepcode.com/file/repo1.maven.org/maven2/com.itextpdf/itextpdf/5.0.6/com/itextpdf/text/pdf/AcroFields.java#AcroFields.verifySignature%28java.lang.String%2Cjava.lang.String%29

在那里,您还可以查看源代码并找到抛出异常的位置和原因。

答案 1 :(得分:0)

这是Bouncy Castle的问题(请参见https://github.com/bcgit/bc-java/issues/144)。您需要在检查PDF签名之前添加以下行

ref
   .child("DuckCompany")
   .child("SALES")
   .child("WireHouse")
   .child("Inventory")
   .child("RubberDUCK") 
   .addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) { 
       for (DataSnapshot uids : dataSnapshot.child("DuckID").getChildren()) {

          uidKeys = uids.getKey();

          if (uidKeys != null) {
             int allDuck = (int) dataSnapshot.child("DuckID").child(uidKeys).child("stocks").getChildrenCount();                            
          }
       }
       textView.setText(allDuck " Rubber Duck");

    }

     @Override
     public void onCancelled(@NonNull DatabaseError databaseError) {

     }
});