Java 使用KeyStore.getEntry()时不支持操作异常?

Java 使用KeyStore.getEntry()时不支持操作异常?,java,security,macos,exception,keystore,Java,Security,Macos,Exception,Keystore,我试图从MacOSX10.6上的Java密钥库中检索条目。我的代码在Windows和Linux上运行良好,但在OSX上运行时,出现以下异常: java.lang.UnsupportedOperationException at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:466) at java.security.KeyStore.getEntry(KeyStore.java:1261) 这是我的密码: S

我试图从MacOSX10.6上的Java密钥库中检索条目。我的代码在Windows和Linux上运行良好,但在OSX上运行时,出现以下异常:

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中的一个bug吗?以前有人见过吗?

在第466行查看keystrespi.java的实现可以发现以下内容:

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

    ...
}
这里有它抛出异常的确切条件

那么engineIsCertificateEntryalias何时返回true

根据法律,它是这样做的

。。。如果给定别名标识的条目是通过调用setCertificateEntry创建的,或者是通过使用TrustedCertificateEntry调用setEntry创建的


然而,该方法是抽象的,因此在不知道所使用的具体实现的情况下,很难进一步挖掘。根据您的描述,不同实现之间的逻辑似乎略有不同。

似乎是苹果公司JVM实现中的一个缺陷。我已经提交了一份bug报告。谢谢你的帮助