2016-06-26 3 views
1

Java에서 iTextPDF를 사용하여 서명 된 PDF에서 디지털 서명 데이터를 추출하려고합니다. 내 코드는 다음과 같습니다 그러나iTextPDF 5.5.0 BouncyCastle 종속성 문제

PdfReader reader = new PdfReader(is); 
AcroFields af = reader.getAcroFields(); 
ArrayList<String> names = af.getSignatureNames(); 
if(names == null || names.isEmpty()) return null; 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    ks.load(null, null); 
    ArrayList<Map<QName, Serializable>> aspects = new ArrayList<Map<QName, Serializable>>(); 
    for (String name : names) { 
     System.out.println("Signature name: " + name); 
     System.out.println("Signature covers whole document: " + af.signatureCoversWholeDocument(name)); 
     System.out.println("Document revision: " + af.getRevision(name) + " of " + af.getTotalRevisions()); 

     PdfPKCS7 pk = af.verifySignature(name); 
     X509Certificate certificate = pk.getSigningCertificate(); 

     Map<QName, Serializable> aspectSignatureProperties = new HashMap<QName, Serializable>(); 
     aspectSignatureProperties.put(SignModel.PROP_CERTIFICATE_PRINCIPAL, certificate.getSubjectX500Principal().toString()); 
     aspectSignatureProperties.put(SignModel.PROP_CERTIFICATE_SERIAL_NUMBER, certificate.getSerialNumber().toString()); 
     aspectSignatureProperties.put(SignModel.PROP_CERTIFICATE_NOT_AFTER, certificate.getNotAfter()); 
     aspectSignatureProperties.put(SignModel.PROP_CERTIFICATE_ISSUER, certificate.getIssuerX500Principal().toString()); 
     aspects.add(aspectSignatureProperties); 
    } 

, PdfPKCS7 pk = af.verifySignature(name);에 내가이 예외를 얻을 :

Caused by: java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1ObjectIdentifier 
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2349) 
at com.itextpdf.text.pdf.AcroFields.verifySignature(AcroFields.java:2302) 
at es.keensoft.alfresco.behaviour.CustomBehaviour.getDigitalSignatures(CustomBehaviour.java:133) 
at es.keensoft.alfresco.behaviour.CustomBehaviour.onCreateNode(CustomBehaviour.java:78) 
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 org.alfresco.repo.policy.JavaBehaviour$JavaMethodInvocationHandler.invoke(JavaBehaviour.java:174) 
at com.sun.proxy.$Proxy54.onCreateNode(Unknown Source) 
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 org.alfresco.repo.policy.TransactionBehaviourQueue.execute(TransactionBehaviourQueue.java:245) 
... 41 more 

Caused by: java.lang.ClassNotFoundException: org.bouncycastle.asn1.ASN1ObjectIdentifier at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ... 56 more

내가 BouncyCastle 종속 관계를 포함하려고 노력하지만 내가 얻을 :

Signer information does not match

어떤 아이디어? 감사

편집 :

<dependency> 
     <groupId>com.itextpdf</groupId> 
     <artifactId>itextpdf</artifactId> 
     <version>5.5.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.bouncycastle</groupId> 
     <artifactId>bcprov-jdk15on</artifactId> 
     <version>1.49</version> 
    </dependency> 
    <dependency> 
     <groupId>org.bouncycastle</groupId> 
     <artifactId>bcpkix-jdk15on</artifactId> 
     <version>1.49</version> 
    </dependency> 

나는 다음과 같은 오류를 받고 있어요 : 나는 이러한 종속성으로 메이븐을 사용하고

java.lang.SecurityException: class "org.bouncycastle.asn1.ASN1ObjectIdentifier"'s signer information does not match signer information of other classes in the same package 
+2

사용중인 BouncyCastle의 버전은 무엇입니까? Maven을 사용한다면이 명령을 실행하고 질문에 출력을 추가하십시오 :'mvn dependency : tree -Dverbose' –

+0

@AmedeeVanGasse Done. 미안, 내가 그걸 일찍 얻지는 않았어. –

+0

@AmedeeVanGasse 무엇인가요? –

답변

1

이를 사용해보십시오 :

<dependencies> 
    <dependency> 
     <groupId>org.bouncycastle</groupId> 
     <artifactId>bcprov-jdk15on</artifactId> 
     <version>1.50</version> 
    </dependency> 
    <dependency> 
     <groupId>org.bouncycastle</groupId> 
     <artifactId>bcpkix-jdk15on</artifactId> 
     <version>1.50</version> 
    </dependency>   
    <dependency>      
     <groupId>com.itextpdf.tool</groupId> 
     <artifactId>xmlworker</artifactId> 
     <version>5.5.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.itextpdf</groupId> 
     <artifactId>itextpdf</artifactId> 
     <version>5.5.0</version> 
    </dependency> 
    </dependencies> 

종속성은 Maven에서 iText에 의해 명확하게 선언되지 않습니다.

다른 사용자가 답변에서 주장한대로 1.49는 5.5.0에서 잘 작동합니다. iText의 첫 MAVEN 버전은 종속성 관리가 명확하지 않은 곳입니다 (심지어 Bruno Lowagie도 이에 대해 언급했습니다).

문제는 기존 1.45 아티팩트가 실행을 방해하고있는 것으로 보입니다. 이 경우 다음 라이브러리 조합이 작동합니다.

<dependencies> 
    <dependency> 
     <groupId>org.bouncycastle</groupId> 
     <artifactId>bcprov-jdk15on</artifactId> 
     <version>1.45</version> 
    </dependency> 
    <dependency> 
     <groupId>org.bouncycastle</groupId> 
     <artifactId>bcpkix-jdk15on</artifactId> 
     <version>1.45</version> 
    </dependency>   
    <dependency>      
     <groupId>com.itextpdf.tool</groupId> 
     <artifactId>xmlworker</artifactId> 
     <version>5.0.6</version> 
    </dependency> 
    <dependency> 
     <groupId>com.itextpdf</groupId> 
     <artifactId>itextpdf</artifactId> 
     <version>5.0.6</version> 
    </dependency> 
    </dependencies> 
+0

같은 일이 발생합니다 :'java.lang.SecurityException : class "org.bouncycastle.asn1.ASN1ObjectIdentifier"의 서명자 정보가 같은 패키지의 다른 클래스의 서명자 정보와 일치하지 않습니다. : –

+1

작동하지 않을 것입니다. BC 1.50은 iText 5.5.x와 호환되지 않습니다. 실제로 1.49가 필요합니다. –

+1

_ Maven.j에서 iText가 종속성을 명확하게 선언하지 않았습니다. POM을 보면, 사실이 아닙니다. https://github.com/itext/itextpdf/blob/5.5.0/itext/pom.xml –