2016-11-13 10 views
0

AndroidでiTextを使用してPDF文書に署名しようとしていました。証明書がエミュレータに含まれ、アクティブ化されました。ここで私が使用するライブラリは、以下のとおりです。AndroidでiTextを使用したSpongycastleでNoSuchMethodErrorを取得する

public class SignPDF { 

static { 
    Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); 
} 

public void sign(String src, String dest, 
       Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider, 
       MakeSignature.CryptoStandard subfilter, String reason, String location) 
     throws GeneralSecurityException, IOException, DocumentException { 

    PdfReader reader = new PdfReader(src); 
    FileOutputStream os = new FileOutputStream(dest); 
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 

    PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
    appearance.setReason(reason); 
    appearance.setLocation(location); 
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 

    ExternalDigest digest = new BouncyCastleDigest(); 
    ExternalSignature signature = 
      new PrivateKeySignature(pk, digestAlgorithm, provider); 
    MakeSignature.signDetached(appearance, digest, signature, chain, 
      null, null, null, 0, subfilter); 
} 

private static String[] PERMISSIONS_STORAGE = { 
     Manifest.permission.READ_EXTERNAL_STORAGE, 
     Manifest.permission.WRITE_EXTERNAL_STORAGE}; 
private static final int REQUEST_EXTERNAL_STORAGE = 1; 
public static final String SRC = Environment.getExternalStorageDirectory() + File.separator + "testdsign_1.pdf"; // consider the file to be created earlier 
public static final String DEST = Environment.getExternalStorageDirectory() + File.separator + "testdsign_2.pdf"; 

public static void signat(Activity a) 
     throws IOException, GeneralSecurityException { 

    int permission = ActivityCompat.checkSelfPermission(a, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    if (permission != PackageManager.PERMISSION_GRANTED) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       a, 
       PERMISSIONS_STORAGE, 
       REQUEST_EXTERNAL_STORAGE 
     ); 
    } 
    String path = Environment.getExternalStorageDirectory() + File.separator + "keystore.p12"; 
    char[] pass = "123456".toCharArray(); 
    BouncyCastleProvider provider = new BouncyCastleProvider(); 
    Security.addProvider(provider); 
    KeyStore ks = KeyStore.getInstance("pkcs12", provider.getName()); 
    ks.load(new FileInputStream(path), pass); 
    String alias = (String) ks.aliases().nextElement(); 
    PrivateKey pk = (PrivateKey) ks.getKey(alias, pass); 
    Certificate[] chain = ks.getCertificateChain(alias); 
    SignPDF app = new SignPDF(); 
    try { 
     app.sign(SRC, DEST, chain, pk, DigestAlgorithms.SHA256, provider.getName(), 
       MakeSignature.CryptoStandard.CMS, "Test", "Ghent"); 
    } catch (DocumentException e) { 

     e.printStackTrace(); 
    } 
} 

}

最後に、エラー・スタック

java.lang.NoSuchMethodError: No direct method <init>(I)V in class Lorg/spongycastle/asn1/ASN1Integer; or its super classes (declaration of 'org.spongycastle.asn1.ASN1Integer' appears in /data/data/dsign.example.com.dsigntest/files/instant-run/dex/slice-core-1.54.0.0_016eb8590d95a10a91a6367c6ca7de97121683a4-classes.dex) 
                      at com.itextpdf.text.pdf.security.PdfPKCS7.getEncodedPKCS7(PdfPKCS7.java:826) 
                      at com.itextpdf.text.pdf.security.MakeSignature.signDetached(MakeSignature.java:154) 
                      at dsign.example.com.dsigntest.SignPDF.sign(SignPDF.java:56) 
                      at dsign.example.com.dsigntest.SignPDF.signat(SignPDF.java:91) 
                      at dsign.example.com.dsigntest.MainActivity.onCreate(MainActivity.java:59) 
                      at android.app.Activity.performCreate(Activity.java:6237) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

compile 'com.android.support:appcompat-v7:23.2.0' 
compile 'com.itextpdf:itextg:5.5.9' 
testCompile 'junit:junit:4.12' 
compile files('libs/itext-licensekey-1.0.4.jar') 

