首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >找不到签名SHA256WITHECDSA实现

找不到签名SHA256WITHECDSA实现
EN

Stack Overflow用户
提问于 2018-03-03 07:33:14
回答 2查看 1.1K关注 0票数 2

我在一个项目上工作,创建一个PKI来获得一个Android的证书申请。

现在我正在使用海绵城堡,它在安卓5和更高版本上工作,但在4.X上它向我展示了这一点:

代码语言:javascript
复制
Signature SHA256WITHECDSA implementation not found
 java.security.NoSuchAlgorithmException: Signature SHA256WITHECDSA implementation not found
     at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
     at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:170)
     at java.security.Signature.getSignatureInstance(Signature.java:178)
     at java.security.Signature.getInstance(Signature.java:146)
     at org.spongycastle.jce.PKCS10CertificationRequest.<init>(PKCS10CertificationRequest.java:363)
     at org.spongycastle.jce.PKCS10CertificationRequest.<init>(PKCS10CertificationRequest.java:248)
     at com.unipagos.app.enrollmentprocess.EnrollmentStep5FragmentActivity.createPKI(EnrollmentStep5FragmentActivity.java:199)
     at com.unipagos.app.enrollmentprocess.EnrollmentStep5FragmentActivity.onPostCreate(EnrollmentStep5FragmentActivity.java:145)
     at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1157)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2075)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
     at android.app.ActivityThread.access$700(ActivityThread.java:134)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
     at android.os.Handler.dispatchMessage(Handler.java:99)
     at android.os.Looper.loop(Looper.java:137)
     at android.app.ActivityThread.main(ActivityThread.java:4867)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:511)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
     at dalvik.system.NativeStart.main(Native Method)

创建证书请求的代码如下:

代码语言:javascript
复制
public String createPKI(String mdnString) {
    try {

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
        //KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC");

        ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("prime256v1");
        keyPairGenerator.initialize(ecGenSpec, new SecureRandom());

        KeyPair kp =  keyPairGenerator.generateKeyPair();

        publicKey = kp.getPublic();
        privateKey = kp.getPrivate();

        PKCS10CertificationRequest kpGen = new PKCS10CertificationRequest("SHA256WITHECDSA", new X509Name(String.format("UID=%s", mdnString)), publicKey, null, privateKey);

        String certRequest = Base64.encodeToString(kpGen.getEncoded(), Base64.DEFAULT);
        certRequest = certRequest.replace("\n", "");

        return certRequest;

    } catch(Exception e) {
        if (Constants.DEBUG) {
            Log.v("Exception", e.getMessage());
        }
        e.printStackTrace();
        return null;
    }
}

我使用的海绵城堡版本是: sc-light-jdk15on-1.47.0.2.jar和scprov-jdk15on-1.47.0.2.jar

对此有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-03 17:57:10

添加SpongyCastle提供程序了吗?

static {Security.addProvider(新org.spongycastle.jce.provider.BouncyCastleProvider());) }

此外,您还必须使用此KeyPairGenerator实例:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC","SC");

为了确保您选择SpongyCastle作为安全提供程序。

票数 0
EN

Stack Overflow用户

发布于 2021-02-19 03:05:28

这是因为默认的弹跳城堡提供商添加了Android操作系统的一部分。它可以使用下面提到的任何一种方法来解决。

方法1

用SpongyCastleProvider替换默认的OS级别Bouncy castle提供程序。

代码语言:javascript
复制
//Remove the existing bouncy castle provider initiated part of the Android OS using it's name.
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
//Add bouncy castle provider from library
Security.addProvider(org.spongycastle.jce.provider.BouncyCastleProvider());

方法2

而且还有另外一个选择。通过添加getInstance()方法的provider实例部分来获取KeyPairGenerator实例,如下所示。

代码语言:javascript
复制
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", new org.spongycastle.jce.provider.BouncyCastleProvider());

Bouncy castle库也是如此。如果你的目标是Android3.0(API11级)以上的应用程序,建议使用BouncyCastle库而不是SpongyCastle作为suggested by SpongyCastle library author,并在org.bouncycastle.jce.provider.BouncyCastleProvider()中遵循上面提到的任何一种方法。在应用gradle中使用以下依赖项来包含bouncy castle库。

代码语言:javascript
复制
// Bouncy castle
implementation "org.bouncycastle:bcprov-jdk15to18:1.68"

请参考以下链接,以获取bouncy castle provider的最新版本。https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15to18

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49078962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档