我正在为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/