当我尝试验证签名的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那样的算法,我只是添加了它。签名以通常的方式执行,没有问题。 请帮忙!
感谢。
答案 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签名可能会导致非常有限的互操作性。