3

アプリケーションを拡張するクラスがあります。onCreate() メソッドで、次を呼び出すスレッドを開始します。

KeyFactory.getInstance("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 を初期化します...

getInstance("RSA", "BC") が解決策のように思えますが (理由はわかりませんが)、問題は、BouncyCastle が一部の Android デバイスで見逃される可能性があることです (私の知る限り)。この呼び出しで「BC」を指定しないでください...もう一度、問題があります。

4

1 に答える 1