Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t在API 21中生成密钥对时生成证书异常_Android_Security_Android 5.0 Lollipop_Android Keystore - Fatal编程技术网

Android Can';t在API 21中生成密钥对时生成证书异常

Android Can';t在API 21中生成密钥对时生成证书异常,android,security,android-5.0-lollipop,android-keystore,Android,Security,Android 5.0 Lollipop,Android Keystore,我一直在试图解决这个只有Android棒棒糖(API 21)才会出现的异常。我试图寻找其他解决方案,但唯一相关的是在API

我一直在试图解决这个只有Android棒棒糖(API 21)才会出现的异常。我试图寻找其他解决方案,但唯一相关的是在API<23上使用KeyPairGeneratorSpec生成密钥对,建议的解决方案不起作用

我遗漏了什么吗?谢谢

这是我在最后一行抛出的代码:

Calendar start = Calendar.getInstance();
                    Calendar end = Calendar.getInstance();
                    end.add(Calendar.YEAR, 30);
                    KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(appContext)
                            .setAlias(getSecureSettingsKeyAlias())
                            .setSubject(new X500Principal("CN=" + getSecureSettingsKeyAlias()))
                            .setSerialNumber(BigInteger.TEN)
                            .setStartDate(start.getTime())
                            .setEndDate(end.getTime())
                            .build();
                    KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, AndroidKeyStore);
                    kpg.initialize(spec);
                    kpg.generateKeyPair();
以下是正在发生的例外情况:

Caused by: java.lang.IllegalStateException: Can't generate certificate
   at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:136)
   at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:276)
   at com.sampleid.sampleid_sdk.common.FileSettingsStorage.getKeystore(FileSettingsStorage.java:302)
   at com.sampleid.sampleid_sdk.common.FileSettingsStorage.writeSecureSettings(FileSettingsStorage.java:185) 
   at com.sampleid.sampleid_sdk.common.SettingsImpl.saveSecureSettings(SettingsImpl.java:473) 
   at com.sampleid.sampleid_sdk.common.SettingsImpl.saveSettings(SettingsImpl.java:321) 
   at com.sampleid.sampleid_sdk.sampleIDService.saveSettingsToStorage(sampleIDService.java:102) 
   at com.sampleid.sampleid_sdk.sampleIDService.saveSettings(sampleIDService.java:91) 
   at com.sampleid.sampleid.features.shared.BaseActivity.onStop(BaseActivity.java:182) 
   at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1261) 
   at android.app.Activity.performStop(Activity.java:6089) 
   at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3341) 
   at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3390) 
   at android.app.ActivityThread.access$1100(ActivityThread.java:144) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:135) 
   at android.app.ActivityThread.main(ActivityThread.java:5221) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:372) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by: java.lang.UnsupportedOperationException: private exponent cannot be extracted
   at com.android.org.conscrypt.OpenSSLRSAPrivateKey.getPrivateExponent(OpenSSLRSAPrivateKey.java:161)
   at org.spongycastle.jcajce.provider.asymmetric.rsa.RSAUtil.generatePrivateKeyParameter(RSAUtil.java:63)
   at org.spongycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi.engineInitSign(DigestSignatureSpi.java:95)
   at java.security.Signature$SignatureImpl.engineInitSign(Signature.java:679)
   at java.security.Signature.initSign(Signature.java:330)
   at com.android.org.bouncycastle.x509.X509Util.calculateSignature(X509Util.java:243)
   at com.android.org.bouncycastle.x509.X509V3CertificateGenerator.generate(X509V3CertificateGenerator.java:434)
   at com.android.org.bouncycastle.x509.X509V3CertificateGenerator.generate(X509V3CertificateGenerator.java:412)
   at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:133)
   at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:276) 
   at com.sampleid.sampleid_sdk.common.FileSettingsStorage.getKeystore(FileSettingsStorage.java:302) 
   at com.sampleid.sampleid_sdk.common.FileSettingsStorage.writeSecureSettings(FileSettingsStorage.java:185) 
   at com.sampleid.sampleid_sdk.common.SettingsImpl.saveSecureSettings(SettingsImpl.java:473) 
   at com.sampleid.sampleid_sdk.common.SettingsImpl.saveSettings(SettingsImpl.java:321) 
   at com.sampleid.sampleid_sdk.sampleIDService.saveSettingsToStorage(sampleIDService.java:102) 
   at com.sampleid.sampleid_sdk.sampleIDService.saveSettings(sampleIDService.java:91) 
   at com.sampleid.sampleid.features.shared.BaseActivity.onStop(BaseActivity.java:182) 
   at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1261) 
   at android.app.Activity.performStop(Activity.java:6089) 
   at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3341) 
   at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3390) 
   at android.app.ActivityThread.access$1100(ActivityThread.java:144) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:135) 
   at android.app.ActivityThread.main(ActivityThread.java:5221) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:372) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

终于解决了这个问题。问题在于:

KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, AndroidKeyStore);
KeyProperties.KEY\u ALGORITHM\u RSA
仅在API 23开始时可用,因此在此之前,它在API中失败。将其替换为“RSA”

此外,如果您使用的是SpongyCastle,则应使用以下方法添加它:

static {
        // as per https://github.com/rtyley/spongycastle/issues/27
        Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
    }

你能再解释一下你所指的解决方案吗?