私はアプリケーションを拡張するクラスを持っています。 onCreate()メソッドでは、私はいくつかのスレッドを起動し、それが呼び出されます:Android。 KeyFactory RSAの実装が見つかりません
通常、それは完璧に動作しますが、私はこのような例外を取得時間(非常にまれ)までの時間から:
W/System.err(24537): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
W/System.err(24537): at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
W/System.err(24537): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
W/System.err(24537): at java.security.KeyFactory.getInstance(KeyFactory.java:81)
それはのように見えるがレース...私のスレッドは "RSA"を呼び出す瞬間にセキュリティシステムが初期化されていないと思う。
これは既知の問題ですか?誰も私にいくつかのヒントを教えてもらえますか?
この問題は4.0.3デバイスで発生します(他のバージョンについてはわかりません)。
詳細:
私はそのようなコードを試してみた:
Provider providers[] = Security.getProviders();
try {
k1 = KeyFactory.getInstance("RSA");
}
catch(Exception e) {
e1 = e;
}
try {
k2 = KeyFactory.getInstance("RSA", "BC");
}
catch(Exception e) {
e2 = e;
}
try {
k3 = KeyFactory.getInstance("RSA");
}
catch(Exception e) {
e3 = e;
}
if(k1 == null || k2 == null || k3 == null) {
if(e1 != null)
e1.printStackTrace();
if(e2 != null)
e2.printStackTrace();
if(e3 != null)
e3.printStackTrace();
}
for(Provider provider : providers) {
System.out.println(provider.getName());
}
そして、これは私が時々得るものです:
k1 is null
k2 is <key>
k3 is null
e1.printStackTrace();
04-20 22:09:33.322: W/System.err(17249): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
04-20 22:09:33.322: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
04-20 22:09:33.322: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
04-20 22:09:33.322: W/System.err(17249): at java.security.KeyFactory.getInstance(KeyFactory.java:81)
...
e2
null
e3.printStackTrace();
04-20 22:10:08.512: W/System.err(17249): java.security.NoSuchAlgorithmException: KeyFactory RSA implementation not found
04-20 22:10:08.532: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
04-20 22:10:08.532: W/System.err(17249): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
04-20 22:10:08.542: W/System.err(17249): at java.security.KeyFactory.getInstance(KeyFactory.java:81)
...
providers
AndroidOpenSSL
DRLCertFactory
BC
Crypto
HarmonyJSSE
MyProvider
ほとんどの時間ながら私はすべてのk1、k2、k3を初期化します...
ke getInstance( "RSA"、 "BC")は解決策ですが(理由はわかりませんが)、BouncyCastleは一部のAndroid搭載機では見逃せます(私が知る限り)。この呼び出しで "BC" ...もう一度、私は問題があります。
、時間からにところで、私は同じデバイス(ASUSのEEEパッド、4.0.3)でこのエラーが出る... RSAは、いくつかのデバイス上で逃したことができるとは思いませんでした私の場合、RSAプロバイダは常にここにいます。 – alex2k8
署名/検証用のRSAをサポートしていても、すべてのプロバイダがRSA鍵の生成および/またはエクスポート/インポートをサポートするわけではありません。 Androidには少なくとも3つのJCEプロバイダがあり、そのうちのBouncyCastleが最も多くのアルゴリズム/メカニズムを持っています。明示的にプロバイダを指定しない場合、 'getInstance()'はそれをサポートするもの(通常はBC)から実装を取得する必要があります。ときどき動作するのであれば、実際にはバグかもしれません。 –
私はプロバイダとそのプロパティをダンプしましたが、RSAをサポートしているのは "BC version 1.46"だけです...セキュリティプロバイダがロードされたとき、すべてのプロバイダがロードされ、使用準備が整うまで待つ方法はありますか? – alex2k8