2017-04-13 8 views
1

SamsumgデバイスでKeyPairを生成しようとしています。5.1.1 KeyStoreでKeyPairGeneratorSpecを使用しています。 APIが23未満であるため、KeyGenParameterSpecではなくKeyPairGeneratorSpecを使用できます。 は、ここに私のコードです:KeyPairGeneratorSpecでKeyPairを生成するAPI <23

Calendar notBefore = Calendar.getInstance(); 
Calendar notAfter = Calendar.getInstance(); 
notAfter.add(Calendar.YEAR, 1); 
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) 
       .setAlias(alias) 
       .setKeySize(2048) 
       .setSubject(new X500Principal(String.format("CN=%s, OU=%s", alias, 
         context.getPackageName()))) 
       .setSerialNumber(BigInteger.ONE) 
       .setStartDate(notBefore.getTime()) 
       .setEndDate(notAfter.getTime()) 
       .build(); 
generator = KeyPairGenerator.getInstance("RSA", ANDROID_KEY_STORE); 
generator.initialize(spec); 

しかし、それは、以下の、この例外がスローされます。あなたの助けてくれてありがとう、私はまだ2日間は結果なしでそれに取り組んでいます!

java.lang.IllegalStateException: Can't generate certificate 
at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:164) 
at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:276) 
at fr.gouv.ants.alicem.crypto.RSAEncryptDecrypt.genRSAKey(RSAEncryptDecrypt.java:172) 
at fr.gouv.ants.alicem.crypto.RSAEncryptDecrypt.<init>(RSAEncryptDecrypt.java:84) 
at fr.gouv.ants.alicem.storage.SafeStorageManager.encryptRSA(SafeStorageManager.java:156) 
at fr.gouv.ants.alicem.storage.SafeStorageManager.toSecureStore(SafeStorageManager.java:67) 
at fr.gouv.ants.alicem.network.crypto.SafeStorageManagerTest.testRsa(SafeStorageManagerTest.java:32) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) 
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1933) 
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:161) 
... 34 more 
+0

で、プロバイダリストの末尾にsecurity.provider.N=org.bouncycastle.jce.provider.BouncyCastleProviderを追加して静的にインストールすることもできます。 – Qwertiy

答えて

1

編集:

私はこの弾む城のドキュメントhereで答えを見つけました。

public ExampleConstructor() 
    { 
     Security.addProvider(new BouncyCastleProvider()); 
    } 

static 
    { 
     Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); 
    } 

からの私のプロバイダのインストールを変更するには、私の問題を修正しました。 $ JAVA_HOME/jre/lib/security/java.security

+0

それは答えではなく、コメントです。 – Qwertiy

+0

@Qwertiy私の更新答えをご覧ください。 – deMouser

関連する問題