PDF文件验证例外

时间:2016-05-11 08:14:20

标签: java pdf itext

当我尝试验证签名的pdf文档时,我得到RuntimeException:

Exception in thread "main" java.lang.RuntimeException: algorithm identifier 1.2.398.3.10.1.1.1.1 in key not recognised
at org.bouncycastle.jce.provider.JDKKeyFactory.createPublicKeyFromPublicKeyInfo(Unknown Source)
at org.bouncycastle.jce.provider.X509CertificateObject.getPublicKey(Unknown Source)
at com.itextpdf.text.pdf.PdfPKCS7.<init>(PdfPKCS7.java:582)
at com.itextpdf.text.pdf.PdfPKCS7.<init>(PdfPKCS7.java:421)
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2307)
at Main.verifyPDF(Main.java:62)
at Main.main(Main.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

我的验证代码如下:

    public static boolean verifyPDF(String fileToVerify, KeyStore trustedStore, CRL crl) throws IOException, GeneralSecurityException {
    List<CRL> crls = null;
    if (crl != null) {
        crls = new ArrayList<CRL>(1);
        crls.add(crl);
    }
    boolean result = false;
    PdfReader checker = new PdfReader(fileToVerify);
    AcroFields af = checker.getAcroFields();
    ArrayList<String> names = af.getSignatureNames();

    for (int k = 0; k < names.size(); ++k) {
        String name = (String) names.get(k);
        System.out.println("Signature: " + name);
        com.itextpdf.text.pdf.PdfPKCS7 pk = af.verifySignature(name, "KALKAN");
        result = pk.verify();
        System.out.println("Signer certificate DN: " + pk.getSigningCertificate().getSubjectDN());
        Calendar cal = pk.getSignDate();
        X509Certificate pkc[] = (X509Certificate[]) pk.getSignCertificateChain();
        System.out.println("Document modified: " + !result);
        Object fails[] = PdfPKCS7.verifyCertificates(pkc, trustedStore, crls, cal);
        if (fails == null)
            System.out.println("Certificates verified against the KeyStore");
        else
            System.out.println("Certificate failed: " + fails[1]);
    }
    return result;
}

此字符串发生异常:

com.itextpdf.text.pdf.PdfPKCS7 pk = af.verifySignature(name, "KALKAN");

我使用修补的iText库。我不得不打补丁,因为没有像ECGOST34310那样的算法,我只是添加了它。签名以通常的方式执行,没有问题。 请帮忙!

感谢。

1 个答案:

答案 0 :(得分:1)

乍一看,OID 1.2.398.3.10.1.1.1.1似乎是由哈萨克斯坦当局(参见this page)定义的,与父母OID所代表的GOST 34,310-2.004有关,但尚未被列入主流的BouncyCastle发行版,参见BouncyCastle specifications

因此,就像您已经使用GOST 34,310-2.004扩展iText以签署一样

  

我使用修补的iText库。我不得不打补丁,因为没有像ECGOST34310那样的算法,我只是添加了它。

你必须扩展它(或者在这种情况下,更确切地说是iText使用的加密库BouncyCastle),以便能够使用GOST 34,310-2.004 验证签名。但是,也许其他人已经这样做并出来帮忙了?

顺便说一下,如果你在工作后尽快分享结果会很棒。

所有人都说我不知道​​在ISO 32000-1或PAdES集成PDF签名的上下文中提到GOST。因此,使用GOST进行PDF签名可能会导致非常有限的互操作性。