2011-06-22 34 views
1

我試圖從Mac OSX 10.6上的Java KeyStore檢索條目。我的代碼運行正常在Windows和Linux,但是當我在OSX上運行它,我得到以下異常:UnsupportedOperationException使用KeyStore.getEntry()時?

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上拋出?這是操作系統上的JVM中的錯誤嗎?有沒有人見過這個?

回答

0

看起來是蘋果JVM實現中的一個bug。我提交了一個錯誤報告。謝謝你的幫助!

0

綜觀KeyStoreSpi.java在管線466執行揭示了以下內容:

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 ...

... 如果給定別名標識的條目是通過調用創建setCertificateEntry,或者創建通過調用setEntryTrustedCertificateEntry

但是該方法是抽象的,因此如果不知道所使用的確切實現方式,就很難深入挖掘。根據你的描述,這些邏輯在實現上似乎略有不同。

相關問題