JSCEP-错误的第三个参数类型。找到:'org.spongycastle.pkcs.PKCS10CertificationRequest',需要:'org.bouncycastle.pkcs.PKCS10CertificationRequest'

JSCEP-Wrong 3rd argument type. Found: 'org.spongycastle.pkcs.PKCS10CertificationRequest', required: 'org.bouncycastle.pkcs.PKCS10CertificationRequest'

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

以下扩展了 spongycastle。

        PKCS10CertificationRequestBuilder crb = generateCSR(keyPair,entity);

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

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

我收到以下错误。 "Wrong 3rd argument type. Found: 'org.spongycastle.pkcs.PKCS10CertificationRequest', required: 'org.bouncycastle.pkcs.PKCS10CertificationRequest".

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

我的问题是"Should I switch back to BouncyCastle jars?"。 否则 "How can I pass this spongycastle variable?"

My question is "Should I switch back to BouncyCastle jars?". Or else "How can I pass this spongycastle variable?"

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

据我所知,Jscep 使用(真正的)BouncyCastle 而不是 SpongyCastle。

如果我没看错 this old issue,BouncyCastle 3.0 之前的 cut-down 版本 Android 缺少 Jscep 需要的功能。

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

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

    这个 SpongyCastle issue comment 说让 Android 使用真正的 BouncyCastle 功能的技巧是:

    ... call Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME) to remove the built-in BC before calling Security.addProvider(new BouncyCastleProvider()).

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

此外,我找不到 free-standing 替代在 Android 上运行的 Jscep。但是,我确实发现了这个:

这可能会有用。