2016-06-26 6 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

何か案は? おかげ

EDIT:

<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> 

と、私は次のエラーを取得しています:私はこれらの依存関係をMavenを使用してい

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完了。申し訳ありませんが、私は早くそれを得ていませんでした。 –

+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._のiTextでは依存関係が明確に宣言されていません。 https://github.com/itext/itextpdf/blob/5.5.0/itext/pom.xml –