Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android上使用Spongycastle和iText时获取NoSuchMethodError_Java_Android_Itext - Fatal编程技术网

Java 在Android上使用Spongycastle和iText时获取NoSuchMethodError

Java 在Android上使用Spongycastle和iText时获取NoSuchMethodError,java,android,itext,Java,Android,Itext,我试图在Android上用iText签署一份PDF文档。证书已包含在仿真器中并被激活。以下是我使用的库: 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.spongycast

我试图在Android上用iText签署一份PDF文档。证书已包含在仿真器中并被激活。以下是我使用的库:

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文档的类:

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)
java.lang.NoSuchMethodError:Lorg/spongycastle/asn1/ASN1Integer类中没有直接方法(I)V;或其超类(声明'org.spongycastle.asn1.ASN1Integer'出现在/data/data/dsign.example.com.dsigntest/files/instant run/dex/slice-core-1.54.0.0_016eb8590d95a10a91a6367c6ca7de97121683a4-classes.dex中)
请访问com.itextpdf.text.pdf.security.PdfPKCS7.getEncodedPKCS7(PdfPKCS7.java:826)
在com.itextpdf.text.pdf.security.MakeSignature.signDetached上(MakeSignature.java:154)
位于dsign.example.com.dsigntest.SignPDF.sign(SignPDF.java:56)
在dsign.example.com.dsigntest.SignPDF.signat(SignPDF.java:91)
位于dsign.example.com.dsigntest.MainActivity.onCreate(MainActivity.java:59)
位于android.app.Activity.performCreate(Activity.java:6237)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
位于android.app.ActivityThread.-wrap11(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

问题的原因是什么?感谢您的帮助。

您正在使用BouncyCastle 1.54版。iTextG 5.5.*需要SpongyCastle版本1.47.0.2(同时iText 5.5.*需要BouncyCastle版本1.49)

推荐的方法是将iTextG添加到Maven/Gradle/。。。配置为依赖项,您的构建工具将自动引入正确版本的SpongyCastle,当前版本为1.47.0.2。不需要手动查找依赖项。依赖项解析是Android上一个已解决的问题

编辑:

有些人显然不使用Maven构建工具(或Gradle),而是手动搜索Jar。如果你这样做,并且盲目地搜索“海绵城堡”,那么你只会发现错误的版本

从iTextG中可以看到:


com.madgag
scprov-jdk15on
1.47.0.2
真的
com.madgag
scpkix-jdk15on
1.47.0.2
真的
...
我重复一遍,这些是iText 5.5的正确依赖项。*:

  • groupId:
    com.madgag
  • artifactId:
    scprov-jdk15on
    scpkix-jdk15on
  • 版本:
    1.47.0.2
对于iText 5.5,这些依赖项是错误的

  • groupId:
    com.madgag.spongycastle
  • artifactId:
    prov
    pkix
  • 版本:
    [1.50,)

如果在确保使用正确版本的SpongyCastle后,您仍然存在问题,则您必须提出新问题。在您的问题中,包括以下信息:

  • 您的iTextG版本
  • 你的海绵城堡版本
  • 您的POM文件或Gradle文件
  • mvn依赖项的输出:tree-Dverbose
  • 复制/粘贴您得到的错误

您使用的是BouncyCastle版本1.54。iTextG 5.5.*需要SpongyCastle版本1.47.0.2(同时iText 5.5.*需要BouncyCastle版本1.49)

推荐的方法是将iTextG作为依赖项添加到Maven/Gradle/…配置中,您的构建工具将自动引入正确版本的SpongyCastle,当前版本为1.47.0.2。无需手动查找依赖项。依赖项解析在Android上已解决

编辑:

有些人显然不使用Maven构建工具(或Gradle),而是手动搜索Jar on。如果你这样做,并且盲目搜索“spongycastle”,那么你只会找到错误的版本

从iTextG中可以看到:


com.madgag
scprov-jdk15on
1.47.0.2
真的
com.madgag
scpkix-jdk15on
1.47.0.2
真的
...
我重复一遍,这些是iText 5.5的正确依赖项。*:

  • groupId:
    com.madgag
  • artifactId:
    scprov-jdk15on
    an
    <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>