Подпись SHA256WITHECDSA реализации не найдена
Я работаю над проектом, который создает PKI для получения запроса на сертификат в Android.
Прямо сейчас я использую Spongycastle для него, и он работает в Android 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 и scprov-jdk15on-1.47.0.2.jar
¿Есть идеи по этому поводу?
2 ответа
Это причина того, что поставщик надувных замков по умолчанию добавил часть ОС Android. Ее можно решить, используя любой из нижеприведенных подходов.
Подход 1
Замените поставщика Bouncy Castle по умолчанию на уровне ОС на SpongyCastleProvider.
//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
А также доступен еще один вариант. Получать
KeyPairGenerator
экземпляр, добавив часть экземпляра провайдера
getInstance()
ментод, как показано ниже.
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", new org.spongycastle.jce.provider.BouncyCastleProvider());
То же самое работает и с библиотекой Надувного замка. Если вы нацеливаетесь на приложение выше Android 3.0 (уровень API 11), предложите использовать
BouncyCastle
библиотека вместо
SpongyCastle
как было предложено автором библиотеки SpongyCastle, и следуйте любому из упомянутых выше подходов с
org.bouncycastle.jce.provider.BouncyCastleProvider()
. Используйте приведенные ниже зависимости в приложении gradle, чтобы включить библиотеку надувного замка.
// Bouncy castle
implementation "org.bouncycastle:bcprov-jdk15to18:1.68"
Перейдите по ссылкам ниже, чтобы получить последнюю версию поставщика надувных замков. https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15to18
Вы добавили провайдера SpongyCastle?
static {Security.addProvider (новый org.spongycastle.jce.provider.BouncyCastleProvider());) }
Кроме того, вам придется использовать это KeyPairGenerator
пример:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance ("EC", "SC");
Чтобы убедиться, что вы выбираете SpongyCastle в качестве поставщика безопасности.