2011-06-22 39 views
1

Mac OSX 10.6のJava KeyStoreからエントリを取得しようとしています。私のコードは、WindowsおよびLinux上で正常に動作が、私はOSX上でそれを実行したときに、私は次の例外を取得:KeyStore.getEntry()を使用しているときにUnsupportedOperationExceptionが発生しましたか?

java.lang.UnsupportedOperationException 
    at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:466) 
    at java.security.KeyStore.getEntry(KeyStore.java:1261) 

は、ここに私のコードです:

String keyStorePath = ... 
PasswordProtection pp = new PasswordProtection("password".toCharArray()); 
CallbackHandlerProtection chp = new CallbackHandlerProtection(
     new CallbackHandler() { 

      @Override 
      public void handle(Callback[] callbacks) 
        throws IOException, UnsupportedCallbackException { 
       for (int i = 0; i < callbacks.length; i++) { 
        if (callbacks[i] instanceof PasswordCallback) { 
         PasswordCallback pc = (PasswordCallback) callbacks[i]; 
         pc.setPassword("password".toCharArray()); 
        } 
       } 
      } 
     }); 

try { 
    KeyStore.Builder kb = Builder.newInstance("JCEKS", null, new File(
      keyStorePath), chp); 
    KeyStore ks = kb.getKeyStore(); 

    Enumeration<String> aliases = ks.aliases(); 
    while (aliases.hasMoreElements()) { 
     String alias = aliases.nextElement(); 
     KeyStore.Entry entry = ks.getEntry(alias, chp); 

    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

この例外は、OSX上でスローされている理由の任意のアイデア?このOSのJVMのバグですか?誰もこれまでこれを見たことがありますか?ライン466でKeyStoreSpi.javaの実装を見てみると

答えて

0

アップルのJVM実装のバグであると思われます。私はバグレポートを提出しました。ご協力いただきありがとうございます!

0

は、次のことを明らかに:

あり
public KeyStore.Entry engineGetEntry(String alias, ...) throws ... { 

    ... 

    if (protParam instanceof KeyStore.PasswordProtection) { 
     if (engineIsCertificateEntry(alias)) { 
      throw new UnsupportedOperationException 
       ("trusted certificate entries are not password-protected"); 
     } else if ... 
    } 

    ... 
} 

あなたはそれが例外をスローしているため、正確な条件を持っています。

したがって、いつengineIsCertificateEntry(alias)がtrueを返しますか?それはそうdocumentationによると

...

指定された別名で識別されるエントリが TrustedCertificateEntrysetEntryへの呼び出しによって setCertificateEntryへの呼び出しによって作成された、または作成された場合

...

この方法は抽象であるため、使用されている正確な実装を知らなくてもそれ以上の掘り起こしはありません。あなたの説明によると、ロジックは実装間で若干異なるようです。

関連する問題