【问题标题】:Getting NoSuchMethodError at using Spongycastle with iText on Android在 Android 上使用 Spongycastle 和 iText 时出现 NoSuchMethodError
【发布时间】:2016-11-13 16:13:55
【问题描述】:

我试图在 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)

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

【问题讨论】:

  • 在其 pom.xml 中查看 itextg 所需的 SC 版本。它肯定不是 1.54。
  • @AmedeeVanGasse 谢谢,我会尝试更改版本
  • @AmedeeVanGasse 成功了,我使用了来自this 链接的 SC 1.47 版。请在下面复制您的评论作为回答,以便我接受。谢谢。
  • @AmedeeVanGasse 我正面临版本兼容性的新问题。为了使用 CA SpongyCastle 签署证书,需要 1.55 版本,但是,无法使用 iText。我能做什么?
  • 在下面查看我对@leobelizquierdo 的评论。

标签: java android itext


【解决方案1】:

您使用的是 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),而是在 http://search.maven.org 上手动搜索 jar。如果您这样做,并且盲目地搜索“spongycastle”,那么您只会找到错误版本。

正如在 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.*,这些依赖项错误

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

如果在确保您使用了正确版本的 SpongyCastle 后,您仍然遇到问题,那么您必须提出一个新问题。在您的问题中,包括以下信息:

  • 您的 iTextG 版本
  • 您的 SpongyCastle 版本
  • 您的 POM 文件或 Gradle 文件
  • mvn dependency:tree -Dverbose 的输出
  • 复制/粘贴您遇到的错误。

【讨论】:

  • 我仍然面临同样的问题,我正在使用 itextg v5.5.10。 maven 中的最小 spongycastle 版本是 1.50.0,知道吗?
  • 您正在查看错误版本的海绵城堡。从1.50 开始,他们将groupId 重命名为com.madgag.spongycastle。对于1.47.02,您可以在iTextG 中清楚地看到pom.xmlgroupIdcom.madgag,工件是scprov-jdk15onscpkix-jdk15on。我仔细检查了一下,我目前在search.maven.org 上打开了我的浏览器,我可以找到这些工件。如果您仍有问题,请提出一个新问题。
  • 谢谢!你拯救了我的一天。由于某种原因,来自 jcenter 或 maven 的 itextg 的当前版本没有将依赖项添加到 pom.xml 中。我快疯了。将这些 com.madgag 添加到我的 gradle 项目依赖项中就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多