我正在为Android实现Jscep。最初,我为Java尝试了Jscep,并且运行良好。现在在Android中,我使用SpongyCastle而不是BouncyCastle。现在我的问题是Client类的enroll方法正在使用BouncyCastle。因此,当我尝试传递参数时,海绵堡和充气城堡不适合(很明显)。

以下扩展了海绵堡。

        PKCS10CertificationRequestBuilder crb = generateCSR(keyPair,entity);


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

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


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

我尝试扩展Client,但已声明为final。

我的问题是“我应该切换回BouncyCastle罐子吗?”。
否则,“如何传递这个海绵堡变量?”

最佳答案

我的问题是“我应该切换回BouncyCastle罐子吗?”。否则,“如何传递这个海绵堡变量?”


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

从我所见,Jscep与(真正的)BouncyCastle而非SpongyCastle一起使用。

如果我正确阅读this old issue,则3.0之前的Android中的BouncyCastle的简化版本缺少Jscep所需的功能。


对于3.0之前的Android,它们似乎不是一个可行的解决方案。您不能仅仅告诉Java将这两种类型视为等效。它将破坏JVM / Davlik运行时类型的系统。
根据this StackOverflow Q&A的说法,在3.0版中,Android更改了其简化的BouncyCastle上的Java包名称。这意味着您应该能够将正版BouncyCastle JAR与3.0+ Android应用程序捆绑在一起。这足以使Jscep在该平台上工作。

SpongyCastle issue comment表示让Android使用真实的BouncyCastle功能的诀窍是:


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

从理论上讲,应该可以移植Jscep以使用SpongyCastle,但是没有明确的迹象表明有人成功做到了这一点。 (与以前相比,仅此一个端口的需求正在减少。)


另外,我找不到在Android上可以使用的Jscep的独立替代产品。但是,我确实发现了这一点:


https://github.com/boeboe/be.boeboe.spongycastle/blob/master/src/be/boeboe/spongycastle/jscep/JScepClient.java


这可能很有用。

关于java - JSCEP-错误的第三个参数类型。找到:“org.spongycaSTLe.pkcs.PKCS10CertificationRequest”,必需:“org.bouncycaSTLe.pkcs.PKCS10CertificationRequest”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56544185/

10-11 12:17