compile 'com.madgag.spongycastle:core:1.54.0.0' 
compile 'com.madgag.spongycastle:prov:1.54.0.0' 
compile 'com.madgag.spongycastle:pkix:1.54.0.0' 
compile 'com.madgag.spongycastle:pg:1.54.0.0' 

後は、私は、既存のPDF文書に署名するために使用するクラスです

問題の原因は何ですか?どんな助けでもありがとうございます。

+1

itextgのpom.xmlに必要なSCバージョンを確認してください。確かに1.54ではありません。 – mkl

+0

@AmedeeVanGasseありがとうございます、私はバージョン – BekaBot

+0

を変更しようとします@AmedeeVanGasse働いて、私は[this](http://grepcode.com/snapshot/repo1.maven.org/maven2/com.madgagからSCバージョン1.47を使用しました。 /scprov-jdk15on/1.47.0.1/)リンクをクリックします。私がそれを受け入れることができるように、下のaswerとしてあなたのコメントをコピーしてください。ありがとうございました。 – BekaBot

答えて

4

BouncyCastleバージョン1.54を使用しています。 iTextG 5.5。*にはSpongyCastleバージョン1.47.0.2が必要です(iText 5.5。*にはBouncyCastleバージョン1.49が必要です)。

Maven/Gradle/...の設定にiTextGを依存関係として追加すると、ビルドツールがSpongyCastleの正しいバージョン(現在は1.47.0.2)を自動的に取得することをお勧めします。依存関係を手作業で調べる必要はありません。依存関係の解決は、Androidで解決される問題です。

EDIT:

一部の人々は明らかにMavenのツール(またはのGradle)を構築しませんが、手動でhttp://search.maven.orgにjarファイルを検索します。あなたがそれを行い、あなたが盲目的に "スポンジキャスル"を検索した場合、のバージョンが間違っているだけです。

1はiTextG pom.xmlで見ることができるように:

<dependencies> 
    <dependency> 
    <groupId>com.madgag</groupId> 
    <artifactId>scprov-jdk15on</artifactId> 
    <version>1.47.0.2</version> 
    <optional>true</optional> 
    </dependency> 
    <dependency> 
    <groupId>com.madgag</groupId> 
    <artifactId>scpkix-jdk15on</artifactId> 
    <version>1.47.0.2</version> 
    <optional>true</optional> 
    </dependency> 
    ... 
</dependencies> 

私は繰り返し、これらはiTextの5.5のための正しい依存関係です*:。

  • のgroupId:com.madgag
  • たartifactId:scprov-jdk15onscpkix-jdk15on
  • バージョン:1.47.0.2

これらの依存関係は、iTextの5.5用 WRONG です*:。

  • のgroupId:com.madgag.spongycastle
  • たartifactId:provpkix
  • バージョン:[1.50,)

あなたがSpongyCastleの正しいバージョンを使用していることを確認した後でも問題が残っている場合は、新しい質問をする必要があります。あなたの質問では、以下の情報が含まれています

  • あなたiTextGバージョン
  • あなたのPOMファイルやGradleのは、あなたが得るエラーの
  • 出力
  • mvn dependency:tree -Dverboseのコピー/ペーストを提出あなたのSpongyCastleバージョン。
+0

私はまだ同じ問題に直面しています、私はitextg v5.5.10を使用しています。 mavenのmin spongycastleのバージョンは1.50.0です。 – leobelizquierdo

+2

あなたはSpongy Castleの間違ったバージョンを見ています。 '1.50'から' groupId'を 'com.madgag.spongycastle'に改名しました。 '1.47.02'については、iTextG' pom.xml'にはっきりと分かるように、 'groupId'は' com.madgag'であり、アーティファクトは 'scprov-jdk15on'と' scpkix-jdk15on'です。私はダブルチェックをしました。現在、私のブラウザはhttp://search.maven.orgに公開されています。アーティファクトを見つけることができます。それでも問題が解決しない場合は、新しい質問を開始してください。 –

+0

ありがとう!あなたは私の一日を救った。何らかの理由で、jcenterまたはmavenのitextgの現在のバージョンは、pomに追加された依存関係を持っていません。私は狂っていた。それらのcom.madgagを私のgradleプロジェクトの依存関係に追加することは、そのトリックでした。 – giroxiii

関連する問題