0

我正在为 android 实现 Jscep。最初,我尝试了 Jscep for java,它运行良好。现在在 Android 中,我使用 SpongyCastle 而不是 BouncyCastle。现在我的问题是客户端类的注册方法正在使用 BouncyCastle。因此,当我尝试传递参数时,spongycastle 和 bouncycastle 不合适(显然)。

以下扩展了 spongycastle。

        PKCS10CertificationRequestBuilder crb = generateCSR(keyPair,entity);

我将上面的变量“crb”作为第三个参数传递给注册方法,如下所示。

try {
            response = client.enrol(cert, keyPair.getPrivate(), crb.build(getContentSigner(keyPair)), "MDM-ROOT-CA");
        } 

我收到以下错误。“错误的第三个参数类型。找到:'org.spongycastle.pkcs.PKCS10CertificationRequest',需要:'org.bouncycastle.pkcs.PKCS10CertificationRequest”。

我试图扩展客户端,但它被宣布为最终的。

我的问题是“我应该切换回 BouncyCastle 罐子吗?”。或者“我怎样才能传递这个 spongycastle 变量?”

4

1 回答 1

0

我的问题是“我应该切换回 BouncyCastle 罐子吗?”。或者“我怎样才能传递这个 spongycastle 变量?”

可能两者都不适用于所有 Android 平台

据我所见,Jscep 与(真正的)BouncyCastle 而不是 SpongyCastle 一起工作。

如果我正确阅读了这个老问题,那么在 3.0 之前的 Android 中的精简版 BouncyCastle 缺少 Jscep 需要的功能。

  • 对于 3.0 之前的 Android,它们似乎不是一个实用的解决方案。您不能只告诉 Java 将这两种类型视为等价。它会破坏 JVM / Davlik 运行时类型系统。

  • 根据这个 StackOverflow Q&A,在 3.0 中,Android 在他们缩减的 BouncyCastle 上更改了 Java 包名称。这意味着您应该能够将真正的 BouncyCastle JAR 与 3.0+ Android 应用程序捆绑在一起。这应该足以让 Jscep 在该平台上工作。

    这个SpongyCastle 问题评论说,让 Android 使用真正的 BouncyCastle 功能的诀窍是:

    ...Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)在调用之前调用以删除内置的 BC Security.addProvider(new BouncyCastleProvider())

  • 理论上,应该可以移植 Jscep 以使用 SpongyCastle,但没有明确的迹象表明有人成功地做到了这一点。(鉴于之前的情况,对这样一个端口的需求只会减少。)

此外,我找不到适用于 Android 的 Jscep 的独立替代品。但是,我确实发现了这个:

这可能有用。

于 2019-06-11T13:56:18.370 回答