2016-05-11 6 views
0

При попытке проверить подписанный документ в формате PDF я получаю RuntimeException:PDF документ проверить исключение

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

Не стесняйтесь присылать запрос на вытягивание для добавления ECGOST34310! –

+0

Фактически, если вы используете AGPL iText, а кто-то еще использует вашу модификацию, то вы обязаны делиться своими изменениями. –

+0

Я хотел бы поделиться, но не знаю, где я могу разоблачить его для общего доступа. Недавно попробуем поделиться в github –

ответ

1

На первый взгляд, что OID 1.2.398.3.10.1.1.1.1, по-видимому, определяется казахстанским органом (см. this page), относящимся к ГОСТ 34,310-2.004, представленному родительским OID, не будучи включенным в основное распределение BouncyCastle, ср. BouncyCastle specifications.

Таким образом, так же, как вы расширили IText, чтобы иметь возможность знак с использованием ГОСТ 34,310-2.004

Я использую библиотеку заплата IText. Мне пришлось исправлять его, потому что не было такого алгоритма, как ECGOST34310, и я просто добавил его.

вы должны продлить его (или в данном случае более точно крипто библиотека BouncyCastle используется IText), чтобы иметь возможность проверить подписи с использованием ГОСТ 34,310-2.004. Может быть, хотя кто-то еще это сделал и приходит на помощь?

Кстати, было бы здорово, если бы вы поделились результатами, как только они сработают.


Это все было сказано, я не в курсе ГОСТ упоминается в контексте либо ISO 32000-1 или Падес интегрированных подписей PDF. Поэтому использование подписи ГОСТ для PDF, скорее всего, приведет к очень ограниченной функциональной совместимости.

+0

принять Похоже, теперь работает. В исходном тексте iText были заменены все банки BC заказными библиотеками поставщиков и скомпилированы. Пользовательский поставщик расширяет поставщик BC, таким образом, когда-то согласованный и заполненный «пробелами», я имею в виду недостающие алгоритмы. Теперь попытаемся правильно проверить подписи и проверить, был ли документ изменен. Подумайте, как это сделать? Спасибо, ребята! –

+0

* Подумайте, как это сделать? * - ваш код должен это сделать уже. Если у вас есть подробные вопросы, сделайте им вопрос переполнения стека самостоятельно. – mkl