2011-06-22 2 views
1

Я пытаюсь получить записи из Java KeyStore на Mac OSX 10.6. Мой код работает отлично на 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 от Apple. Я отправил отчет об ошибке. Спасибо за вашу помощь!

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) return true?

Согласно documentation, он делает это ...

... если запись идентифицируется по данному псевдониму была создана вызовом setCertificateEntry, или создается вызовом setEntry с TrustedCertificateEntry

Метод, однако, является абстрактным, поэтому его трудно выкапывать, не зная, какая именно реализация используется. Согласно вашему описанию, логика, похоже, немного отличается от реализаций.

Смежные вопросы