相关文章推荐
长情的山羊  ·  Station P1-AndroidTV ...·  1 周前    · 
长情的山羊  ·  S905L(P212)ATV 6.0 ...·  1 周前    · 

未找到SHA256WITHECDSA签名的执行情况

2 人关注

我正在做一个项目,创建一个PKI来获取Android中的证书请求。

现在我正在使用Spongycastle,它在安卓5及以上系统中工作,但在4.X系统中却显示这个。

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)

创建证书请求的代码是这样的。

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;

我使用的spongycastle的版本是这样的。 sc-light-jdk15on-1.47.0.2.jar and scprov-jdk15on-1.47.0.2.jar

对此有什么想法吗?

android
signing
spongycastle
Ranbeuer
Ranbeuer
发布于 2018-03-03
2 个回答
Bibu
Bibu
发布于 2021-02-19
0 人赞同

你是否添加了SpongyCastle供应商?

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

另外,你将不得不使用这个 KeyPairGenerator 实例。

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

要确定你是选择SpongyCastle作为安全供应商。

Mahendran Sakkarai
Mahendran Sakkarai
发布于 2021-02-19
0 人赞同

这是由于安卓系统中添加了默认的充气城堡供应商的部分。可以使用下面提到的任何一种方法来解决这个问题。

Approach 1

用SpongyCastleProvider替换默认的操作系统级别的Bouncy castle provider。

//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());

Approach 2

而且还有一个选项可用。通过添加KeyPairGenerator的提供者实例部分来获得getInstance()的实例,就像下面的方法。

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", new org.spongycastle.jce.provider.BouncyCastleProvider());

蹦蹦跳跳的城堡库也是如此。如果你的目标是Android 3.0以上的应用(API Level 11),建议使用BouncyCastle库而不是SpongyCastle,因为由SpongyCastle图书馆作者建议并按照上面提到的org.bouncycastle.jce.provider.BouncyCastleProvider()中的任何一种方法。在应用程序gradle中使用下面的依赖项,以包括充气城堡库。